如何处理ComboBox的SelectedIndexChanged事件?

5

我有一个包含两个ComboBox列的DataGridView

第二个ComboBox将根据第一个ComboBox中选择的值填充数据。

如何处理第一个ComboBoxSelectedIndexChanged事件。

3个回答

14

如果我使用 EditingControlShowing 事件,那么即使用户选择组合框但不改变选择,cb_SelectedIndexChanged 也会触发多次。

这对我有用:

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == comboboxColumn.Index && e.RowIndex >= 0) //check if combobox column
    {
        object selectedValue = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
    }
}

//changes must be committed as soon as the user changes the drop down box
private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    if (dataGridView1.IsCurrentCellDirty)
    {
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}

1
这是最好的答案。我唯一的建议是过载发送器并使用它,在示例中减少状态。不过,这是一个很棒的例子,非常感谢。 - Luke Dupin
1
这对我来说是最好的解决方案。稍微调整一下以限制所选单元格,您就可以更轻松地解决问题。与上面的第一个代码不同。 - Mandz

11

DataGridView相关问题的好资源可以在这里找到:

http://www.windowsclient.net/Samples/Go%20To%20Market/DataGridView/DataGridView%20FAQ.doc

以下是如何处理选择改变事件的方法:

如何处理SelectedIndexChanged事件?

有时候,了解用户何时在ComboBox编辑控件中选择了一项会很有帮助。对于窗体上的ComboBox,通常会处理SelectedIndexChanged事件。对于DataGridViewComboBox,您可以使用DataGridView.EditingControlShowing事件来实现相同的功能。以下代码示例演示了如何做到这一点。请注意,该示例还演示了如何防止多个SelectedIndexChanged事件触发。

private void dataGridView1_EditingControlShowing(object sender, 
    DataGridViewEditingControlShowingEventArgs e)
{
    ComboBox cb = e.Control as ComboBox;
    if (cb != null)
    {
        // first remove event handler to keep from attaching multiple:
        cb.SelectedIndexChanged -= new
        EventHandler(cb_SelectedIndexChanged);

        // now attach the event handler
        cb.SelectedIndexChanged += new 
        EventHandler(cb_SelectedIndexChanged);
    }
}

void cb_SelectedIndexChanged(object sender, EventArgs e)
{
    MessageBox.Show("Selected index changed");
}

如果我想在cb_SelectedIndexChanged之后调用cell end edit,如何在调用EndEdit时不抛出错误? - Raynoceros

-1
将第二个下拉列表放置在 UpdatePanel 中,如下所示。
<asp:UpdatePanel ID="UpdatePanel1" runat="server" RenderMode="Inline">
                 <ContentTemplate>
                 <asp:DropDownList ID="ddl2" runat="server" >                  
                </ContentTemplate>
                <Triggers>
                <asp:AsyncPostBackTrigger ControlID="ddl1" EventName="SelectedIndexChanged" />
                </Triggers>
                </asp:UpdatePanel>

为第一个下拉框设置AutoPostBack="true"属性,如下所示。

<asp:DropDownList ID="ddl1" runat="server" AutoPostBack="true"  
                        OnSelectedIndexChanged="ddl1_SelectedIndexChanged">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接