3

我正在使用 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
4

3 回答 3

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;
    }
  }
}

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

编辑:只是一个快速的编辑。我将设置FirstDisplayedScrollingRowIndexe.RowIndex,但该行将被删除!

于 2013-04-04T15:29:29.243 回答
0

我只是在猜测,但我已经尝试了您的代码并且我看到了一个逻辑错误:如果您调试它,您会看到使用 foreach 循环您将需要点击您刚刚编辑的元素,这显然等于本身。

我建议您将循环更改为 for 或检查行索引是否相同。

于 2013-04-04T15:59:44.240 回答
0

尝试使用此代码,

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;
     }
}
于 2013-10-24T05:12:06.677 回答