2014-11-25 6 views
0

У меня есть два списка (регионы и отделы), когда моя форма загружает список Регионов, заполнен 4 регионами (Midwest, NorthEast, South, West). Когда я нажимаю на один из этих регионов, я хочу, чтобы список перечней был заполнен делениями, относящимися к области, которая была нажата. Я работаю через репозиторий данных, который связывается с моим SQL-db. Первоначальное население при виде нагрузкиКак заполнить список на основе выбранного элемента из другого списка?

StateRepository sr = new StateRepository(); 
foreach (string s in sr.GetRegions()) 
{ 
    lstRegions.Items.Add(s); 
} 

код позади метода GetRegions:

public IEnumerable<string> GetRegions() 
{ 
    try 
    { 
     List<string> results = new List<string>(); 
     using (var conn = new SqlConnection(Settings.Default.StateAnalysisConnection)) 
     { 
      using (var cmd = conn.CreateCommand()) 
      { 
       cmd.CommandText = "Select * From Regions "; 
       conn.Open(); 
       using (var reader = cmd.ExecuteReader()) 
       { 
        while (reader.Read()) 
        { 
         results.Add((string)reader["Region"]); 
        } 
       } 
      } 
     } 

     return results; 
    } 
    catch (Exception ex) 
    { 
     throw new Exception("Database error in StateRepository", ex); 
    } 
    finally 
    { 
     if (connection.State == ConnectionState.Open) 
      connection.Close(); 
    } 
} 

Метод, который получает подразделения в регионе из БД:

public IEnumerable<string> GetDivisionsInRegion(string region) 
{ 
    try 
    { 
     List<string> results = new List<string>(); 
     var divisions = new List<string>(); 
     using (var conn = new SqlConnection(Settings.Default.StateAnalysisConnection)) 
     { 
      using (var cmd = conn.CreateCommand()) 
      { 
       cmd.CommandText = "Select Division From Divisions " 
        + "Where Region = '" + region + "'"; 
       conn.Open(); 
       using (var reader = cmd.ExecuteReader()) 
       { 
        while (reader.Read()) 
        { 
         results.Add((string)reader["Division"]); 
        } 
       } 
      } 
     } 

     return results; 
    } 
    catch (Exception ex) 
    { 
     throw new Exception("Database error in StateRepository", ex); 
    } 
    finally 
    { 
     if (connection.State == ConnectionState.Open) 
      connection.Close(); 
    } 
} 

ответ

1

В SelectedIndexChanged случае ваш список Regions, получите выбранный регион, затем используйте его в своем методе GetDivisionsInRegion и заполните Divisions listbox с результатом.

private void Regions_SelectedIndexChanged(object sender, System.EventArgs e) 
{ 
    // Get the currently selected item in the ListBox. 
    string region = Regions.SelectedItem.ToString(); 

    // Find the divisions in the region 
    IEnumerable<string> divisions = GetDivisionsInRegion(region); 

    //set as this as the new data source for your Divisions listbox 
    Divisions.DataSource = divisions; 
} 

Хотя я думаю, что вы, возможно, придется либо отливать дивизий List<string> или получить GetDivisionsInRegion, чтобы возвращать List<string>.

+0

Хорошо, это сработало хорошо, и я применил его к третьему списку. Но в третьем поле он использует метод ToString() моего класса. Поэтому вместо StateAbberv я получаю краткое описание моего состояния. Есть ли способ обойти это? – ScottT

+0

отбросить его к вашему объекту, затем использовать свойство (StateAbbrev, возможно?), Чтобы получить нужное значение. – monty

Смежные вопросы