2017-05-13 2 views
0

Ich habe den folgenden C# -Code, der funktioniert. Wenn ich also das Dropdown-Menü "Land" auswähle, wird das Dropdown-Menü "Status" ausgefüllt.Cascading-Dropdown-Steuerelemente

Was ich versuche zu tun, wenn das Dropdown-Menü State (ComboBox2) ausgewählt ist, sollte das entsprechende Land (ComboBox1) selectedIndex auf das jeweilige Land geändert werden.

Beispiel: Wenn Gujrat ausgewählt wird Indien

im ersten comboBox1 zeigen sollte
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

using System.Data.SqlClient; 

namespace cascadingdropdownlist 
{ 
    public partial class Form1 : Form 
    { 
     SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"); 
     DataRow dr; 

     public Form1() 
     { 
      InitializeComponent(); 
      refreshdata(); 
     } 

     public void refreshdata() 
     { 
      con.Open(); 
      SqlCommand cmd = new SqlCommand("select * from tbl_country", con); 
      SqlDataAdapter sda = new SqlDataAdapter(cmd); 
      DataTable dt = new DataTable(); 
      sda.Fill(dt); 
      con.Close(); 
      dr = dt.NewRow(); 
      dr.ItemArray = new object[] { 0, "--Select Country--" }; 
      dt.Rows.InsertAt(dr, 0); 
      comboBox1.ValueMember = "countryid"; 
      comboBox1.DisplayMember = "countryname"; 
      comboBox1.DataSource = dt; 
     } 

     private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (comboBox1.SelectedValue.ToString()!= null) 
      { 
       int countryid = Convert.ToInt32(comboBox1.SelectedValue.ToString()); 
       refreshstate(countryid); 
      } 
     } 

     public void refreshstate(int countryid) 
     { 
      con.Open(); 
      SqlCommand cmd = new SqlCommand("select * from tbl_state where countryid= @countryid", con); 
      cmd.Parameters.AddWithValue("countryid", countryid); 
      SqlDataAdapter sda = new SqlDataAdapter(cmd); 
      DataTable dt = new DataTable(); 
      sda.Fill(dt); 
      con.Close(); 
      dr = dt.NewRow(); 
      dr.ItemArray = new object[] { 0, "--Select State--" }; 
      dt.Rows.InsertAt(dr, 0); 

      comboBox2.ValueMember = "stateid"; 
      comboBox2.DisplayMember = "statename"; 
      comboBox2.DataSource = dt; 
     } 
    } 
} 

Screens enter image description hereenter image description hereenter image description here

+1

Ohne Land, werden Staaten nicht nach deinem Code gefüllt werden? Wie können Sie den Status für ein anderes als das ausgewählte Land auswählen? – Krishna

+0

@Krishna Standardmäßig werden beide Dropdown-Felder beim Laden des Formulars alle Status und alle Länder anzeigen. – user580950

+0

Ich sehe es nicht in der Form laden, ich sehe nur Länderdaten laden, egal, was ist das Problem, vor dem Sie stehen? – Krishna

Antwort

0

Es gibt zwei Wege Kaskadierung Objekte sein. Wenn Sie am Anfang Comboboxen geladen haben, sollten Sie das Ereignis combobox2 selection change behandeln. Anstatt sich mit dem Wert zu befassen, können Sie den SelectedValue einfach in das entsprechende Objekt wie folgt umwandeln, sodass Sie den Wert für counticid extrahieren können. Dann sollten Sie nur den selectedValue der Combobox1 setzen. Sie sollten beachten, dass es einen Teufelskreis geben wird, wenn Sie die Ausführung von comboBox1_SelectedIndexChanged nicht verhindern. So habe ich doNotCascade = true;, um dieses Problem hervorzuheben, und Sie sollten diese Variable in der Ereignisbehandlungsroutine comboBox1_SelectedIndexChanged überprüfen.

Hoffnung hilft.

private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    DataRowView item = comboBox2.SelectedItem as DataRowView; 
    if (item != null && this.comboBox2.SelectedIndex != 0) 
    { 
     doNotCascade = true; 
     this.comboBox1.SelectedValue = item.Row[2]; 
    } 
} 
0

Zunächst müssen Sie dies einen sub query für schreiben:

create proc sp_FindCountryName 
@stateName varchar(40) 
as 
begin 
    select countryName from country where countryID=(
    select countryID from [State] where [email protected]) 
end 

dann implementieren, um die comboBox2_SelectedIndexChanged Methode (hier cbState die zweite comboBox ist)

private void cbState_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (cbState.SelectedValue.ToString() != null) 
    { 
     string stateName = this.cbState.GetItemText(this.cbState.SelectedItem); 
     retriveCountryName(stateName); 
    } 

} 

private void retriveCountryName(string stateName) 
{ 
    using (con = new SqlConnection(connectionString)) 
    { 
     con.Open(); 
     SqlCommand cmd = new SqlCommand("sp_FindCountryName", con); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@stateName", stateName); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     DataTable dt = new DataTable(); 
     da.Fill(dt); 
     dr = dt.NewRow(); 
     cbCountry.ValueMember = "countryID"; 
     cbCountry.DisplayMember = "countryName"; 
     cbCountry.DataSource = dt; 

    } 
}