zoukankan      html  css  js  c++  java
  • C#中如何取得ComboBox控件SelectedValue的正确值?[C#郁闷]

    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

    asap
    绑定ComboBox这样的Windows Form的时候,需要检查三样东西,即:DataSource, ValueMember, 和DisplayMember。SelectedValue的类型就是一个DataRowView类型,为了得到相应的值,必须将它强制转换为相应的数据的字段类型,才可以操作,例如:

    ((DataRowView)sourceName.SelectedValue).Row[sourceName.ValueMember].ToString()

    你例子中的textbox也就是作了如上的隐含转换。

    慕羿
    绑定ComboBox这样的Windows Form的时候,需要检查三样东西,即:DataSource, ValueMember, 和DisplayMember。SelectedValue的类型就是一个DataRowView类型,为了得到相应的值,必须将它强制转换为相应的数据的字段类型,才可以操作,例如:

    ((DataRowView)sourceName.SelectedValue).Row[sourceName.ValueMember].ToString()

    你例子中的textbox也就是作了如上的隐含转换。
    还是不行,提示“指定的转换无效”。试了一下,是指的(DataRowView)sourceName.SelectedValue转换

    此外,感觉SelectedValue的值应该不是DataRowView。否则textBox在进行隐式转换的时候就不知道该选择哪一个列了(我在调试的时候是先把值赋给了string变量然后再从变量中赋给textBox的)。

    asap
    (System.Data.DataRowView) ???

    慕羿
    (System.Data.DataRowView) ???
    同样。

    用((DataRowView)sourceName.SelectedValue).Row[sourceName.ValueMember].ToString()的时候出错信息是列不在表中,把sourceName.ValueMember换成实际的列名字符串就发生转换无效。跟踪了一下,在那时候sourceName.ValueMember居然会是空串。莫名其妙

    找不出原因来,看来得要放弃这个方法了。

    asap
    设置了DisplayMember,比如:mycombo.DisplayMember = "id"的话,可以这样试试看:
    sourceName.SelectedValue.Item("id")

    edjia
    直接tostring没有问题啊。
    selectedvalue如果要转为datarowview类型的话转换无效。

    慕羿
    设置了DisplayMember,比如:mycombo.DisplayMember = "id"的话,可以这样试试看:
    sourceName.SelectedValue.Item("id")
    这样会产生编译错误:“object”并不包含对“Item”的定义

    慕羿
    直接tostring没有问题啊。
    selectedvalue如果要转为datarowview类型的话转换无效。
    直接ToString得到的就是:"System.Data.DataRowView"

    edjia
    SelectedItem是datarowview类型的吧。可以直接转换。
    我这里使用selecteditem也没有问题。

    慕羿
    SelectedItem是datarowview类型的吧。可以直接转换。
    我这里使用selecteditem也没有问题。
    我是想达到在列表中显示名称供选择,然后直接通过SelectedValue取得相应的id值。看来没把这个东西弄懂,做不了。现在改用SelectedIndex来查表取出这个值,实现了。

    谢谢二位,非常感谢。

    asap
    很高兴你已经搞定了这个问题。 不过我还是想再会头对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!

    dodowolf
    LoL Asap上班真早
    我刚才业在研究者事情来着
    放一个MSDN的Example在这里吧

    _http://msdn.microsoft.com/library/en-us/dv_vstechart/html/vbtchnavigatingmultiplerelatedtablesinadonetdataset.asp

    是关于多个DataSet之间的Navigation.

    asap
    LoL Asap上班真早
    我刚才业在研究者事情来着
    放一个MSDN的Example在这里吧

    _http://msdn.microsoft.com/library/en-us/dv_vstechart/html/vbtchnavigatingmultiplerelatedtablesinadonetdataset.asp

    是关于多个DataSet之间的Navigation.

    1. 我不早, 你早。 :)
    2. 谢谢那个例子。
    3. 对ComboBox这样的Windows Form, 用SelectedIndexChanged比SelectedValueChanged来得普遍。

    还是Borland的东东用得顺手。m$的东西后劲足啊。.NET总让人感觉有点怪,Andres这是“故意”向Java靠拢啊。

    慕羿
    很高兴你已经搞定了这个问题。 不过我还是想再会头对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来实现的话就必须在对象里多定义一个方法,而且多出了调用处理的过程,并不简单也不自然。现在这样实现要好多了。再次感谢 :)
  • 相关阅读:
    React 之使用 fetch
    react-native 环境搭建
    create-react-app 配置 less
    React新的前端思维方式
    字体图标 —— IconMoon
    你不知道的javascript 之 >>
    前端的自我修养
    jquery 学习
    html的meta总结
    git基本操作 nginx基本操作
  • 原文地址:https://www.cnblogs.com/chenbg2001/p/1614188.html
Copyright © 2011-2022 走看看