C# 当用户更改为新值时验证DataGridViewComboxCell

C# 当用户更改为新值时验证DataGridViewComboxCell,c#,winforms,validation,datagridview,C#,Winforms,Validation,Datagridview,我们在DataGridView中有一列,用户可以从组合框中为该列选择一个值(DataGridViewComboxColumn)。我们有一些用于选择的验证逻辑(覆盖oncellvalizing) 令人恼火的是,在对该单元格进行验证之前,用户必须在组合框中进行下拉选择后单击其他位置。我已尝试在选定索引更改后立即提交编辑(请参见下文),但在单元格失去焦点之前,验证仍不会启动。我还尝试使用EndEdit()而不是committedit() 是否有一种方法可以让用户在组合框中选择一个项目后立即启动验证

我们在DataGridView中有一列,用户可以从组合框中为该列选择一个值(
DataGridViewComboxColumn
)。我们有一些用于选择的验证逻辑(覆盖
oncellvalizing

令人恼火的是,在对该单元格进行验证之前,用户必须在组合框中进行下拉选择后单击其他位置。我已尝试在选定索引更改后立即提交编辑(请参见下文),但在单元格失去焦点之前,验证仍不会启动。我还尝试使用
EndEdit()
而不是
committedit()

是否有一种方法可以让用户在组合框中选择一个项目后立即启动验证

    protected override void OnEditingControlShowing(DataGridViewEditingControlShowingEventArgs e)
    {
        // Validate selection as soon as user clicks combo box item.
        ComboBox combo = e.Control as ComboBox;
        if (combo != null)
        {
            combo.SelectedIndexChanged -= combo_SelectedIndexChanged;
            combo.SelectedIndexChanged += new EventHandler(combo_SelectedIndexChanged);
        }

        base.OnEditingControlShowing(e);
    }

    void combo_SelectedIndexChanged(object sender, EventArgs e)
    {
        this.NotifyCurrentCellDirty(true);
        this.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }

    protected override void OnCellValidating(DataGridViewCellValidatingEventArgs e)
    {
        // (our validation logic) ...
    }

可以模拟tab键以强制单元格失去焦点:

    private void combo_SelectedIndexChanged(object sender, EventArgs e)
    {
        //I expect to get the validation to fire as soon as the user 
        //selects an item in the combo box but the validation 
        //is not firing until the cell loses focus
        //simulate tab key to force the cell to lose focus
        SendKeys.Send("{TAB}");
        SendKeys.Send("+{TAB}");
    }

您想要做的事情有点违反UI验证准则。验证通常在您离开行时发生。这样,您可以在一个“事务”中提交多个更改。如果需要立即验证,请创建一个数据表单,并在其中进行所有自定义验证;只有组合框和相关项目。不仅要单击组合框中的项目,还要单击“关闭”单元格以验证输入,这感觉很奇怪。当用户做出选择时可能会感到惊讶,没有错误,然后单击其他组合框的行,然后被拒绝。如果我们可以在用户单击某个项目时提交并结束编辑,那么为什么不验证它与此外观的一致性呢?
只有组合框和相关项目
请解释这一部分。我们不使用DGV编辑数据表中的行;它更多地用于显示项目列表(DGV中的一列),用户可以为其设置属性(DGV中的另一列)。因此,DGV具有类似“Foo”“Foo Type”的列,其中“Foo Type”是一个组合框。在本演示文稿中,您可以看到为什么“基于行”的编辑要求您选择Foo类型,然后单击其他地方进行验证,这感觉很奇怪。“Foo类型”的有效性取决于什么?如果是“Foo”,那么它与常规的基于行的编辑没有什么不同。一旦您更改了“Foo类型”,并且它与“Foo”不对应,您可以决定更改“Foo”作为下一步。而且不一定总是相反。你不需要在完成之前对你大喊大叫。是关于我刚才说的那些指导方针。除非我误解了你的意图。在这种情况下,请进一步详细说明。最好是尽可能接近主题地概述您的需求。如果可以,请不要抽象“Foo”。如何将此事件处理程序订阅到
DataGridViewComboxCell
DataGridViewComboxCell
?处理DataGridView的
EditingControlShowing
事件。这只会导致它在获得后立即失去焦点,对吗?无论如何,有一个非常简单的解决方案。