从数据库填充组合框

问题描述 投票:0回答:9

我的组合框出现错误

我的代码:

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
9个回答
23
投票

您将必须完全重写您的代码。 DisplayMemberValueMember指向columnNames!此外,您确实应该使用

using block
- 因此连接在查询执行后会被 dispose (和 lined)。

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

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 块

编辑

如果您想获取组合框的当前值,请尝试此

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

8
投票
要按照您想要的方式使用

Combobox

,您可以将一个对象传递给 
cmbTripName.Items.Add
 方法。

该对象应该具有

FleetID

FleetName
 属性:

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

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

1
投票
在环路外侧,设置如下。

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

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

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

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.  

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

0
投票
你应该这样使用

private void button1_Click(object sender, EventArgs e) { label1.Text = cmbTripName.Text; label2.Text = cmbTripName.SelectedValue.ToString(); }
    
© www.soinside.com 2019 - 2024. All rights reserved.