【问题标题】:No Duplicates in DataGridViewDataGridView 中没有重复项
【发布时间】:2013-04-04 15:21:15
【问题描述】:

我正在使用 C# 在 DataGridView 中显示一些数据,我希望它不允许您添加重复的键。现在,我的 DataGridview 非常简单,只有 2 列。一个称为“Key”,另一个称为“Value”。我想要的是,当用户编辑或向 DataGridView 添加新条目时,它会检查是否已经存在重复项并取消新行的编辑/创建。这是我当前的代码:

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        if (row.Cells[0].Value.Equals(dataGridView1.Rows[e.RowIndex].Cells[0].Value))
        {
            dataGridView1.Rows.Remove(dataGridView1.Rows[e.RowIndex]);
            break;
        }
    }

    refresh();
}

它根本不起作用...有人可以告诉我应该怎么做吗?...谢谢!

编辑:我在 dataGridView1.Rows.Remove() 调用中也遇到了这个错误 -

Operation is not valid because it results in a reentrant call to the  SetCurrentCellAddressCore function.

编辑:

DataGridView 是这样的

Key     | Value 
----------------
blah    | something 
somekey | somevalue

【问题讨论】:

  • 我在避免重复时所做的是:我让用户输入她想要的任何内容。然后,当 Datagrid 失去焦点或单击验证按钮时,我会删除重复的行。我做了一个小程序来删除重复的行,但它会检查行中所有单元格中的值:programacionamartillazos.blogspot.com/2012/03/…

标签: c# datagridview rows multiple-columns cells


【解决方案1】:

这可能是您的foreach 循环,它不允许删除行。

试试这样的:

private void dgv_CellEndEdit(object sender, DataGridViewCellEventArgs e) {
  for (int i = 0; i < DataGridView1.Rows.Count; i++) {
    DataGridViewRow row = DataGridView1.Rows[i];
    if (row.Cells[0].Value == DataGridView1.Rows[e.RowIndex].Cells[0].Value) {
      DataGridView1.Rows.RemoveAt(e.RowIndex);
      DataGridView1.FirstDisplayedScrollingRowIndex = i;
      return;
    }
  }
}

不过,我不允许行编辑,所以我可能是错的。

编辑:只是快速编辑。我将FirstDisplayedScrollingRowIndex 设置为e.RowIndex,但该行将被删除!

【讨论】:

  • 仍然遇到同样的问题:/。它会删除我编辑的任何行,无论是否有重复。有时我会在最新编辑中遇到那个错误..
  • 老鼠。我还注意到我在刚刚删除该行之后设置了FirstDisplayedScrollingRowIndex = e.RowIndex,所以我更新了代码。不过,我认为这不会改变你的最终结果。
【解决方案2】:

我只是在猜测,但我已经尝试了您的代码,并且发现了一个逻辑错误: 如果你调试它,你会发现在 foreach 循环中你必须点击你刚刚编辑的元素,这显然等于它自己。

我建议你把循环改成for或者检查行索引是否相同。

【讨论】:

    【解决方案3】:

    尝试使用此代码,

    protected void GV_RowCommand(object sender, GridViewCommandEventArgs e)
    {
         DataTable dt1 = ViewState["dt"] as DataTable;
         if (e.CommandName == "Add")
         {
    DataRow dr;
              dr = dt1.NewRow();
    dr["DED_Id"] = Material_Id;
              dr["DED_Name"] = Material;
              dt1.Rows.Add(dr);
              dt1.AcceptChanges();
              ViewState["dt"] = dt1;
         }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-23
      • 2012-05-04
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      相关资源
      最近更新 更多