¿Cuál es la forma correcta de llenar una DropDownList desde una base de datos?

Estoy completando una DropDownList desde una base de datos de SQL Server como se muestra a continuación. Funciona bien, pero no estoy seguro de que sea una buena forma. ¿Alguien puede arrojar algo de luz sobre este método y dar algunas mejoras?

private void LoadSubjects() { ddlSubjects.Items.Clear(); string selectSQL = "SELECT SubjectID,SubjectName FROM Students.dbo.Subjects"; SqlConnection con = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand(selectSQL, con); SqlDataReader reader; try { ListItem newItem = new ListItem(); newItem.Text = ""; newItem.Value = "0"; ddlSubjects.Items.Add(newItem); con.Open(); reader = cmd.ExecuteReader(); while (reader.Read()) { newItem = new ListItem(); newItem.Text = reader["SubjectName"].ToString(); newItem.Value = reader["SubjectID"].ToString(); ddlSubjects.Items.Add(newItem); } reader.Close(); } catch (Exception err) { //TODO } finally { con.Close(); } } 

Puede vincular DropDownList a una fuente de datos (DataTable, List, DataSet, SqlDataSource, etc.).

Por ejemplo, si quiere usar una DataTable:

 ddlSubject.DataSource = subjectsTable; ddlSubject.DataTextField = "SubjectNamne"; ddlSubject.DataValueField = "SubjectID"; ddlSubject.DataBind(); 

EDITAR – Ejemplo más completo

 private void LoadSubjects() { DataTable subjects = new DataTable(); using (SqlConnection con = new SqlConnection(connectionString)) { try { SqlDataAdapter adapter = new SqlDataAdapter("SELECT SubjectID, SubjectName FROM Students.dbo.Subjects", con); adapter.Fill(subjects); ddlSubject.DataSource = subjects; ddlSubject.DataTextField = "SubjectNamne"; ddlSubject.DataValueField = "SubjectID"; ddlSubject.DataBind(); } catch (Exception ex) { // Handle the error } } // Add the initial item - you can add this even if the options from the // db were not successfully loaded ddlSubject.Items.Insert(0, new ListItem(" 

Para establecer un valor inicial mediante el marcado, en lugar de código subyacente, especifique la (s) opción (es) y establezca el atributo AppendDataBoundItems en verdadero:

    

A continuación, puede vincular la DropDownList a un DataSource en el código subyacente (solo recuerde eliminar:

 ddlSubject.Items.Insert(0, new ListItem(" 

del código subyacente, o tendrá dos “” elementos.

Espero no exagerar lo obvio, pero ¿por qué no hacerlo directamente en ASP? A menos que esté alterando dinámicamente el SQL en función de ciertas condiciones en su progtwig, debe evitar codebehind tanto como sea posible.

Puede hacer todo lo anterior en ASP directamente sin código usando el control SqlDataSource y una propiedad en su lista desplegable.

            
 public void getClientNameDropDowndata() { getConnection = Connection.SetConnection(); // to connect with data base Configure manager string ClientName = "Select ClientName from Client "; SqlCommand ClientNameCommand = new SqlCommand(ClientName, getConnection); ClientNameCommand.CommandType = CommandType.Text; SqlDataReader ClientNameData; ClientNameData = ClientNameCommand.ExecuteReader(); if (ClientNameData.HasRows) { DropDownList_ClientName.DataSource = ClientNameData; DropDownList_ClientName.DataValueField = "ClientName"; DropDownList_ClientName.DataTextField="ClientName"; DropDownList_ClientName.DataBind(); } else { MessageBox.Show("No is found"); CloseConnection = new Connection(); CloseConnection.closeConnection(); // close the connection } } 
 ((TextBox)GridView1.Rows[e.NewEditIndex].Cells[3].Controls[0]).Enabled = false;