在运行时创建 ComboBox 时,为 DataGridView 内的 ComboBox 创建一个 EventHandler

Posted

技术标签:

【中文标题】在运行时创建 ComboBox 时,为 DataGridView 内的 ComboBox 创建一个 EventHandler【英文标题】:Create an EventHandler for ComboBox's that are inside a DataGridView, when ComboBox is created at Run time 【发布时间】:2015-01-12 00:21:05 【问题描述】:

我有一个在设计器中创建的名为 table_assets 的 DataGridView。

在运行时,DBAdapter 附加到 table_assets 的 DataSource,它使用列填充 table_assets - [Headertext] 列之一是:所有者。

Owner 列是 ComboBox 列。

这个程序的一个要求(连同上述)是列所有者内的组合框中的项目,在当前使用的行中所有必须从:

<client>

<client>
<spouse>
Joint

全局布尔配偶Active 为假或真时,可敬。

我面临的挑战是告诉程序更改项目。在大多数情况下,我无法向 ComboBox 添加事件处理程序,据我了解,这是更改项目的唯一方法。

这是我的相关代码,虽然我认为它没有多大用处 - 它会在 comboBoxColumn_AssetsOwner_Selected 中崩溃:

bool spouseActive;

public Client()

            // table_assets
            assetsAdapter = new DBAdapter(database.clientAssets);
            assetsAdapter.ConstructAdaptor(null, " cID = " + clientID.ToString());
            table_assets.DataSource = (DataTable)assetsAdapter.ReturnTable();

            table_assets.CellClick += new DataGridViewCellEventHandler(comboBoxColumn_AssetsOwner_Selected);



private void comboBoxColumn_AssetsOwner_Selected(object sender, EventArgs e)
  
        DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)sender;

        if (spouseActive == true)
        
               cell.Items.Add("<spouse>");     
               cell.Items.Add("Joint");
               Debug.WriteLine("added");
        
        else
          
               cell.Items.Remove("<spouse>");       
               cell.Items.Remove("Joint");
               Debug.WriteLine("removed");
        

【问题讨论】:

【参考方案1】:

尝试对DataGridView 使用EditingControlShowing 事件:

bool spouseActive;

public Client()

    // table_assets
    assetsAdapter = new DBAdapter(database.clientAssets);
    assetsAdapter.ConstructAdaptor(null, " cID = " + clientID.ToString());
    table_assets.DataSource = (DataTable)assetsAdapter.ReturnTable();

    table_assets.EditingControlShowing += table_assets_EditingControlShowing;

private void table_assets_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)

    if (e.Control is ComboBox)
    
        ComboBox cbMyComboBox = e.Control as ComboBox;
        if (spouseActive == true)
        
           cbMyComboBox.Items.Add("<spouse>");     
           cbMyComboBox.Items.Add("Joint");
           Debug.WriteLine("added");
        
        else
          
           cbMyComboBox.Items.Remove("<spouse>");       
           cbMyComboBox.Items.Remove("Joint");
           Debug.WriteLine("removed");
        
    

【讨论】:

感谢您的回复。我应该保持原样吗? table_assets.CellClick += new DataGridViewCellEventHandler(comboBoxColumn_AssetsOwner_Selected); - 在 Client() 中。 您说“我无法向 ComboBox 添加事件处理程序”。因此,您可以添加我的代码,而不是那个事件。代替 SelectedIndexChanged,您可以添加您的代码。我会修改我的答案。 哦,我现在明白了,但是您的代码是事件处理程序,对吗?所以它必须用这样的东西初始化,对吧?:table_assets.CellClick += new DataGridViewCellEventHandler(comboBoxColumn_AssetsOwner_Selected); 但对我来说,这是一个错误:Error 1 No overload for 'comboBoxColumn_AssetsOwner_Selected' matches delegate 'System.Windows.Forms.DataGridViewCellEventHandler' 很高兴能帮到你..:)

以上是关于在运行时创建 ComboBox 时,为 DataGridView 内的 ComboBox 创建一个 EventHandler的主要内容,如果未能解决你的问题,请参考以下文章

创建一个ComboBox对象以将其传递给Sub

通过单击按钮向 ComboBox 添加值

在触发单击 Extjs 3.4 时重新加载 ComboBox 存储

ComboBox不会在DataGridTemplateColumn中显示绑定数据

可编辑 JavaFX ComboBox 上的 MouseListener

ListBox 中的所有 ComboBox 在其中任何一个更改时都会更改