2012-09-19 62 views
8

Tôi có một lỗi với một comboboxĐiền Combobox từ cơ sở dữ liệu

Mã của tôi:

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

Dữ liệu được thể hiện trong combobox, nhưng khi bạn thay đổi lựa chọn valuemember các displaymember không thay đổi.

Đó là làm việc bây giờ nhưng khi tôi nhấp vào nút để hiển thị dữ liệu

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

này được hiển thị:

FleetName
FleetID

Nó không hiển thị giá trị

Trả lời

12

Bạn sẽ phải viết lại hoàn toàn mã của mình. DisplayMemberValueMember trỏ tới cộtNames! Hơn nữa, bạn thực sự nên sử dụng số using block - vì vậy kết nối được được xử lý (và đóng) sau khi thực hiện truy vấn.

Thay vì sử dụng một DataReader để truy cập các giá trị Tôi chọn lựa một DataTable và ràng buộc nó như là nguồn dữ liệu vào combobox.

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

Sử dụng một DataTable có thể là một chút chậm hơn một DataReader nhưng tôi không cần phải tạo ra lớp riêng tôi. Nếu bạn thực sự phải/muốn sử dụng DataReader bạn có thể chọn @Nattrass approach. Trong mọi trường hợp, bạn nên viết using block!

EDIT

Nếu bạn muốn nhận được giá trị hiện tại của combobox thử này

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

nó hoạt động ngay bây giờ nhưng tôi cần phải chèn ValueMember và displaymember vào nhãn 'label1.Text = cmbTripName.DisplayMember; label2.Text = cmbTripName.ValueMember; ' –

+0

KẾT QUẢ: SYSTEM.DATA.DATAROWVIEW KHÔNG THEO TÊN –

1

Ngoài vòng lặp, hãy đặt sau.

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

có nên đặt tên cột cho những tài sản. Bạn đã đặt các giá trị dữ liệu. Đó là vấn đề – Prasanna

7

Để sử dụng Combobox theo cách bạn định, bạn có thể chuyển đối tượng vào phương pháp cmbTripName.Items.Add.

Đó đối tượng nên có FleetIDFleetName tính:

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

Các Fleet Class:

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

Hoặc Bạn có thể có thể loại bỏ sự cần thiết của một lớp Fleet hoàn toàn bằng cách sử dụng một ẩn danh loại ...

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

Một số giải thích đằng sau cách mã hoạt động sẽ có lợi. – 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()); 
} 
Các vấn đề liên quan