【问题标题】:"SelectedIndexChanged" event in ComboBoxColumn on DatagridviewDatagridview 上 ComboBoxColumn 中的“SelectedIndexChanged”事件
【发布时间】:2010-08-04 13:19:16
【问题描述】:

我想在 DataGridViewComboBoxColumn 上处理此事件“SelectedIndexChanged”, 我将它设置在 gridview 的“EditingControlShowing”事件上。

问题: 第一次尝试从组合框中选择项目时不会触发“SelectedIndexChanged”事件,但在第二次选择该项目后会触发该事件并且一切正常!

代码如下:

private void dgvRequest_EditingControlShowing(object sender,
     DataGridViewEditingControlShowingEventArgs e)
{
    ComboBox combo = e.Control as ComboBox;

    if (combo != null)
    {
        if (dgvRequest.CurrentCell.ColumnIndex == col_ConfirmCmb.Index)
        {
            combo.SelectedIndexChanged -= combo_ConfirmSelectionChange;
            combo.SelectedIndexChanged += combo_ConfirmSelectionChange;

            return;
        }
    }
}


void combo_ConfirmSelectionChange(object sender, EventArgs e)
{
    if (dgvRequest.CurrentCell.ColumnIndex != col_ConfirmCmb.Index) return;

    ComboBox combo = sender as ComboBox;
    if (combo == null) return;

    MessageBox.Show(combo.SelectedText);// returns Null for the first time
}

【问题讨论】:

    标签: c# .net winforms datagridview


    【解决方案1】:

    事情变得复杂,因为他们优化了 DataGridView,只为所有行设置了一个编辑控件。以下是我处理类似情况的方法:

    首先将委托连接到 EditControlShowing 事件:

    myGrid.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(
                                        Grid_EditingControlShowing);
    ...
    

    然后在处理程序中,连接到 EditControl 的 SelectedValueChanged 事件:

    void Grid_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        ComboBox combo = e.Control as ComboBox;
        if (combo != null)
        {
            // the event to handle combo changes
            EventHandler comboDelegate = new EventHandler(
                (cbSender, args) =>
                {
                    DoSomeStuff();
                });
    
            // register the event with the editing control
            combo.SelectedValueChanged += comboDelegate;
    
            // since we don't want to add this event multiple times, when the 
            // editing control is hidden, we must remove the handler we added.
            EventHandler visibilityDelegate = null;
            visibilityDelegate = new EventHandler(
                (visSender, args) =>
                {
                    // remove the handlers when the editing control is
                    // no longer visible.
                    if ((visSender as Control).Visible == false)
                    {
                        combo.SelectedValueChanged -= comboDelegate;
                        visSender.VisibleChanged -= visibilityDelegate;
                    }
                });
    
            (sender as DataGridView).EditingControl.VisibleChanged += 
               visibilityDelegate;
    
        }
    }
    

    【讨论】:

    • 不错的片段。它帮助了我。
    • 当您在第二个 Lambda 表达式中编写 visSender 时,这是如何定义的?因为这不能在运行时定义而不做一些更人为的编码?非常感谢...
    • EventHandler委托的定义是(object sender, EventArgs e)。 visSender 是触发 EditingControl.VisibleChanged 事件的对象。在这种情况下,lambda 期望它是触发可见性更改的编辑控件。这能回答你的问题吗?
    • 是的,我认为是的。我现在已经解决了这个问题,但方式不同。如果您有兴趣,这里会解释该方法 stackoverflow.com/questions/7193910/…>。一切顺利。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 2015-11-08
    • 2014-10-10
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    相关资源
    最近更新 更多