今天我快被气晕了,我的窗口上放置了两个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());  //这一句是窗口上另一个下拉列表框,它就能返回正确值。
        }                           我现在是彻底服气了,为啥总是返回这个值呢???           敬请高手能够解答。在线等待中.......................

解决方案 »

  1.   

       又做了个试验,我把这个LOAD事件对控件的初始化代码去掉,手工在设计期人为加上“one ,two,three"三项,然后再测试,就能返回我所期望的One,two,three值。这样看来,那就是在窗口初始化代码有问题了喽?可这段初始化代码在其它地方也是正确的,而且我的测试代码做如下修改也可能得到正确的值,证明初始化代码为这个下拉列表框的赋值是正确的。         MessageBox.Show(cbArea.Text);   //这样当我选择不同的值时,能正确显示,说明初始化是正确的。         MessageBox.Show(cbArea.SelectedValue.toString());  这样时也能正确的显出出-1,1,2等ValueMember中的值来,      郁闷啊...........
      

  2.   

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

  3.   


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

  4.   

    没DataBind()
    加个 cbArea.DataBind()
      

  5.   


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

  6.   


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

  7.   


    如果是空值的话,它还能show 出来吗?如果检查没有什么错误的话,把那个Combox删了,重新拖一个
      

  8.   

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

  9.   


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

  10.   


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

  11.   

        换个角度讲,如果我们要浏览cbArea的第一项的文本值,下面的代码正确吗?
           for (int i=0;i<=cbArea.Count-1;i++)
           {
                MessageBox(cbArea.Items[i].toString());
           }
      

  12.   


    不完全正确;
    -------------------
    如果你是 
    comboBox1.Items.Add("小五");
    comboBox1.Items.Add("小五1");
    comboBox1.Items.Add("小五2");
    这样就正确了;如果是 设置 DataSource 的返回就是"system.data.datarowview" 这样就不正确;
      

  13.   


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

  14.   

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

  15.   

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

  16.   

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

  17.   

    cbArea.SelectValue
    cbArea.Text
    cbArea.SelectText.....
      

  18.   

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

  19.   

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

  20.   

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

  21.   


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

  22.   

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