2009-05-18 37 views
8

我有一個多選列表框,我綁定到一個DataTable。 DataTable包含2列描述和值。在列表框中設置選中的項目而不循環

這裏的列表框中填入代碼:

DataTable copytable = null; 
       copytable = GlobalTable.Copy(); // GlobalTable is a DataTable 
       copytable.Rows[0][0] = "--ALL--"; 
       copytable.Rows[0][1] = "--ALL--"; 

       breakTypeList.DataSource = copytable; 
       this.breakTypeList.DisplayMember = copytable.Columns[0].ColumnName; // description 
       this.breakTypeList.ValueMember = copytable.Columns[1].ColumnName; // value 
       this.breakTypeList.SelectedIndex = -1; 

我設置的描述爲將DisplayMember和值列表框的ValueMember。現在取決於通過什麼值,我需要在列表框中設置選定的項目。

這裏是我的代碼:

ListBox lb = c as ListBox; 
lb.SelectedValue = valuePassedByUser; 

這是行不通的。因此,我不得不求助於下面的代碼(在這裏我通過列表框中的所有項目環)

for (int i = 0; i < lb.Items.Count; i++) 
      { 
       DataRowView dr = lb.Items[i] as DataRowView; 
       if (dr["value"].ToString() == valuePassedByUser) 
       { 
        lb.SelectedIndices.Add(i); 
        break; 
       } 
      } 

我想知道什麼是缺少/錯誤在我的代碼。爲什麼是lb.SelectedValue = valuePassedByUser;選擇錯誤的項目?

+0

您可以提供更多關於您需要做什麼或更完整的代碼示例的信息嗎?對象是從數據庫中讀取一個字段,並將所選的索引/值設置爲列表框中的匹配值? – ryanulit 2009-05-18 13:17:42

+0

該列表框正在填充DataTable,DataTable又會從數據庫中檢索數據。我擔心如果我在填充列表時設置了ValueMember,爲什麼是 lb.SelectedValue = valuePassedByUser; 不工作? – 2009-06-03 03:30:54

回答

7

好的...這裏有很難回答的問題,我昨天才知道。這是我的錯誤,雖然我沒有提到我的問題中的一件重要事情,因爲我覺得它與手頭的問題無關:

數據表中的數據未排序。因此,我已將列表框的Sorted屬性設置爲true。後來我意識到,當列表框的或甚至組合框的排序屬性設置爲true時,值成員不能正確設置。所以如果我寫:

lb.SelectedValue = valuePassedByUser;

它設置一些其他項目爲選定,而不是設置其值爲valuePassedByUser。簡而言之,它會混淆索引。

例如,如果我的初始數據是:

Index ValueMember DisplayMember 
1   A   Apple 
2   M   Mango 
3   O   Orange 
4   B   Banana 

而且我設置了sorted = true。然後在列表框中的項目有:

Index ValueMember DisplayMember 
1   A   Apple 
2   B   Banana 
3   M   Mango 
4   O   Orange 

現在,如果我想爲選擇設置香蕉,我運行語句:

lb.SelectedValue = "B";

但不是作爲選擇設置香蕉,因爲選擇它集橙。爲什麼?因爲如果列表未被排序,Banana的索引將爲4.因此,儘管在Banana的排序索引爲2之後,它將索引4設置爲選中,從而使得Orange選擇而不是Banana。

因此,對於排序列表框,我使用下面的代碼來設置所選項目:

private void SetSelectedBreakType(ListBox lb, string value) 
{ 
    for (int i = 0; i < lb.Items.Count; i++) 
    { 
     DataRowView dr = lb.Items[i] as DataRowView; 
     if (dr["value"].ToString() == value) 
     { 
      lb.SelectedIndices.Add(i); 
      break; 
     } 
    } 
} 
0

試試這個: -

var listBox = c as ListBox; 
    var item = listBox.Items.FindByValue(fieldValue); 
    if (item != null) 
    listBox.SelectedValue = fieldValue; 
1

我想你就可以選擇多個項目的唯一方法是通過使用foreach循環。 SelectedValue屬性似乎只返回1個項目。如果你想選擇多於1個項目,你將不得不使用:

var tempListBox = c As ListBox; 
if (tempListBox != null) 
    (tempListBox.SelectedItems.Add(tempListBox.Items[tempListBox.FindStringExact(fieldValue)]); 

另外,FindStringExact不通過值字段只通過看顯示的文本搜索。另外,爲了減少代碼,可能需要將一個新變量作爲列表框來施放,這樣就不會將C作爲列表框。

0

您可以使用 「FindByValue」 是這樣的:

ListBox.SelectedIndex = ListBox.Items.IndexOf(ListBox.Items.FindByValue(fieldValue)) 
0
this.Character.SetSelected(this.Character.Items.IndexOf(this.textBox1.Text),true); 
0

下面是如何解決它使用winforms,DotNet 4.6

listBox1.SelectedIndex = listBox1.FindString(stringInList); 
0

如果您不想循環選定的項目,則從listBox_SelectedIndexChanged事件中檢索列表框的選定值,並在全局數組中添加該值。然後通過訪問這個數組,你會得到慾望選擇的項目值itemlist沒有任何循環。

相關問題