我快被气晕了,combobox总是返回“System.Data.DataRowView"值???

时间:2022-05-01 16:19:24
    今天我快被气晕了,我的窗口上放置了两个combobox控件,其中一个控件总是返回“System.Data.DataRowView”值,这快把我气晕了。我的代码是这样的。
        //初始化comboBox值
       private void ModifyUser_Load(object sender, EventArgs e)
        {
            string SqlConn = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
            SqlConnection MyConn = new SqlConnection(SqlConn);
            SqlCommand MyCmd = new SqlCommand();
            string SqlStr = "Select Name,ID from AreaTable";
            MyCmd.CommandText = SqlStr;
            MyCmd.Connection = MyConn;

            SqlDataAdapter da = new SqlDataAdapter(MyCmd);
            DataTable dt = new DataTable();
            MyConn.Open();
            da.Fill(dt);
            //人为插入一行在combobox前面.
            DataRow dr = dt.NewRow();
            dr["Name"] = "请选择所在小区";
            dr["ID"] = -1;
            dt.Rows.InsertAt(dr, 0);
            cbArea.DataSource = dt;
            cbArea.DisplayMember = "Name";
            cbArea.ValueMember = "ID";
            MyConn.Close();
        }
             下面是我做试验的临时按钮。
         private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(cbArea.Items[cbArea.SelectedIndex].ToString());    //就是这一句,总是返回system.data.datarowview
            //MessageBox.Show(cbSrvArea.Items[cbSrvArea.SelectedIndex].ToString());  //这一句是窗口上另一个下拉列表框,它就能返回正确值。
        }           

                我现在是彻底服气了,为啥总是返回这个值呢???

           敬请高手能够解答。在线等待中.......................

26 个解决方案

#1


说明你第一个返回值是空啊

#2


cbArea.SelectItem.value

我快被气晕了,combobox总是返回“System.Data.DataRowView"值???

#3


   又做了个试验,我把这个LOAD事件对控件的初始化代码去掉,手工在设计期人为加上“one ,two,three"三项,然后再测试,就能返回我所期望的One,two,three值。这样看来,那就是在窗口初始化代码有问题了喽?可这段初始化代码在其它地方也是正确的,而且我的测试代码做如下修改也可能得到正确的值,证明初始化代码为这个下拉列表框的赋值是正确的。

         MessageBox.Show(cbArea.Text);   //这样当我选择不同的值时,能正确显示,说明初始化是正确的。

         MessageBox.Show(cbArea.SelectedValue.toString());  这样时也能正确的显出出-1,1,2等ValueMember中的值来,

      郁闷啊...........

#4


cbArea.Items[cbArea.SelectedIndex].Text, //显示文字
 或者
cbArea.Items[cbArea.SelectedIndex].Value;//值

#5


引用 1 楼 deknight 的回复:
说明你第一个返回值是空啊


    我随便选择哪一项,都是返回同一个值"System.data.datarowview"

#6


没DataBind()
加个 
cbArea.DataBind()

#7


引用 4 楼 wo6522317 的回复:
cbArea.Items[cbArea.SelectedIndex].Text, //显示文字
 或者
cbArea.Items[cbArea.SelectedIndex].Value;//值


    这两个方法我都试过了,能返回正确的值来,总是产生我的那个问题的原因是什么呢?而且我要做的事是先初始化这个comboBox,然后根据数据库中的某个值,再确定这个comboBox的SelectedIndex,即让comboBox不总是显示第一个选项。

#8


你的没有读到值啊

#9


引用 6 楼 wackyboy 的回复:
没DataBind()
加个 

C# code
cbArea.DataBind()


    我是在WinForm中设计的中,不需要databind(),如果在WebForm设计中,才需要DataBind()

#10


引用 1 楼 deknight 的回复:
说明你第一个返回值是空啊


如果是空值的话,它还能show 出来吗?

如果检查没有什么错误的话,把那个Combox删了,重新拖一个

#11


cbArea.Items[cbArea.SelectedIndex]  // 代表对象类型名
cbArea.Items[cbArea.SelectedIndex].Text // 代表对象的文本
cbArea.Items[cbArea.SelectedIndex].Value  // 代表对象的值

#12


引用 11 楼 wanggangchun 的回复:
cbArea.Items[cbArea.SelectedIndex] // 代表对象类型名
cbArea.Items[cbArea.SelectedIndex].Text // 代表对象的文本
cbArea.Items[cbArea.SelectedIndex].Value // 代表对象的值


    我也觉得返回的值是这该对象的类型名,即System.data.datarowview,可是同样的代码即:
MessageBox.Show(cbArea.Items[cbArea.SelectedIndex].ToString()); //就是这一句,总是返回system.data.datarowview
  //MessageBox.Show(cbSrvArea.Items[cbSrvArea.SelectedIndex].ToString()); //这一句是窗口上另一个下拉列表框,它就能返回正确值。
          为什么第一句返回的是对象名,第二句就能返回正确的期望值呢?

#13


引用 11 楼 wanggangchun 的回复:
cbArea.Items[cbArea.SelectedIndex] // 代表对象类型名
cbArea.Items[cbArea.SelectedIndex].Text // 代表对象的文本
cbArea.Items[cbArea.SelectedIndex].Value // 代表对象的值


   而且你的第二句:cbArea.Items[cbArea.SelectedIndex].Text // 代表对象的文本,是错误的吧,IDE自动提示中没有这个提示。只有ToString()

#14


    换个角度讲,如果我们要浏览cbArea的第一项的文本值,下面的代码正确吗?
   

    for (int i=0;i<=cbArea.Count-1;i++)
       {
            MessageBox(cbArea.Items[i].toString());
       }

#15


引用 14 楼 yangyun 的回复:
    换个角度讲,如果我们要浏览cbArea的第一项的文本值,下面的代码正确吗?
   

    for (int i=0;i<=cbArea.Count-1;i++)
       {
            MessageBox(cbArea.Items[i].toString());
       }


不完全正确;
-------------------
如果你是 
comboBox1.Items.Add("小五");
comboBox1.Items.Add("小五1");
comboBox1.Items.Add("小五2");
这样就正确了;

如果是 设置 DataSource 的返回就是"system.data.datarowview" 这样就不正确;

#16


引用 14 楼 yangyun 的回复:
换个角度讲,如果我们要浏览cbArea的第一项的文本值,下面的代码正确吗?
   

  for (int i=0;i<=cbArea.Count-1;i++)
  {
  MessageBox(cbArea.Items[i].toString());
  }


   这一段代码我将两个comboBox 都试过了,一个可以返回正确值,一个还是返回的是System.data.datarowview,区别是返回正确值的comboBox中ITEMS的值是手动输入的,返回错误值的是初始化代码初化过的那个comboBox

#17


引用 9 楼 yangyun 的回复:
引用 6 楼 wackyboy 的回复:
没DataBind()
加个

C# code
cbArea.DataBind()


  我是在WinForm中设计的中,不需要databind(),如果在WebForm设计中,才需要DataBind()



正解

#18


使用这个"comboBox1.Text" 可以保证获取都是当前显示的文字;

#19


引用 15 楼 wo6522317 的回复:
引用 14 楼 yangyun 的回复:

  换个角度讲,如果我们要浏览cbArea的第一项的文本值,下面的代码正确吗?
   

  for (int i=0;i<=cbArea.Count-1;i++)
  {
  MessageBox(cbArea.Items[i].toString());
  }


不完全正确;
-------------------
如果你……

           那如果我设置了DataSource,而且我就是想获得我想获得或设置该comboBox的值该怎能么办呢?

#20


设置了数据源后,cbArea.Items[i]实际是datarowview对象
DataRowView drv =(DataRowView)comboBox1.Items[i];
Console.WriteLine(drv["Name"]);
还原对象后要指定列名或索引来获取特定列的值。

#21


cbArea.SelectValue
cbArea.Text
cbArea.SelectText

.....

#22


   现在的问题变成了,如果comboBox中的内容是设置了DataSource、DisplayMember和valueMember后,该怎样获取和设置它的值的问题了????

#23


改变数据源,而不是改变comboBox的Item。
重新绑定
comboBox1.DataSource=null;
comboBox1.DataSource=aaa;

#24


引用 22 楼 yangyun 的回复:
   现在的问题变成了,如果comboBox中的内容是设置了DataSource、DisplayMember和valueMember后,该怎样获取和设置它的值的问题了????

获取
-------------
显示的文字用: comboBox1.Text;
获取值:comboBox1.SelectedValue.ToString()
设置:
修改绑定的对象如:(dataTable) 增加一列(dataRow),重新绑定;

#25


引用 20 楼 zzx509 的回复:
设置了数据源后,cbArea.Items[i]实际是datarowview对象
DataRowView drv =(DataRowView)comboBox1.Items[i];
Console.WriteLine(drv["Name"]);
还原对象后要指定列名或索引来获取特定列的值。


      果然是高手,解释的很好,我又做了一下试验,非常成功。想想也正确的,既然comboBox跟dataTable绑定后,获的一行Items[i]当然是与绑定的DataTable中的一行,也就是DataRowView了。

#26


   非常感谢wo6522317和zzx509两位高手,我马上结贴去,现在总算对下拉列表框有了一个新的认识。对绑定数据源的控件有了一个新的认识。

#1


说明你第一个返回值是空啊

#2


cbArea.SelectItem.value

我快被气晕了,combobox总是返回“System.Data.DataRowView"值???

#3


   又做了个试验,我把这个LOAD事件对控件的初始化代码去掉,手工在设计期人为加上“one ,two,three"三项,然后再测试,就能返回我所期望的One,two,three值。这样看来,那就是在窗口初始化代码有问题了喽?可这段初始化代码在其它地方也是正确的,而且我的测试代码做如下修改也可能得到正确的值,证明初始化代码为这个下拉列表框的赋值是正确的。

         MessageBox.Show(cbArea.Text);   //这样当我选择不同的值时,能正确显示,说明初始化是正确的。

         MessageBox.Show(cbArea.SelectedValue.toString());  这样时也能正确的显出出-1,1,2等ValueMember中的值来,

      郁闷啊...........

#4


cbArea.Items[cbArea.SelectedIndex].Text, //显示文字
 或者
cbArea.Items[cbArea.SelectedIndex].Value;//值

#5


引用 1 楼 deknight 的回复:
说明你第一个返回值是空啊


    我随便选择哪一项,都是返回同一个值"System.data.datarowview"

#6


没DataBind()
加个 
cbArea.DataBind()

#7


引用 4 楼 wo6522317 的回复:
cbArea.Items[cbArea.SelectedIndex].Text, //显示文字
 或者
cbArea.Items[cbArea.SelectedIndex].Value;//值


    这两个方法我都试过了,能返回正确的值来,总是产生我的那个问题的原因是什么呢?而且我要做的事是先初始化这个comboBox,然后根据数据库中的某个值,再确定这个comboBox的SelectedIndex,即让comboBox不总是显示第一个选项。

#8


你的没有读到值啊

#9


引用 6 楼 wackyboy 的回复:
没DataBind()
加个 

C# code
cbArea.DataBind()


    我是在WinForm中设计的中,不需要databind(),如果在WebForm设计中,才需要DataBind()

#10


引用 1 楼 deknight 的回复:
说明你第一个返回值是空啊


如果是空值的话,它还能show 出来吗?

如果检查没有什么错误的话,把那个Combox删了,重新拖一个

#11


cbArea.Items[cbArea.SelectedIndex]  // 代表对象类型名
cbArea.Items[cbArea.SelectedIndex].Text // 代表对象的文本
cbArea.Items[cbArea.SelectedIndex].Value  // 代表对象的值

#12


引用 11 楼 wanggangchun 的回复:
cbArea.Items[cbArea.SelectedIndex] // 代表对象类型名
cbArea.Items[cbArea.SelectedIndex].Text // 代表对象的文本
cbArea.Items[cbArea.SelectedIndex].Value // 代表对象的值


    我也觉得返回的值是这该对象的类型名,即System.data.datarowview,可是同样的代码即:
MessageBox.Show(cbArea.Items[cbArea.SelectedIndex].ToString()); //就是这一句,总是返回system.data.datarowview
  //MessageBox.Show(cbSrvArea.Items[cbSrvArea.SelectedIndex].ToString()); //这一句是窗口上另一个下拉列表框,它就能返回正确值。
          为什么第一句返回的是对象名,第二句就能返回正确的期望值呢?

#13


引用 11 楼 wanggangchun 的回复:
cbArea.Items[cbArea.SelectedIndex] // 代表对象类型名
cbArea.Items[cbArea.SelectedIndex].Text // 代表对象的文本
cbArea.Items[cbArea.SelectedIndex].Value // 代表对象的值


   而且你的第二句:cbArea.Items[cbArea.SelectedIndex].Text // 代表对象的文本,是错误的吧,IDE自动提示中没有这个提示。只有ToString()

#14


    换个角度讲,如果我们要浏览cbArea的第一项的文本值,下面的代码正确吗?
   

    for (int i=0;i<=cbArea.Count-1;i++)
       {
            MessageBox(cbArea.Items[i].toString());
       }

#15


引用 14 楼 yangyun 的回复:
    换个角度讲,如果我们要浏览cbArea的第一项的文本值,下面的代码正确吗?
   

    for (int i=0;i<=cbArea.Count-1;i++)
       {
            MessageBox(cbArea.Items[i].toString());
       }


不完全正确;
-------------------
如果你是 
comboBox1.Items.Add("小五");
comboBox1.Items.Add("小五1");
comboBox1.Items.Add("小五2");
这样就正确了;

如果是 设置 DataSource 的返回就是"system.data.datarowview" 这样就不正确;

#16


引用 14 楼 yangyun 的回复:
换个角度讲,如果我们要浏览cbArea的第一项的文本值,下面的代码正确吗?
   

  for (int i=0;i<=cbArea.Count-1;i++)
  {
  MessageBox(cbArea.Items[i].toString());
  }


   这一段代码我将两个comboBox 都试过了,一个可以返回正确值,一个还是返回的是System.data.datarowview,区别是返回正确值的comboBox中ITEMS的值是手动输入的,返回错误值的是初始化代码初化过的那个comboBox

#17


引用 9 楼 yangyun 的回复:
引用 6 楼 wackyboy 的回复:
没DataBind()
加个

C# code
cbArea.DataBind()


  我是在WinForm中设计的中,不需要databind(),如果在WebForm设计中,才需要DataBind()



正解

#18


使用这个"comboBox1.Text" 可以保证获取都是当前显示的文字;

#19


引用 15 楼 wo6522317 的回复:
引用 14 楼 yangyun 的回复:

  换个角度讲,如果我们要浏览cbArea的第一项的文本值,下面的代码正确吗?
   

  for (int i=0;i<=cbArea.Count-1;i++)
  {
  MessageBox(cbArea.Items[i].toString());
  }


不完全正确;
-------------------
如果你……

           那如果我设置了DataSource,而且我就是想获得我想获得或设置该comboBox的值该怎能么办呢?

#20


设置了数据源后,cbArea.Items[i]实际是datarowview对象
DataRowView drv =(DataRowView)comboBox1.Items[i];
Console.WriteLine(drv["Name"]);
还原对象后要指定列名或索引来获取特定列的值。

#21


cbArea.SelectValue
cbArea.Text
cbArea.SelectText

.....

#22


   现在的问题变成了,如果comboBox中的内容是设置了DataSource、DisplayMember和valueMember后,该怎样获取和设置它的值的问题了????

#23


改变数据源,而不是改变comboBox的Item。
重新绑定
comboBox1.DataSource=null;
comboBox1.DataSource=aaa;

#24


引用 22 楼 yangyun 的回复:
   现在的问题变成了,如果comboBox中的内容是设置了DataSource、DisplayMember和valueMember后,该怎样获取和设置它的值的问题了????

获取
-------------
显示的文字用: comboBox1.Text;
获取值:comboBox1.SelectedValue.ToString()
设置:
修改绑定的对象如:(dataTable) 增加一列(dataRow),重新绑定;

#25


引用 20 楼 zzx509 的回复:
设置了数据源后,cbArea.Items[i]实际是datarowview对象
DataRowView drv =(DataRowView)comboBox1.Items[i];
Console.WriteLine(drv["Name"]);
还原对象后要指定列名或索引来获取特定列的值。


      果然是高手,解释的很好,我又做了一下试验,非常成功。想想也正确的,既然comboBox跟dataTable绑定后,获的一行Items[i]当然是与绑定的DataTable中的一行,也就是DataRowView了。

#26


   非常感谢wo6522317和zzx509两位高手,我马上结贴去,现在总算对下拉列表框有了一个新的认识。对绑定数据源的控件有了一个新的认识。