3

DataGridView にいくつかのデータを表示する C# で作業していますが、重複したキーを追加できないようにしたいと思います。1つは「キー」と呼ばれ、もう1つは「値」と呼ばれます。私が欲しいのは、ユーザーが 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 に答える