【问题标题】:Two different datagridview rows getting selected when one should be selected当应该选择一个时,两个不同的 datagridview 行被选中
【发布时间】: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。您需要为每个数据网格提供单独的数据源。
  • 感谢你们为我指明了正确的方向。问题解决了。

标签: c# winforms


【解决方案1】:

显然AllGroupName 类的每个对象都有一个布尔属性Select

您创建 Column[0] 时,只要此布尔值为真,就会选中复选框,反之亦然:每当操作员选中此复选框时,相应的 AllGroupName.Select 就会变为真。

您决定在两个 DataGridView 中使用相同的 DataSource 作为对象。

  • 操作员检查 Dgv1 中第 [4] 行的复选框
  • 这意味着DataSource[4].Select = true;
  • 这意味着所有具有此 DataSource 的对象都将收到通知 [4] 已更改
  • Dgv1 和 Dgv2 中的行 [4] 将被更新:复选框已选中。

如果您不希望 Dgv1 中的更改反映在 Dgv2 中,那么您应该制作数据源的副本。

List<...> data1 = ...;                      // shouldn't this be an BindingList<...> ?
Dgv1.DataSource = data1;  
List<...> data2 = new List<...>(data1);     // clone data1
Dgv2.DataSource = data2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多