0

ここや他のサイトで私の質問/問題に似た投稿をいくつか見たことがありますが、直接的に的を射たものや適切な回答を実際に見たことはありません (検索で見逃した場合は、それを指摘してください! )。これが長い場合はご容赦ください。しかし、できる限り完全で正確な説明をしたいと思います。ご協力をよろしくお願いします!!

サイドバイサイドのデータグリッドビュー (dgdApplications & dgdEligibleFiles) を備えた Windows フォームがあります。dgdApplications は、FullRowSelect および検証用に設定されています (CausesVailidation = true)。dgdEligibleFiles には、ファイルとファイル情報のリスト、およびチェックボックス列が含まれます。行がチェックされている場合、その行が表すファイルは、dgdApplications で選択された行に「割り当て」られます (dgdApplications の行/アプリケーションには、多くのファイルが割り当てられている場合があります)。 . ユーザーがフォーム下部の [保存] ボタンをクリックせずに dgdEligibleFiles (1 つまたは複数の行のチェック/チェック解除) の割り当てを変更し、dgdApplications の別の行をクリックした場合、私は現在 dgdApplications_RowValidating を使用してメッセージ ボックスをポップし、ユーザーが望んでいることを確認します。変更を保存せずに、新しく選択したアプリケーション/行に進みます。「いいえ」ボタンがクリックされた場合は、e を呼び出します。元の行にとどまるにはキャンセルします。「はい」の場合、新しい行で dgdApplications_MouseClick を続行します。これにより、dgdEligibleFiles のチェックボックスがオフになり、dgdApplications で新しく選択されたアプリのファイルのリストが取得され、基になるファイルでチェック/選択された値が更新されます。 dgdEligibleFiles にバインドされたリスト (dgdEligibleFiles.Refresh() が続きます)。

私の問題: メッセージ ボックスが dgdApplications.RowValidating に表示され、ユーザーが [はい] を選択して続行すると (dgdEligibleFiles の変更を破棄し、dgdApplications の新しい行に移動します)、dgdApplications_MouseClick が実行されず、dgdEligbleFiles で何も変更されません。dgdApplications_MouseClick を実行するにはどうすればよいですか?

void dgdApplications_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
{
    if (assgnmtChgd && (MessageBox.Show("You will lose unsaved changes - continue?", "", MessageBoxButtons.YesNo) == DialogResult.No))
    {
        e.Cancel = true;
        return;
    }
}

/// <summary>
/// Handles the selection of an application when it's datagridview row is clicked
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dgdApplications_MouseClick(object sender, MouseEventArgs e)
{
    // Reset the DisplayAssignedOnly checkbox so all dgdEligibleFiles rows will be unhidden and displayed
    chkDispAssgndOnly.CheckState = CheckState.Unchecked;
    ClearFilesGrid();

    dgdApplications.CurrentRow.Selected = true;
    currentAppRowID = dgdApplications.CurrentRow.Index;
    currentAppRecID = (int)dgdApplications.CurrentRow.Cells["appIDColumn"].Value;
    dgdEligibleFiles.ClearSelection();
    dgdEligibleFiles.CurrentCell = null;
    MatchAssignedFiles(currentAppRecID);

    dgdEligibleFiles.Refresh();

    //Set the indicator showing that no assignments have been changed
    assgnmtChgd = false;
}
4

1 に答える 1

0

間違いは、RowValidating の前にクリック イベントが発生するため、cellleave のような別のイベントでプロセスを実行する必要があることです。

private void dataGridView1_CellLeave(object sender, 
    DataGridViewCellEventArgs e)
{
//you can access to index column and row to do your process
    dataGridView1[e.ColumnIndex, e.RowIndex].Style
        .SelectionBackColor = Color.Empty;
}
于 2012-08-18T00:50:57.390 に答える