ComboBox这个控件使用频率太高了,我从VC6编程开始就用它,一直用到C#到现在的Net6,要说我这么一个编程老手还能在它身上栽跟头,我都不敢相信。
但是今天竟然被它无情的戏耍了。记录下这个问题,看看你遇到过没有?
winform程序,我们一般情况下都是拖控件上去,这种使用一直是正常的。
由于功能需要,我需要动态创建一个ComboBox,然后动态加入数据,如下代码:
ComboBox cbx = new ComboBox();
List options = new List();
options.Add(new DictionaryEntry() { Key = "MultiLine", Value = "多行" });
options.Add(new DictionaryEntry() { Key = "SingleLine", Value = "单行" });
cbx.DataSource = options;
cbx.ValueMember = "Key";
cbx.DisplayMember = "Value";
这也都是正常的,然后我想让它默认选择是单行,所以使用了代码:
cbx.SelectedValue = "SingleLine";
按道理默认选择就应该是单行了,可是并没有,调试发现,执行之后cbx.SelectedValue仍然是null。赋值以后还是空值?里面的cbx.Items也为空,这是什么情况?
最初我以为是Net6有Bug,于是切换到了Framework4.5,结果仍然是一样的问题。
遇到问题,先到网上查了一下资料,看看别人有没有遇到过。也不知道是真没人遇到过,还是百度越发不中用了,总之没找到类似的问题。没办法,还是得自己啃。
然后我实验当我不用代码动态生成,直接在设计器中事先拖好控件,结果就是正确的。
按逻辑分析了一下,拖放控件与代码动态创建的最大不同,就是拖放的控件会自动指定它的父窗口,那么会不会是为了节省效率,如果你不指定父窗口,那么就意味着子控件是没有机会显示的,所以就被放弃执行了。这么逻辑貌似说得通,于是就做了下尝试:
ComboBox cbx = new ComboBox();
this.Controls.Add(cbx);
//some code
在new之后立即把它装到父控件中,再次运行,搞定:)
编程每天都能遇到各种稀奇古怪的事情,感兴趣的话也在评论区说出你的故事吧:)