2010-06-24 6 views
2

OMG Cela fait deux jours que je fais cela et je n'arrive toujours pas à trouver la solution. Voici mon scénario:Remplir la zone de liste déroulante en fonction de l'index sélectionné depuis une autre zone de liste déroulante

J'ai trois contrôles de boîtes combo et j'ai besoin de charger des données du jeu de données de manière dinamique.

  • cbCode1 est rempli avec la forme de chargement.
  • cbCode2 est peuplée lorsque l'indice sélectionné parmi cbCode1 change
  • cbCode3 est Remplit lorsque l'indice sélectionné de cbCode1 change

les données proviennent de deux champs dans la DATSET « description » et « id_code ». Donc, je veux associer la valeur de la description avec son identifiant. Parce que je dois demander plus tard ..

Dans la forme de charge que j'ai ceci:

cbCode1.DataSource = D.Tables [0]; cbCode1.DisplayMember = D.Tables [0] .Colonnes ["description"]. ColumnName; cbCode1.ValueMember = D.Tables [0] .Colonnes ["id_code"]. ColumnName;

Maintenant, lorsque l'indice sélectionné des changements de cbcode1:

private void cbCode1_SelectedIndexChanged(object sender, EventArgs e) 
    { 

     // Get dataset from DB 
     DataSet D = new DataSet(); 
     D = reason_get(1, 1, 1); // IdStation, Active, Level 

     // Ensure the cbcode2 is cleared 
     cbCode2.Items.Clear(); 
     string SelectedValue = cbCode1.SelectedValue.ToString(); 

     foreach (DataRow row in D.Tables[0].Rows) 
     { 


      if (row["id_parent_code"].ToString() == SelectedValue) 
      { 

       cbCode2.DataSource = D.Tables[0]; 
       cbCode2.DisplayMember = D.Tables[0].Columns["description"].ColumnName; 
       cbCode2.ValueMember = D.Tables[0].Columns["id_code"].ColumnName; 

       cbCode2.SelectedIndex = 0; 

      } 
     } 



    } 

Ce code ne fonctionne pas, je ne sais pas ce que je fais mal. s'il vous plaît aider à résoudre ce problème?

Merci d'avance!

Un programmeur débutant ..

+0

Utilisez de meilleurs noms de variables que 'cbCode1' et' cbCode2'. Utilisez un nom qui indique réellement ce que la valeur signifie. – unholysampler

Répondre

0

Je ne l'ai pas fait cela avant, mais je l'ai fait quelque chose de similaire pour une datagridview. Ce que vous devez faire est d'utiliser actionlisteners. Fondamentalement remplissez la première zone de liste déroulante, puis ajoutez un actionlistener pour qu'il soit appelé lorsque l'index sélectionné change. Au sein de ce actionlistener l'avoir remplir la deuxième zone de liste déroulante.

-1

essayer de le faire, comme ci-dessous le code ...

private void Form1_Load (object sender, EventArgs e) { FillCountry();

} 

    private void FillCountry() 
    { 
     string str = "SELECT CountryID, CountryName FROM Country"; 
     SqlCommand cmd = new SqlCommand(str,con); 
     //cmd.Connection = con; 
     //cmd.CommandType = CommandType.Text; 
     // cmd.CommandText = "SELECT CountryID, CountryName FROM Country"; 
     DataSet objDs = new DataSet(); 
     SqlDataAdapter dAdapter = new SqlDataAdapter(); 
     dAdapter.SelectCommand = cmd; 
     con.Open(); 
     dAdapter.Fill(objDs); 
     con.Close(); 
     comboBox1.ValueMember = "CountryID"; 
     comboBox1.DisplayMember = "CountryName"; 
     comboBox1.DataSource = objDs.Tables[0]; 
    } 

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (comboBox1.SelectedValue.ToString() != "") 
     { 
      int CountryID = Convert.ToInt32(comboBox1.SelectedValue.ToString()); 
      FillStates(CountryID); 
      comboBox3.SelectedIndex = 0; 
     } 
    } 

    private void FillStates(int countryID) 
    { 
     string str = "SELECT StateID, StateName FROM State WHERE CountryID [email protected]"; 
     SqlCommand cmd = new SqlCommand(str, con); 
     // SqlConnection con = new SqlConnection(Con); 
     // cmd.Connection = con;   
     // string str="SELECT StateID, StateName FROM State WHERE CountryID [email protected]"; 
     // cmd.Connection = con; 
     //cmd.CommandType = CommandType.Text; 
     // cmd.CommandText = "SELECT StateID, StateName FROM State WHERE CountryID [email protected]"; 
     cmd.Parameters.AddWithValue("@CountryID", countryID); 
     DataSet objDs = new DataSet(); 
     SqlDataAdapter dAdapter = new SqlDataAdapter(); 
     dAdapter.SelectCommand = cmd; 
     con.Open(); 
     dAdapter.Fill(objDs); 
     con.Close(); 
     if (objDs.Tables[0].Rows.Count > 0) 
     { 
      comboBox2.ValueMember = "StateID"; 
      comboBox2.DisplayMember = "StateName"; 
      comboBox2.DataSource = objDs.Tables[0]; 
     } 
    } 

    private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     int StateID = Convert.ToInt32(comboBox2.SelectedValue.ToString()); 
     FillCities(StateID); 
    } 


    private void FillCities(int stateID) 
    { 
     //SqlConnection con = new SqlConnection(str,con); 
     string str = "SELECT CityID, CityName FROM City WHERE StateID [email protected]"; 
     SqlCommand cmd = new SqlCommand(str,con); 
     // cmd.Connection = con; 
     //cmd.CommandType = CommandType.Text; 
     // cmd.CommandText = "SELECT CityID, CityName FROM City WHERE StateID [email protected]"; 
     cmd.Parameters.AddWithValue("@StateID", stateID); 
     DataSet objDs = new DataSet(); 
     SqlDataAdapter dAdapter = new SqlDataAdapter(); 
     dAdapter.SelectCommand = cmd; 
     con.Open(); 
     dAdapter.Fill(objDs); 
     con.Close(); 
     if (objDs.Tables[0].Rows.Count > 0) 
     { 
      comboBox3.DataSource = objDs.Tables[0]; 
      comboBox3.DisplayMember = "CityName"; 
      comboBox3.ValueMember = "CItyID"; 

     } 
Questions connexes