关于winform ComboBox的SelectedValue

Posted on 2010-11-29 20:27  gmtyt  阅读(3626)  评论(0)    收藏  举报

 关于winform ComboBox的SelectedValue

2009年03月30日 星期一 16:22

 

ComboBox已经被绑定到了一个DataSet的Table中。该表中包含2列:一个string型的名称列和一个int型的id列。名称列被绑定到控件的DisplayMember,而id列则被绑定到ValueMember。目的是通过对该控件的操作得到SelectedValue中的int型id值。 现在的问题是:没法得到该值,但奇怪的却能从调试用的textBox中显示出正确的值来。

调试的片断如下:

private void sourceName_SelectedValueChanged(object sender, System.EventArgs e) { string tstr=sourceName.SelectedValue.ToString(); textBox1.Text=tstr; }

从断点中观察看到:

sourceName.SelectedValue.GetType()返回值为System.Int32; tstr值为"System.Data.DataRowView";祛除断点后却看到textBox1中显示出了正确的id值。

要怎样才能得到这个id呢? .NET Framework 版本是 1.1

 

 很高兴你已经搞定了这个问题。 不过我还是想再会头对SelectedValue说几句。

1. 首先, string tstr=sourceName.SelectedValue.ToString(); 是完全可以的,但有个前提: 由于SelectedValue必须通过ValueMember来检索,所以你必须在程序的初始化部分作数据绑定时,设置诸如:this.comboBox1.ValueMember = "ID"; 2. 在程序初始化中,事件SelectedValueChanged会被触发,而那时sourceName.SelectedValue尚没有值,故执行1中的语句会出问题。

解决的手段有很多,最直接的就是做一个判断,如: if (sourceName.SelectedValue != null) { string tstr=sourceName.SelectedValue.ToString(); } 虽然不够严谨,但供调试程序是足够了。 在1,2两个条件满足后,程序可以顺利执行。

当然,就你的目的而言, 这个方法有点笨, 用SelectIndex简便多了。以上权作多一个思路吧。

 

 Enjoy! 茅塞顿开啊,太感谢了!虽然感觉到SelectedValue中的值很不合道理,却没想到是控件被初始化时发生的问题。结果这个问题困扰了我十几个小时。

 sourceName.SelectedValue != null不行,一开始那里面不是null,而是一个DataRowView。见代码: private void sourceName_SelectedValueChanged(object sender, System.EventArgs e) { if (!(sourceName.SelectedValue.ToString() == "System.Data.DataRowView")) { int tid=(int)sourceName.SelectedValue; textBox1.Text=tid.ToString(); } }

为了隔离界面,我把DataSet的构建和管理放到了一个数据操作对象里进行。于是要用SelectedIndex来实现的话就必须在对象里多定义一个方法,而且多出了调用处理的过程,并不简单也不自然。现在这样实现要好多了。再次感谢 :)

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3