C#中如何判断控件是ToolStripComboBox还是ComboBox?类型转换报错求助
C#中如何判断控件是ToolStripComboBox还是ComboBox?类型转换报错求助
嘿,兄弟,我瞅了你的问题和代码,瞬间就明白为啥会报这个错了!你先看你遇到的错误提示:
Cannot convert System.Windows.Form.Control to System.Windows.Form.ToolStripComboBox
核心问题出在继承关系上——ComboBox确实是Control的子类,所以你把ComboBox当Control传进方法没问题;但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




