Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将DataGridView行划分为多个部分?_C#_Winforms_Datagridview - Fatal编程技术网

C# 如何将DataGridView行划分为多个部分?

C# 如何将DataGridView行划分为多个部分?,c#,winforms,datagridview,C#,Winforms,Datagridview,我得到了一个datagridview,如下表所示 Date Value 2020-10-05 13:42:27 ET 1 2020-10-05 13:42:28 ET 3 2020-10-05 13:42:29 ET 4 2020-10-05 13:42:30 ET 6 2020-10-05 13:42:31 ET 7 2020-10-05 13:42:32 ET 8 2020-10-06

我得到了一个datagridview,如下表所示

Date                        Value
2020-10-05 13:42:27 ET      1
2020-10-05 13:42:28 ET      3
2020-10-05 13:42:29 ET      4
2020-10-05 13:42:30 ET      6
2020-10-05 13:42:31 ET      7
2020-10-05 13:42:32 ET      8
2020-10-06 13:55:33 ET      8
2020-10-06 13:55:35 ET      10
2020-10-06 13:55:5 ET       55
2020-10-06 13:55:10 ET      55
2020-10-06 13:55:20 ET      22
2020-10-06 13:55:4 ET       44
2020-10-06 13:55:8 ET       43
2020-10-07 ...              ...

我想把这个表改成这样。它只显示了几个列,列上有日期和值摘要,当你点击这些行时,它会显示更多的行

是否必须将datagridview更改为其他控件?或者必须使用行上可见的单击事件处理程序?

  • 将新数据集添加到项目中:

  • 打开它。右键单击曲面,添加一个datatable,称之为DateGroups。添加另一个名为“数据”。在每个表上单击鼠标右键,添加一个名为DateGroup的列,并在右侧的网格中将类型设置为DateTime。在数据中添加更多列,以保存准确的日期和值等。您应该具备:

  • 单击DateGroups中DateGroup左侧的灰色边距,将整行变为蓝色(不仅仅是单词DateGroup),然后拖动该行并将其放到数据中的DateGroup上。此时会出现“创建关系”对话框。检查DateGroups是否为父级,以及要关联的两列是否为DateGroup:

  • 现在应该显示一条关系线。在父表日期组行上单击鼠标右键,然后选择“设置主键”。一个键也应该显示:

  • 切换到窗体设计器并转到“查看”菜单>>其他窗口>>数据源,以显示“数据源”面板,其中应包含表示数据集的节点。展开所有节点。请注意,对于数据,有两种方法:

  • 顶层一(红线)是独立的,日期组下的一个将自动过滤(它是关系型的:

  • 将DateGroups节点拖到窗体上。将子(黄色)数据节点拖到窗体上:

  • 出现一些内容。您可以删除bindingnavigator,但保留其他内容。有两个datagridview,每个都绑定到一个bindingsource。两个bindingsource是数据关联的地方;子(数据)bindingsource绑定到父(日期组)的关系bindingsource。现在我们需要向这些bindingsources所连接的表中添加一些数据

  • 切换到代码视图,在表中放入一些内容。我通过解析您发布的值来实现这一点,以向您展示它的工作原理,但您应该按照现有数据进入网格的方式来实现:

  • 就是这样。只需运行程序,单击左侧网格中的一行,即可将右侧网格过滤为天:

  • 您可以让父级执行诸如求和和和平均子行值之类的操作。再次打开数据集,向父级添加一个名为SumChildValues的整数列,将其
    表达式设置为
    求和(child.SomeValue)
    -SomeValue是子表的列名:

  • 切换到表单设计器,右键单击父网格,选择添加列,添加一个绑定列连接到我们创建的新总和列。运行应用程序(我还添加了Avg列):

  • 如果更改子表中的值,则父表中的值将自动更新

如果您想在一个网格中执行此操作,您可能需要一个自定义控件;datagridview可能会被滥用来执行此操作,但无论如何您都会有效地实现一个自定义控件。或者,您可以使用一对dgv和相关的数据绑定场景,其中单击一个dgv过滤另一个。如果您需要,请这样说,我会告诉您如何设置我想要它,你能告诉我如何过滤和设置它吗?
string raw = @"2020-10-05 13:42:27 ET      1
2020-10-05 13:42:28 ET      3
2020-10-05 13:42:29 ET      4
2020-10-05 13:42:30 ET      6
2020-10-05 13:42:31 ET      7
2020-10-05 13:42:32 ET      8
2020-10-06 13:55:33 ET      8
2020-10-06 13:55:35 ET      10
2020-10-06 13:55:5 ET       55
2020-10-06 13:55:10 ET      55
2020-10-06 13:55:20 ET      22
2020-10-06 13:55:4 ET       44
2020-10-06 13:55:8 ET       43";

            foreach (var line in raw.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
            {
                var bits = line.Split();
                var d = DateTime.ParseExact(bits[0] + bits[1], "yyyy-MM-ddHH:mm:s", null);
                var v = int.Parse(bits.Last());

                var day = d.Date;//cut the time off, this gives our "by days

                //try to find the parent Row for this date
                var parentRow = dataSet1.DateGroups.FindByDateGroup(day);

                //if it's not found, create a new one
                if(parentRow == null)
                    parentRow = dataSet1.DateGroups.AddDateGroupsRow(day); //add the parent so next time it will find

                //add the child row related to this parent
                dataSet1.Data.AddDataRow(parentRow, d, v);
            }

        }