WinForm下ComboBox获取绑定对象集的SelectedVal

系统 2172 0

在上文《 WinForm下ComboBox设定SelectedValue总 》中,我列举了出现不能正常获取SlectedValue的一些方法。原文写得比较乱,引起读者的理解分歧,在此表示歉意。现将自己的思路重新整理一下。

注意 :本文只限定绑定对象集,而不涉及绑定DataSet或DataTable的情况

(如果绑定DataSet时出现SelectedValue为 System.Data.DataRowView 的错误,或者在取SelectedVlaue的值转换时出现" 不能将对象转换为字符串 ",请参看这里:Combobox出现System.Data.DataRowView的原因,以及指定ValueMember的时机问题 http://blog.csdn.net/lubiaopan/archive/2010/09/30/5915774.aspx )

一、准备工作:
为了方便起见,我们暂时将公用方法和变量简化一下:

一个Area类:

一个WinForm,命名为 frmMain

一个ComboBox,名为 cbList

两个button,名为 btnSetCombobox btnGetSelectedValu

一个Label,名为 lbResult ,初始值为 Unknown

定义公共变量:

几个用到的方法:

方法一:SetValueByValue(通过ValueMember设置)

方法二:SetValueByItem(通过SelectedItem设置)

方法三:SetValueByText(通过FindString查找DisplayMember设置)

获取SelectedValue的值:

如下图:

frmMain的Page_Load事件:

btnSetCombobox的Click事件:


btnGetSelectedValue的Click事件:


    
      cbList的
      
        SelectedIndexChanged
      
    
      
        SelectedValueChanged
      
    
    
事件:
    



二、测试结果(不考虑绑定结果集为空时的情况)

使用方法

1、 未设置ComboBox的 SelectedIndexChanged 事件和 SelectedValueChanged 事件时SelectedValue类型及值

Page_Load时

设置SelectedValue

读取SelectedValue

SetValueByValue

Null

所选 Area_ID对应的字符串

所选 Area _ID对应的字符串

SetValueByItem

Null

Area

所选 Area _ID对应的字符串

SetValueByText

Null

所选 Area _ID对应的字符串

所选 Area _ID对应的字符串

使用方法

2、 仅设置ComboBox的 SelectedIndexChanged 事件SelectedValue类型及值

Page_Load时

设置SelectedValue

读取SelectedValue

SetValueByValue

第一个 Area _ID对应的字符串

所选 Area _ID对应的字符串

所选 Area _ID对应的字符串

SetValueByItem

第一个 Area _ID对应的字符串

Area

所选 Area _ID对应的字符串

SetValueByText

第一个 Area _ID对应的字符串

所选 Area _ID对应的字符串

所选 Area _ID对应的字符串

使用方法

3、 仅设置ComboBox的 SelectedValueChanged 事件时SelectedValue类型及值

Page_Load时

设置SelectedValue

读取SelectedValue

SetValueByValue

第一个 Area _ID对应的字符串

所选 Area _ID对应的字符串

所选 Area _ID对应的字符串

SetValueByItem

第一个 Area _ID对应的字符串

Area

所选 A_ID对应的字符串

SetValueByText

第一个 Area _ID对应的字符串

所选 Area _ID对应的字符串

所选 A_ID对应的字符串

使用方法

4、 同时设置ComboBox的 SelectedIndexChanged 事件和 SelectedValueChanged 事件时SelectedValue类型及值

Page_Load时

设置SelectedValue

读取SelectedValue

SetValueByValue

第一个 Area _ID对应的字符串

所选 Area _ID对应的字符串

所选 Area _ID对应的字符串

SetValueByItem

第一个 Area _ID对应的字符串

Area

所选 Area _ID对应的字符串

SetValueByText

第一个 Area _ID对应的字符串

所选 Area _ID对应的字符串

所选 Area _ID对应的字符串

二、结论(不考虑绑定结果集为空时的情况)

本次测试中还发现几个结论:

1、当ComboBox中无论是否设置 SelectedIndexChanged 事件和 SelectedValueChanged 事件 ,如果没有设置SelectedValue值或设置的值超过ValueMember的范围(即赋错值),则此时SelectedValue为第一个对象对应的 Area _ID值,所以,如果出现没有正确获取到想要的值,请检查 是否设置或有没有赋了一个不存在于ValueMember集合的值。


2、最好设置ComboBox中的 SelectedIndexChanged事件和 SelectedValueChanged 事件 ,并在事件中获取SelectedValue值。

有人会担心事件会不会触发?经测试,如果这两个事件同时设置,顺序为:

cbList.DataSource = ac;//这里会触发 SelectedValueChanged 事件和 SelectedIndexChanged 事件各一次。
cbList.ValueMember = "Area_ID";这里会触发 SelectedValueChanged 事件和 SelectedIndexChanged 事件各一次,还有一次SelectedValueChanged事件
cbList.DisplayMember = "Area_Name";这里会触发 SelectedValueChanged 事件和 SelectedIndexChanged 事件各一次。

换句话说,设定两个事件任意一个即可,我建议用 SelectedValueChanged 事件 。

3、设置正确的绑定顺序。有人指出正确的顺序为:

cbList.ValueMember = " Area_ID " ; //这里会触发 SelectedValueChanged 事件

cbList.DisplayMember = " Area_Name " ; //这里不会触发任何事件

cbList.DataSource = ac;// 这里会触发 SelectedValueChanged 事件和 SelectedIndexChanged 事件 次。

在本次测试中发现顺序其实对结果并没有影响,但是如果将 ValueMembe在设置DataSource之前设置,触发事件大大减少!

所以建议 DataSource设置前先设定ValueMember和DisplayMember

4、如果设置错误的DisplayMember名称,(如本文中" Area_Name "误设为“ Area_Names ”)则取ValueMember作为DisplayMember,如果ValueMember的名称也设置错误,(如本文中" Area_ID "误设为“ Area_IDs ”)则获取SelectedValue时出错!

5、回到本文开头,如果绑定的不是对象集,而是DataSet或DataTable,则未设定SelectedValue时,取得的是一个DataRowView而不是null,请注意。

    
      邀月注:本文版权由邀月和CSDN共同所有,转载请注明出处。
      

助人等于自助! 3w@live.cn

WinForm下ComboBox获取绑定对象集的SelectedValue补充


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论