2010-10-30 67 views
2

我有4個表 - 代理,客戶,縣和城鎮。代理商和客戶都有一個鎮域和一個縣域。我有一個DataGridView每個表。這些工作很好。我使用城鎮縣作爲數據源的鎮和縣作爲組合框。C#WinForms - 基於數據綁定datagridview中另一個組合框的值過濾一個組合框

問題是它不會根據選定的縣過濾城鎮。我希望這樣做,但沒有選項可以根據另一個字段的值過濾組合框。

我已經搜索了一段時間,但無法找到有用的東西。

任何人都可以通過如何做到這一點告訴我嗎?

在此先感謝。

問候,

理查德

PS我使用Visual Studio 2010中,大多設計視圖。

+0

您是否在使用像SqlDataSource或ObjectDataSource這樣的DataSource對象來獲取縣?如果你這樣做,那麼你應該通過一個選擇參數來過濾縣,具體取決於Town DropDown中選擇的值。 – 2010-10-30 11:00:43

+0

我正在使用一個DataSet和一個mdf文件。我將表拖到DataSet上,然後我使用那裏顯示的表來可視化DataGridViews中的數據。對不起,如果我的措辭不正確 - 我只在2天前開始使用C#。 – ClarkeyBoy 2010-10-30 11:02:29

+0

@ClarkeyBoy,提供相關代碼。 – mahesh 2010-10-30 11:16:09

回答

1

爲了能夠做到這一點,你應該有一個國家外鍵字段在你城鎮表。

如果你有它,問題可能在於你的Towns組合框是如何數據綁定的,即選擇Datasource屬性。你不應該把它直接綁定到城鎮表,而是綁定到國家表的城鎮「外鍵」。我認爲你可以在設計視圖中做到這一點。

+0

認爲這可能是它。它剛開始的時候就是文字,但從那以後,我取得了很多進展,現在增加了諸如鎮/縣查找之類的東西,而不是像一個客戶的Blandford,而是另一個客戶的Blandford論壇。這樣,每個城鎮都會有一個名稱,因此搜索結果會更準確。 – ClarkeyBoy 2010-10-30 11:33:36

5

可以使用DataView爲您的組合框數據源,因爲這可以讓你篩選基於一個標準(通過RowFilter屬性)行。我將展示一個簡單的例子,涉及用於選擇該國家和鄉鎮的兩個組合框。


首先,設置一些數據要使用:

// set up DataTable with countries: 
countriesTable = new DataTable("Countries"); 
countriesTable.Columns.Add("CountryID", typeof(int)); 
countriesTable.Columns.Add("CountryName", typeof(string)); 
countriesTable.Rows.Add(1, "England"); 
countriesTable.Rows.Add(2, "Spain"); 
... 

// set up DataTable with towns: 
townsTable = new DataTable("Towns"); 
townsTable.Columns.Add("TownID", typeof(int)); 
townsTable.Columns.Add("TownName", typeof(string)); 
townsTable.Columns.Add("CountryID", typeof(int)); // <-- this is a foreign key 
townsTable.Rows.Add(1, "London", 1); 
townsTable.Rows.Add(2, "Brighton", 1); 
townsTable.Rows.Add(3, "Barcelona", 2); 
... 

接着,組合框數據綁定到數據:

// bind countries to country combobox: 
countryComboBox.DataSource = null; 
countryComboBox.DisplayMember = "CountryName"; 
countryComboBox.ValueMember = "CountryID"; 
countryComboBox.DataSource = countriesTable; 

// bind towns to town combobox:  
townsView = new DataView(townsTable, "CountryID = 1", ...); // use foreign key 
townComboBox.DataSource = null;        // in a row filter 
townComboBox.DisplayMember = "TownName"; 
townComboBox.ValueMember = "TownID"; 
townComboBox.DataSource = townsView; 

最後,無論何時在國家組合框中選擇另一個國家/地區,請更新行過濾器ER:

private void countryComboBox_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    ... 
    townsView.RowFilter = string.Format("CountryID = {0}", 
              countryComboBox.SelectedValue); 
} 

我相信你可以使用數據綁定和一個自定義Format事件處理程序自動完成這最後一步,但我不會詳談。

+0

這看起來是正確的答案(或者在任何情況下都是正確答案)。我正在研究它,如果我以這種方式解決問題,它將標記爲答案。 – ClarkeyBoy 2010-10-30 12:05:46

+0

我在事件SelectedIndexSelected處收到'System.NullReferenceException'。目前,我不知道爲什麼,但在交換'countryComboBox.DataSource = countriesTable;'行後用'countryComboBox.ValueMember =「CountryID」;'它的工作正常。 – 2015-01-27 16:55:10

+0

@DanielBonetti:謝謝你的提示。我修復了我的代碼。額外的初始'DataSource = null'確保新的'DisplayMember'和'ValueMember'不會被應用到一些以前設置的數據源。由於性能方面的考慮,''DisplayMember'和'ValueMember'應該總是設置'DataSource' *。 – stakx 2015-01-27 17:18:06

-1

這是我的新答案。事實證明我看錯了這個問題(抱歉)。在我的示例中,我正在使用OleDb連接到Access數據庫。這是我正在使用的應用程序的代碼片段(組合框和表格的名稱已被更改爲示例)。它所做的只是在comboBox1上更改選擇時查詢數據庫並將結果添加到comboBox2。

  private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     try 
     { 
      //Open connection to database... 
      connection.Open(); 
      OleDbCommand command = new OleDbCommand(); 
      command.Connection = connection; 
      string query1 = "select * from Your_Table where Title='" + comboBox1.Text + "'"; 
      command.CommandText = query1; 

      OleDbDataReader reader1 = command.ExecuteReader(); 
      while (reader1.Read()) 
      { 
       comboBox2.Items.Add(reader1["ColumnName"].ToString()); 
      } 
      connection.Close(); 
     } 
     catch (System.Exception ex) 
     { 
      MessageBox.Show("Error " + ex); 
     } 
    } 

這將基於comboBox1查詢您的數據庫,並根據您的選擇將結果放在comboBox2中。

希望這會有所幫助!

+0

該問題被要求過濾組合框,而不是datagridview。 BindingSource不能過濾ComboBox。 – 2016-12-24 05:28:33

+0

我的確讀過這個問題了。希望在你給我負面評價之前,我會抓住那個......謝謝你! – 2017-01-10 20:52:36

相關問題