C# 如何将DataGridView行划分为多个部分?
我得到了一个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
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的整数列,将其
表达式设置为
-SomeValue是子表的列名:求和(child.SomeValue)
- 切换到表单设计器,右键单击父网格,选择添加列,添加一个绑定列连接到我们创建的新总和列。运行应用程序(我还添加了Avg列):
- 如果更改子表中的值,则父表中的值将自动更新
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);
}
}