【问题标题】:How to handle SelectedIndexChanged event for a ComboBox? [duplicate]如何处理 ComboBox 的 SelectedIndexChanged 事件? [复制]
【发布时间】:2013-07-16 18:40:59
【问题描述】:

我有 DataGridView,其中包含两个 ComboBox 列。 第二个ComboBox 将根据从第一个ComboBox 中选择的值填充数据。

如何处理第一个ComboBoxSelectedIndexChanged 事件。

【问题讨论】:

    标签: c# winforms datagridview combobox event-handling


    【解决方案1】:

    如果我使用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);
        }
    }
    

    【讨论】:

    • 这是最好的答案。我唯一的建议是重载发件人并使用它,在示例中使用更少的状态。很好的例子,非常感谢。
    • 这对我来说是最好的解决方案。通过一些调整来限制选定的单元格,您解决问题的麻烦就更少了。不像上面的第一个代码
    【解决方案2】:

    可以在此处找到有关 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 之后进行单元格结束编辑。在cb_SelectedIndexChanged 中调用EndEdit 时如何不抛出错误?
    【解决方案3】:

    像这样将第二个下拉列表放在更新面板中

    <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">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 2019-06-13
      • 2015-11-08
      相关资源
      最近更新 更多