【发布时间】:2020-11-23 13:17:28
【问题描述】:
我正在使用 winform 项目。我有两个具有相同列数和相同结构的datagridview。第一列是复选框列。
这里是绑定两个具有相同类型数据的数据网格的代码。
List<AllGroupNames> grpDtl = GetAllGroups(Nodes);
List<AllGroupNames> grpDtl1 = GetAllGroups(Nodes); //grpDtl.GetRange(0, grpDtl.Count);
//bind two grid with all groups name
if (_grpDtl != null && _grpDtl.Count > 0)
{
dgSingleGroups.AutoGenerateColumns = false;
dgSingleGroups.DataSource = grpDtl;
dgSingleGroups.Columns[0].DataPropertyName = "Select";
dgSingleGroups.Columns[1].DataPropertyName = "GroupName";
dgSingleGroups.Columns[1].ReadOnly = true;
dgSingleGroups.Columns[0].Width = 47;
dgSingleGroups.Columns[1].Width = 346;
dgAllGroups.AutoGenerateColumns = false;
dgAllGroups.DataSource = grpDtl1;
dgAllGroups.Columns[0].DataPropertyName = "Select";
dgAllGroups.Columns[1].DataPropertyName = "GroupName";
dgAllGroups.Columns[1].ReadOnly = true;
dgAllGroups.Columns[0].Width = 47;
dgAllGroups.Columns[1].Width = 346;
}
grpDtl1 = null;
grpDtl = null;
_grpDtl = null;
GetAllGroups() 在树视图节点集合中迭代并累积节点名称。
private List<AllGroupNames> GetAllGroups(TreeNodeCollection tnCollection)
{
//accumulate group name in recursive fashion
foreach (TreeNode tn in tnCollection)
{
if (tn.Tag != null)
{
if (((object)tn.Tag).GetType().ToString().Contains("TunerDetails"))
{
_grpDtl.Add(new AllGroupNames { Select = false, GroupName = tn.Text });
}
GetAllGroups(tn.Nodes);
}
}
return _grpDtl;
}
现在的问题是,当我选中第二个网格复选框时,我的第一个网格复选框被不可见地选中,这意味着当我在循环中读取第一个网格的第一列值时,我得到的复选框值为 true。因为我没有检查我的第一个网格的任何复选框。
当我选择第二个网格的任何一行时,同一行会在第一个网格中自动选择。
我只从右侧网格中选择一行,左侧网格的同一行自动被选中....这对我来说是个问题。为什么两个网格会自动同步。附上屏幕截图。
为什么会发生我无法捕捉到原因。请帮助我更改代码以解决此问题。
【问题讨论】:
-
从你现在声明它的地方删除
_grpDtl,并让GetAllGroups()在被调用时返回一个新的AllGroupNames集合。 -
您将两个数据网格绑定到同一个 DataSource 对象,因此当您在一个 DataGrid 中进行更改时,该更改将反映在 DataSource 中,该 DataSource 也附加到另一个 DataGrid。您需要为每个数据网格提供单独的数据源。
-
感谢你们为我指明了正确的方向。问题解决了。