You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#中如何判断控件是ToolStripComboBox还是ComboBox?类型转换报错求助

C#中如何判断控件是ToolStripComboBox还是ComboBox?类型转换报错求助

嘿,兄弟,我瞅了你的问题和代码,瞬间就明白为啥会报这个错了!你先看你遇到的错误提示:

Cannot convert System.Windows.Form.Control to System.Windows.Form.ToolStripComboBox

核心问题出在继承关系上——ComboBox确实是Control的子类,所以你把ComboBoxControl传进方法没问题;但ToolStripComboBox不一样啊,它是ToolStripItem的子类,和Control完全是两条继承链上的东西!也就是说,你的方法参数是Control的话,ToolStripComboBox对象根本就进不了这个方法,那else if (control is ToolStripComboBox)这个分支永远都不会触发,你硬转肯定报错啊!

先贴一下你的原代码方便大家对照:

private void InitializeAutoComplete(Control control) {    
    if (control is ComboBox)    
    {        
        ComboBox comboBox = (ComboBox)control;    
    }    
    else if (control is ToolStripComboBox)    
    {        
        ToolStripComboBox toolStripComboBox = (ToolStripComboBox )control;    
    } 
}

那该怎么改呢?给你两个实用的方案:

方案一:写方法重载,分别处理不同类型

最规范的做法是给两种类型分别写重载方法,调用的时候对应传入就行:

// 专门处理ComboBox这类Control子类的方法
private void InitializeAutoComplete(Control control)
{
    // 用C# 7+的模式匹配,直接赋值,省得单独强转
    if (control is ComboBox comboBox)
    {
        // 这里写你的ComboBox自动补全初始化逻辑
        // 比如 comboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
    }
}

// 专门处理ToolStripComboBox的方法
private void InitializeAutoComplete(ToolStripItem item)
{
    if (item is ToolStripComboBox toolStripComboBox)
    {
        // 这里写ToolStripComboBox的初始化逻辑
        // 注意哦!ToolStripComboBox本身没有AutoComplete相关属性,得通过它的ComboBox属性来设置
        // 比如 toolStripComboBox.ComboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
    }
}

方案二:用object作为参数,统一判断(适合简单场景)

如果不想写两个方法,也可以把参数改成object,然后分别判断类型:

private void InitializeAutoComplete(object target)
{
    if (target is ComboBox comboBox)
    {
        // ComboBox的逻辑
    }
    else if (target is ToolStripComboBox toolStripComboBox)
    {
        // ToolStripComboBox的逻辑
    }
}

最后再提醒你一句:调用的时候要注意,如果是从ToolStrip里获取的项,比如toolStrip1.Items[0],这玩意儿是ToolStripItem类型,别当成Control传进第一个重载里啦!

备注:内容来源于stack exchange,提问作者devChing

火山引擎 最新活动