1

Windowsフォームをロードする次のコードがあります。

    private void Panou_Load(object sender, EventArgs e)
    {
        List<string>[] list;

        list = Conexiune.Select();
        dataGridView1.Rows.Clear();

        (dataGridView1.Columns[3] as DataGridViewComboBoxColumn).DataSource = new List<string> { "", "activ", "inactiv", "neverificat", "blocat" };

        for (int i = 0; i < list[0].Count; i++)
        {
            int number = dataGridView1.Rows.Add();
            dataGridView1.Rows[number].Cells[0].Value = list[0][i];
            dataGridView1.Rows[number].Cells[1].Value = list[1][i];
            dataGridView1.Rows[number].Cells[2].Value = list[2][i];
            dataGridView1.Rows[number].Cells[3].Value = list[3][i];
            dataGridView1.Rows[number].Cells[4].Value = list[4][i];
            dataGridView1.Rows[number].Cells[5].Value = list[5][i];
            dataGridView1.Rows[number].Cells[6].Value = list[6][i];
        }
    }

すべてが正常に機能しますが、行を削除するときにデータベースを更新したいので、dataGridView1_RowsRemovedを使用します。

例:

private void dataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
{
    MessageBox.Show("deleted");
}
  1. フォームの読み込み時に「削除されました」というメッセージが表示されるのはなぜですか?

  2. dataGridView1.Rows[number].Cells[0].ValueデータベースからのIDが含まれています。dataGridView1_RowsRemoved関数でこの ID を取得するにはどうすればよいですか?

4

1 に答える 1

2

データ ソース (リスト) への実際のバインドはDataGridView、フォーム ロード イベントの後に発生するため、データ バインドのプロセスで発生するとは予想されない多くのイベントが発生します。

その理由はわかりません-コードまたはDataGridViewコンポーネント自体を掘り下げる必要がありますが、幸いなことに回避策があります-イベントのイベントハンドラー中にそのようなすべてのイベントを添付しますDataBindingComplete

void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    dataGridView1.RowsRemoved += new DataGridViewRowsRemovedEventHandler(dataGridView1_RowsRemoved);        
}

そうすればRowsRemoved、フォームの読み込み時に発生することはありません。


あなたの場合はさらに良いことに、質問の 2 番目の部分への回答には、別のイベントを使用することが含まれDataBindingCompleteます。

問題RowsRemovedは、行が削除された後に発生することです。そのため、イベント引数から行の (古い) インデックスを持っていても、データにアクセスするのは非常に難しいです (おそらく不可能ですか?)

修正は、代わりにUserDeletingRowイベントを処理することです。

void dataGridView1_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
{
    var msg = e.Row.Cells[0].Value.ToString();

    MessageBox.Show(msg);
} 

このイベントは、削除される行ごとに 1 回発生します。おそらく、これらのイベントを集約してから、RowsRemovedハンドラー内から 1 つのデータベース アクションを実行するのが理にかなっています。

于 2013-11-13T23:00:42.847 に答える