5

データベーステーブルにバインドされたDataGridViewを表示するWinformsアプリに取り組んでいます。

そこに新しいエントリを挿入することができ、いくつかのデータ検証を行います。

必要な列が空白のままになっている場合、または一意の制約の1つに違反している場合、DataErrorイベントは次の関数を呼び出します。

protected void _data_error(object sender, DataGridViewDataErrorEventArgs e)
{
    MessageBox.Show(this,e.Exception.Message,"Error");
    e.ThrowException = false;
    e.Cancel = false;
}

ポップアップを閉じると、編集されていた新しい行が削除されます。
すでに保存されている行に対してこれを行うと(更新操作)、行は変更を失い、フォーカスを失います。これは、行を編集可能に保つようにアプリケーションに通知する必要があることを意味すると思いますが、その方法がわかりません。

逆説的ですが、イベントハンドラーを例外に置き換えるとthrow(e.Exception)、例外が風に投げられ、キャッチされていない例外ハンドラーによって取得されますが、そのウィンドウが閉じた後も新しい行は保持されます。

DataErrorイベントで新しい行を保持するにはどうすればよいですか?

編集:

私の次の考えは、メッセージボックスがポップアップした後、行を保存してDataGridViewのデータソースに追加することでした。データソースにデータを追加すると、データが無効なために例外をスローするコミットされた行として追加されるのに対し、検証が行われないようにデータを編集可能な行として保持するため、これは機能しません。

4

2 に答える 2

8

数日かかりましたが、これが私がそれを修正した方法ですが、私はまだより良い方法を開いています。

DataGridView.RowValidatingイベントで、各セルの内容を検証します。無効な場合は、次のようにします。

Grid.Rows[e.RowIndex].ErrorText = "Concisely describe the error and how to fix it";
e.Cancel = true;

そして、イベントハンドラーを介した次のトリップでエラーテキストをクリアするようにしてください。

ユーザーが無効なタイプのデータ(たとえば、数値のみの列にテキストを入力する場合)の場合、DataGridView.DataErrorイベントでエラーを処理する必要があります。同じコードを使用します。

Grid.Rows[e.RowIndex].ErrorText...

ただし、行検証イベントがErrorTextを処理するため、ErrorTextをクリアする必要はありません。

注:これでは、ユーザーに何が問題なのかを通知するポップアップを表示できません。DataGridViewエラーが使用されます。これは、入力したErrorTextを表示するマウスオーバーテキストがあるグリッドの左側にある赤い感嘆符です。ポップアップがあるときはいつでもMessageBox、編集可能なデータへのフォーカスを失い、行を失うことになります。

于 2012-11-26T21:11:51.240 に答える
4

MSDNから

private void DataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs anError)
{
MessageBox.Show(anError.RowIndex + " " + anError.ColumnIndex);
MessageBox.Show("Error happened " + anError.Context.ToString());

if (anError.Context == DataGridViewDataErrorContexts.Commit)
{
    MessageBox.Show("Commit error");
}
if (anError.Context == DataGridViewDataErrorContexts.CurrentCellChange)
{
    MessageBox.Show("Cell change");
}
if (anError.Context == DataGridViewDataErrorContexts.Parsing)
{
    MessageBox.Show("parsing error");
}
if (anError.Context == DataGridViewDataErrorContexts.LeaveControl)
{
    MessageBox.Show("leave control error");
}

if ((anError.Exception) is ConstraintException)
{
    DataGridView view = (DataGridView)sender;
    view.Rows[anError.RowIndex].ErrorText = "an error";
    view.Rows[anError.RowIndex].Cells[anError.ColumnIndex].ErrorText = "an error";

    anError.ThrowException = false;
}
}
于 2014-04-01T09:45:34.320 に答える