从数据库中填充下拉框

13

我有一个下拉框(comboBox)的错误

我的代码:

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 ");
}

数据呈现在组合框中,但是当你改变选中的值成员(valumember)时,显示成员(displaymember)并没有一起改变。

现在它可以工作,但是当我点击按钮来展示数据时。

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

这将会显示:

FleetName
FleetID

它不会显示实际的数值。

8个回答

23
您需要完全重新编写代码。 DisplayMemberValueMember 指向 columnNames! 此外,您应该真正使用一个using块 - 这样连接在查询执行后就会被释放(和关闭)。

我选择使用dataTable作为数据源,并将其绑定到comboBox上,而不是使用dataReader来访问值。

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插入并显示到标签中。label1.Text = cmbTripName.DisplayMember; label2.Text = cmbTripName.ValueMember; - Ahmed Sharkawy
1
结果应该是 SYSTEM.DATA.DATAROWVIEW,而不是名称。 - Ahmed Sharkawy
@AhmedSharkawy,你找到“SYSTEM.DATA.DATAROWVIEW”的解决方案了吗?因为我还卡在这里! - zsubzwary

8
要按照您的意图使用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;}
}

或者,您可能可以通过使用匿名类型完全省去对类的需要...
while (drd.Read())
{
    cmbTripName.Items.Add(new {FleetId = drd["FleetID"].ToString(), FleetName = drd["FleetName"].ToString()});
}
cmbTripName.ValueMember = "FleetId";
cmbTripName.DisplayMember = "FleetName";

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();

}

2
请不要仅仅在答案中粘贴您的代码。请尝试至少提供简要说明。参见:https://stackoverflow.com/help/how-to-answer - sɐunıɔןɐqɐp
请通过添加一些解释(和可能的格式)来改善您的仅代码答案。这样你可以更明显地帮助提问者。而且,你也不想给人留下你提供免费代码编写服务的印象,对吗? - Yunnosch

1
            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();

2
代码背后的一些解释会有益处。 - rayryeng

1
在循环外设置以下内容。
cmbTripName.ValueMember = "FleetID"
cmbTripName.DisplayMember = "FleetName"

应该为这些属性设置列名。你已经设置了数据值。那就是问题所在。 - Prasanna

0
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());
}

0

试试这个:

  1.  

    使用 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");
            }
        }
    }
    

0
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
         }
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接