设置Combox的DataSource、DisplayMember和ValueMember属性。

解决方案 »

  1.   

    To reanna (蕾安娜):建议您从其他角度作一些跟踪和Debug,问题应该并非出自ComboBox本身。ComboBox.Text属性在实现上其实就完成了两件事情:首先是对父类的Text属性赋值,然后遍历所有的Items,比较Items[i].ToString()与输入值,如果相等,则修改SelectedIndex。另外,有几点是需要说明的:1)ComboBox.Text的赋值可以是case-insensitive的。也就是说,在下面的这段代码中,虽然ComboBox.Text被置为"Bbb"(第一个字母大写),但ComboBox仍然能够找到"bbb"这一项。 this.comboBox1.DropDownStyle=System.Windows.Forms.ComboBoxStyle.DropDown; //this.comboBox1.DropDownStyle=System.Windows.Forms.ComboBoxStyle.DropDownList; //this.comboBox1.DropDownStyle=System.Windows.Forms.ComboBoxStyle.Simple;
    this.comboBox1.Items.Add("aaa");
    this.comboBox1.Items.Add("bbb");
    this.comboBox1.Items.Add("ccc");
    this.comboBox1.Items.Add("bbb");
    this.comboBox1.Text="Bbb";2)如果有多个相同的项,则设定ComboBox.Text后总是只能指向最前面的一项,即在上面那段代码中,SelectedIndex总是只能被置为1。但是如果上面代码中第四个Item的值改为"Bbb",那大小写完全匹配的优先选中。Hogwarts - S(u)ddenly dis@ppeared...

    本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。  
    为了为您创建更好的讨论环境,请参加我们的用户满意度调查(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。  
      

  2.   

    将ComboBox的DataSource设置为rgMethod rgMethod 是一个自定义结构:
    private State[] rgMethod = new State[] { new State("先进先出",1),
                                             new State("后进先出",2),
                                             new State("月加权平均",3)};
    ComboBox.DisplayMember="Name";//rgMethod的一个成员 
    ComboBox.ValueMember = "Name";//rgMethod的另一个成员 从数据库查出一个值("月加权平均")想赋给ComboBox.Text = "月加权平均"; //一个string类型
    Deburg跟踪显示ComboBox.Text的确是"月加权平均",但是界面上显示的却是"先进先出"

    怎么回事?非常着急!
      

  3.   

    当调用ComboBox.Text=strValue时,ComboBox会把strValue逐一与Items[i].ToString()做比较,以决定选取那个Item。您可以试一下把你程序中ComboBox的所有Items[i].ToString()都打印出来看一下,就一目了然了。不出意外的话,里面任何一个ToString()都不等于"月加权平均"。至于ComboBox.Text的确是"月加权平均"的问题,原因是ComboBox.Text并不是一个Field,而是一个Property。他的get方法和set方法的实现有所不同,因此完全有可能ComboBox.Text的值和当前选中的item的ToString()值不相等。Hogwarts - S(u)ddenly dis@ppeared...

    本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。  
    为了为您创建更好的讨论环境,请参加我们的用户满意度调查(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。  
      

  4.   

    是可以选到正确的项的。如果你需要继续解决这个问题,可以把你的一些相关代码贴出来,主要就是State类的完整定义。
    Hogwarts - S(u)ddenly dis@ppeared...

    本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。  
      

  5.   

    解决后,我也给100分,斑主代扣吧!!!TO Hogwarts([微软]S(u)ddenly dis@ppeared...) :
      我也遇到同样的问题,我是用WebForm的DropDownList控件,提交后都是
    往第一项跳.
    private void Page_Load(object sender, System.EventArgs e)
    {

    // 在此处放置用户代码以初始化页面
    String Provider,DataBase,ConnStr;
    Provider="Microsoft.Jet.OLEDB.4.0;";
    DataBase=Server.MapPath("mesh.mdb");
    ConnStr="Provider="+Provider+"Data Source="+DataBase;
                OleDbDataAdapter Cmd3; Cmd3=new OleDbDataAdapter("Select KHBH as 编号,KHMC as 客户名称 from KHB1 ",ConnStr);
    DataSet ds=new DataSet();
    Cmd3.Fill(ds,"KHB1");
    //DataGrid1.DataSource=ds.Tables["KHB1"].DefaultView;
    //DataGrid1.DataBind();
    DropDownList1.DataSource = ds.Tables["KHB1"].DefaultView;

    DropDownList1.DataTextField = "客户名称";
    DropDownList1.DataValueField = "编号";
    DropDownList1.DataBind();
    }
    //选定项以后,用一按钮来提交.
    private void Button4_Click(object sender, System.EventArgs e)
    {
    Label14.Text=DropDownList1.SelectedItem.Text ; }
      

  6.   

    To wxjUN(红星大队):你的问题和reanna的问题不太一样。简单的说,你的问题出在Page_Load()函数:每次Page_Load都重新绑定数据,DropDownList的状态自然就被reset了。解决的方法是,把绑定数据的代码放在if(this.IsPostBack==false){}里面: if(this.IsPostBack==false)
    {
    //查询、绑定数据
    }您不妨试一试。此外,以后建议您开新帖子提问,这样更有利于更多人注意到您的问题并给与您帮助,使您的问题能够得到更快的解答。
    Hogwarts - S(u)ddenly dis@ppeared...

    本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。  
    为了为您创建更好的讨论环境,请参加我们的用户满意度调查(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。  
      

  7.   

    谢谢 Hogwarts([微软]S(u)ddenly dis@ppeared...) ,问题解决了.
    请版主扣我100分给Hogwarts([微软]S(u)ddenly dis@ppeared...) 吧,我不知道怎么给分.万分感谢!!
      

  8.   

    谢谢您, Hogwarts([微软]S(u)ddenly dis@ppeared...) ,问题解决了.
    请版主扣我100分给Hogwarts([微软]S(u)ddenly dis@ppeared...) 吧,我不知道怎么给分.万分感谢!!
      

  9.   

    Sate类的完整结构:
    public struct State 
    {
       private string strName;
       private int iID;   public State(string name , int id) 
       {
         this.strName = name ; 
         this.iID = id ;
       }   public string Name 
       { 
         get{ return strName; } 
       }   public int ID 
       { 
         get { return iID; } 
       }
    }
    使用这个结构作为ComboBox的DataSource
    private State[] rgMethod = new State[] { new State("先进先出",1),
                                             new State("后进先出",2),
                                             new State("月加权平均",3)};
    初始化ComboBox
    this.cmbCucalType.Location = new System.Drawing.Point(this.Left+330,this.LabelPanel.Bottom+84);
    this.cmbCucalType.Name = "cmbRecType";
    this.cmbCucalType.TabIndex = 16;
    this.cmbCucalType.Text = "";
    this.cmbCucalType.DataSource=rgMethod ;
    this.cmbCucalType.DisplayMember="Name";
    this.cmbCucalType.ValueMember = "Name";
    查询赋值
    从数据库查出一个值为"月加权平均"
    赋给ComboBox.Text = "月加权平均"; Deburg跟踪显示ComboBox.Text的确是"月加权平均",但是界面上显示的却是"先进先出",也就是第一个值