【问题标题】:Fill Combobox from database从数据库填充组合框
【发布时间】:2012-09-11 18:10:41
【问题描述】:

我有一个组合框错误

我的代码:

SqlConnection conn = new SqlConnection();
try
{
    conn = new SqlConnection(@"Data Source=SHARKAWY;Initial Catalog=Booking;Persist Security Info=True;User ID=sa;Password=123456");
    string query = "select FleetName, FleetID from fleets";
    SqlCommand cmd = new SqlCommand(query, conn);
    cmd.CommandText = query;
    conn.Open();
    SqlDataReader drd = cmd.ExecuteReader();
    while (drd.Read())
    {
         cmbTripName.Items.Add(drd["FleetName"].ToString());
         cmbTripName.ValueMember = drd["FleetID"].ToString();
         cmbTripName.DisplayMember = drd["FleetName"].ToString();
    }
}
catch
{
     MessageBox.Show("Error ");
}

数据显示在组合框中,但是当您更改选择值成员时,显示成员不会改变。

它现在正在工作,但是当我单击按钮显示数据时

private void button1_Click(object sender, EventArgs e)
{
    label1.Text = cmbTripName.DisplayMember;
    label2.Text = cmbTripName.ValueMember;
}

显示如下:

舰队名称
车队 ID

不显示值

【问题讨论】:

    标签: c# data-binding


    【解决方案1】:

    试试这个:

    1.  

      using MySql.Data.MySqlClient;
      
    2. 这样写:

      MySqlConnection con = new MySqlConnection("datasource=172.16.2.104;port=3306;server=localhost;database=DB_Name;uid=root;password=DB_Password;sslmode=none;charset=utf8;");
      MySqlCommand cmd = new MySqlCommand();
      
      var query2 = "SELECT `salary` FROM `employees_db` ";
      using (var command2 = new MySqlCommand(query2, con))
      {
          using (var reader2 = command2.ExecuteReader())
          {
              while (reader2.Read())
              {
                  combox.Text  = reader2.GetString("salary");
              }
          }
      }
      

    【讨论】:

      【解决方案2】:
      string query = "SELECT column_name FROM table_name";      //query the database
      SqlCommand queryStatus = new SqlCommand(query, myConnection);
      sqlDataReader reader = queryStatus.ExecuteReader();                               
                  
      while (reader.Read())   //loop reader and fill the combobox
      {
      ComboBox1.Items.Add(reader["column_name"].ToString());
      }
      

      【讨论】:

        【解决方案3】:
        void Fillcombobox()
        {
        
            con.Open();
            cmd = new SqlCommand("select ID From Employees",con);
            Sdr = cmd.ExecuteReader();
            while (Sdr.Read())
            {
                for (int i = 0; i < Sdr.FieldCount; i++)
                {
                   comboID.Items.Add( Sdr.GetString(i));
        
                }
            }
            Sdr.Close();
            con.Close();
        
        }
        

        【讨论】:

        • 请不要只在答案中转储您的代码。尝试至少提供一个简短的解释。见:stackoverflow.com/help/how-to-answer
        • 请通过添加一些解释(可能还有一些格式)来改进您的纯代码答案。这样一来,您对提问者的帮助就更大了。而且您也不想给人一种您正在提供免费代码编写服务的印象,对吗?
        【解决方案4】:
        private void StudentForm_Load(object sender, EventArgs e)
        
        {
                 string q = @"SELECT [BatchID] FROM [Batch]"; //BatchID column name of Batch table
                 SqlDataReader reader = DB.Query(q);
        
                 while (reader.Read())
                 {
                     cbsb.Items.Add(reader["BatchID"].ToString()); //cbsb is the combobox name
                 }
          }
        

        【讨论】:

          【解决方案5】:
                      SqlConnection conn = new SqlConnection(@"Data Source=TOM-PC\sqlexpress;Initial Catalog=Northwind;User ID=sa;Password=xyz") ;
                      conn.Open();
                      SqlCommand sc = new SqlCommand("select customerid,contactname from customers", conn);
                      SqlDataReader reader;
          
                      reader = sc.ExecuteReader();
                      DataTable dt = new DataTable();
                      dt.Columns.Add("customerid", typeof(string));
                      dt.Columns.Add("contactname", typeof(string));
                      dt.Load(reader);
          
                      comboBox1.ValueMember = "customerid";
                      comboBox1.DisplayMember = "contactname";
                      comboBox1.DataSource = dt;
          
                      conn.Close();
          

          【讨论】:

          • 对代码如何工作的一些解释将是有益的。
          【解决方案6】:

          要以您想要的方式使用Combobox,您可以将一个对象传递给cmbTripName.Items.Add 方法。

          该对象应具有FleetIDFleetName 属性:

          while (drd.Read())
          {
              cmbTripName.Items.Add(new Fleet(drd["FleetID"].ToString(), drd["FleetName"].ToString()));
          }
          cmbTripName.ValueMember = "FleetId";
          cmbTripName.DisplayMember = "FleetName";
          

          Fleet 类:

          class Fleet
          {
               public Fleet(string fleetId, string fleetName)
               {
                     FleetId = fleetId;
                     FleetName = fleetName
               }
               public string FleetId {get;set;}
               public string FleetName {get;set;}
          }
          

          或者,您可以通过使用匿名类型完全消除对 Fleet 类的需求...

          while (drd.Read())
          {
              cmbTripName.Items.Add(new {FleetId = drd["FleetID"].ToString(), FleetName = drd["FleetName"].ToString()});
          }
          cmbTripName.ValueMember = "FleetId";
          cmbTripName.DisplayMember = "FleetName";
          

          【讨论】:

            【解决方案7】:

            您将不得不完全重新编写代码。 DisplayMemberValueMember 指向 columnNames!此外,您应该真正使用using block - 这样连接会在查询执行后disposed(并且close)。

            我没有使用 dataReader 来访问值,而是选择了 dataTable 并将其作为 dataSource 绑定到组合框上。

            using (SqlConnection conn = new SqlConnection(@"Data Source=SHARKAWY;Initial Catalog=Booking;Persist Security Info=True;User ID=sa;Password=123456"))
            {
                try
                {
                    string query = "select FleetName, FleetID from fleets";
                    SqlDataAdapter da = new SqlDataAdapter(query, conn);
                    conn.Open();
                    DataSet ds = new DataSet();
                    da.Fill(ds, "Fleet");
                    cmbTripName.DisplayMember =  "FleetName";
                    cmbTripName.ValueMember = "FleetID";
                    cmbTripName.DataSource = ds.Tables["Fleet"];
                }
                catch (Exception ex)
                {
                    // write exception info to log or anything else
                    MessageBox.Show("Error occured!");
                }               
            }
            

            使用 dataTable 可能比 dataReader 慢一点,但我不必创建自己的类。如果您真的必须/想要使用 DataReader,您可以选择 @Nattrass 方法。在任何情况下你都应该写一个using block

            编辑

            如果你想获取组合框的当前值,试试这个

            private void cmbTripName_SelectedIndexChanged(object sender, EventArgs e)
            {
                if (cmbTripName.SelectedItem != null)
                {
                    DataRowView drv = cmbTripName.SelectedItem as DataRowView;
            
                    Debug.WriteLine("Item: " + drv.Row["FleetName"].ToString());
                    Debug.WriteLine("Value: " + drv.Row["FleetID"].ToString());
                    Debug.WriteLine("Value: " + cmbTripName.SelectedValue.ToString());
                }
            }
            

            【讨论】:

            • 它现在可以工作,但我需要插入 ValueMember 和 displaymember 到标签 `label1.Text = cmbTripName.DisplayMember; label2.Text = cmbTripName.ValueMember;`
            • 结果:SYSTEM.DATA.DATAROWVIEW 不是名称
            • @AhmedSharkawy 你找到“SYSTEM.DATA.DATAROWVIEW”的解决方案了吗,因为我仍然被困在里面!
            【解决方案8】:

            在循环之外,设置以下。

            cmbTripName.ValueMember = "FleetID"
            cmbTripName.DisplayMember = "FleetName"
            

            【讨论】:

            • 应该为这些属性设置列名。您已设置数据值。这就是问题
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多