2015-03-30 45 views
0

我有comboboxdatatable如何確定與組合框共享列的數據表的行索引

我已將datatable中的一列中的所有元素添加到combobox項。 現在每當用戶在組合框中選擇一個項目,我想要去datatable並比較列,如果有匹配,它會做一些代碼。

我有以下

 private void comboBox8_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     string str = comboBox8.SelectedItem.ToString(); 
     int z = 0; 
     foreach (var row in datatable.Rows) 
     { 
      int i = 0; i++; 

      if (datatable.Rows[row]["Cidade"] == str) 
      { 

       z = i; 
      } 

     } 
    } 

「CIDADE」是匹配在組合框中的選項列名。 的問題是,該代碼不識別ìf`條件是有效的,說有無效的參數

編輯:曾其周圍像這樣:

private void comboBox8_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     string str = comboBox8.SelectedItem.ToString(); 

     int z = 0; 


     for (int i = 0; i < DataAccess.Instance.tabelasismica.Rows.Count; i++) 
     { 

      if (DataAccess.Instance.tabelasismica.Rows[i]["Cidade"] == str) 
      { 

       z = i; 
      } 

     } 
     MessageBox.Show(z.ToString()); 
     MessageBox.Show(DataAccess.Instance.tabelasismica.Rows[z]["Cidade"].ToString()); 
    } 

回答

2

標準的方法是使用數據綁定。你只需將你的ComboBox的DataSource設置爲你的DataTable。該代碼將大致是這樣的:

comboBox8.DataSource = datatable; 
comboBox8.DisplayMember = "Cidade" 
comboBox8.ValueMember = "PrimaryKeyColumnOfYourTable" 

現在在SelectedIndexChanged情況下,您只需使用comboBox8.SelectedValue屬性來獲取選定行的ID。如果您已強制鍵入DataSet,則DataTable將具有名爲FindByYourPKColumn()的函數,您可以使用該函數查找使用此ID的行。

+0

「primarykeycolumn」是指填充整數的列嗎?什麼是「強類型」數據集?我一直在避免使用數據集,因爲我已經使用單個數據表完成了相同的工作 – ng80092b 2015-03-30 19:21:53

+1

@ ng80092b:主鍵列不需要是整數,它只需要是表的主鍵。您可能需要查閱一些基本的RDBMS書籍,以瞭解更多詳情。關於強類型的DataSets,您的案例涉及的唯一真實的事情就是'DataTable'本身。唯一的問題是,內置的DataSet設計器不能處理孤立的DataTable,所以即使你有一個表,你也需要創建一個DataSet讓設計者爲你提供設計器表面(爲了拖拽n-放下桌子,做其他事情)。 – dotNET 2015-03-30 19:30:47

+0

請看看,謝謝 – ng80092b 2015-03-30 19:34:37

1

datatable.Rows[row]["Cidade"]object型的 - 你需要將其轉換爲字符串比較它爲str,這樣前:做這樣的事情的

if (datatable.Rows[row]["Cidade"].ToString() == str) 
{ ... } 
+0

謝謝你,但我有'for'週期解決它,而不將其設置爲一個字符串。我將編輯我的答案,並展示如何圍繞工作吧。你可以看看並解釋爲什麼用'for'循環我不需要將它設置爲字符串? – ng80092b 2015-03-30 19:07:24

+0

我剛剛嘗試了你建議的方式,反正給出了一個錯誤:p – ng80092b 2015-03-30 19:10:07

+0

問題是他沒有將行識別爲整數,所以他沒有循環,還有其他建議? – ng80092b 2015-03-30 19:11:18

1

試試這個代替for循環

foreach (DataRow row in dDataAccess.Instance.tabelasismica.Rows) 
    { 
     if (row["Cidade"].ToString() == str) 
     { 
      z = dDataAccess.Instance.tabelasismica.Rows.IndexOf(row); 
     } 
    } 

foreach (DataRow row in dataTable.Rows) 
    { 
     if (row["Cidade"].ToString() == str) 
     { 
      z = dataTable.Rows.IndexOf(row);; 
     } 
    } 

雖這麼說,在使用組合框的標準做法,列表框等與數據源是有在一個獨特的列數據表被指定爲ComboBox的ValueMember,這使得生活變得更加簡單 - 正如@dotNET所建議的那樣。

comboBox8.DataSource= dataTable; //the data table which contains data 
comboBox8.ValueMember = "id"; // column name which you want in SelectedValue 
comboBox8.DisplayMember = "name"; // column name that you need to display as text 

這樣,你不必通過數據表進行迭代,找到行的索引,您可以使用ID(ValueMember)根據需要繼續處理。

here

1

@ DOTNET的答案是爲您解決特定問題的首選方法。

但是解決一般問題數據集中你最好的賭注是要麼

使用ADO.NET方法FindSelect例如找到一個值

var results = dataset.Select(string.Format("Cidade = {0}",str)); 
if (results.Count() != 0) 
{ 
     ... 
} 

或者使用System.Data.DataSetExtensions

if (datatable.AsEnumerable().Any(x=> x.Field<string>("Cidade") == str)) 
{ 
    .... 
} 
相關問題