0

我在这里和其他网站上看到了几篇与我的问题/问题类似的帖子,但从未真正看到任何直接针对目标并给出好的答案的帖子(如果我在搜索中遗漏了一个,请指出它! )。如果这很长,请原谅我,但我想尽可能完整/准确地描述......提前感谢您的帮助!

我有一个带有并排 datagridviews (dgdApplications & dgdEligibleFiles) 的 Windows 窗体。dgdApplications 设置为 FullRowSelect 和验证 (CausesVailidation = true)。dgdEligibleFiles 包含一个文件列表和文件信息,以及一个复选框列 - 如果选中了一行,它所代表的文件将“分配”给 dgdApplications 中的选定行(dgdApplications 中的行/应用程序可能分配有许多文件) . 如果用户更改了他在 dgdEligibleFiles 中的分配(选中/未选中的一行/多行)而没有单击表单底部的保存按钮,然后单击 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 回答