2012-09-19 20 views
8

Tengo un error con un cuadro combinadoLlenar ComboBox desde la base de datos

Mi código:

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

Los datos se presentan en el cuadro combinado, pero cuando se cambia la selección ValueMember la DisplayMember no cambia.

que está funcionando ahora, pero cuando haga clic en el botón para mostrar los datos

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

Ésta se visualiza:

FleetName
FleetID

No muestra el valor

Respuesta

12

Tendrá que volver a escribir completamente su código. DisplayMember y ValueMember point to columnNames! Además, debería utilizar realmente un using block - por lo que la conexión obtiene dispuesta (y cerrada) después de la ejecución de la consulta.

En lugar de utilizar un dataReader acceder a los valores Elegí un dataTable y lo envolvieron como dataSource en el cuadro combinado.

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

utilizando un dataTable puede ser un poco más lenta que un dataReader pero no tengo que crear mi propia clase. Si realmente tiene que/quiere hacer uso de un DataReader puede elegir @Nattrass enfoque. En cualquier caso, debe escribir un using block!

EDITAR

Si desea obtener el valor actual del cuadro combinado probar este

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

funciona pero necesito insertar ValueMember y displaymember en la etiqueta 'label1.Text = cmbTripName.DisplayMember; label2.Text = cmbTripName.ValueMember; ' –

+0

EL RESULTADO: SYSTEM.DATA.DATAROWVIEW NOT THE NAMES –

1

Fuera del bucle, configure lo siguiente.

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

deben establecer los nombres de columna para esas propiedades. Usted ha establecido los valores de los datos. Ese es el problema – Prasanna

7

Para utilizar el Combobox en la forma en que la intención, que podría pasar en un objeto con el método cmbTripName.Items.Add.

Ese objeto debe tener FleetID y FleetName propiedades:

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

El Fleet Clase:

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

O Probablemente se podría eliminar la necesidad de una clase Fleet por completo mediante el uso de un anónimo tipo ...

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

Alguna explicación de cómo funciona el código sería beneficioso. – 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()); 
} 
Cuestiones relacionadas