2012-09-19 19 views
8

填充組合框我有一個錯誤在具有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 "); 
} 

數據呈現在組合框中,但是當你更改選擇valuemember將DisplayMember不會改變。

它現在的工作,但是當我點擊按鈕顯示

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

這是顯示的數據:

FleetName
FleetID

它不顯示值

回答

12

您將不得不完全重新編寫代碼。 DisplayMember and ValueMember指向columnNames!此外,您應該確實使用using block - 因此在查詢執行後,連接獲得處置(和關閉)。

代替使用的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的但我沒有創建自己的類。如果你真的必須/想要利用數據讀取器你可以選擇@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()); 
    } 
} 
+0

它現在的工作,但我需要插入ValueMember和顯示成員來標記 'label1.Text = cmbTripName.DisplayMember; label2.Text = cmbTripName.ValueMember;' –

+0

結果:SYSTEM.DATA.DATAROWVIEW不是名字 –

1

在循環外側,設置如下。

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

如果這些屬性設置列名。您已設置數據值。這是問題 – Prasanna

7

要在你想讓你的方式使用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"; 
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
  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

代碼工作方式的一些解釋是有益的。 – rayryeng

0
string query = "SELECT column_name FROM table_name";  //query the database 
SqlCommand queryStatus = new SqlCommand(query, myConnection); 
sqlDataReader reader = query.ExecuteReader();        

while (reader.Read()) //loop reader and fill the combobox 
{ 
ComboBox1.Items.Add(reader["column_name"].ToString()); 
}