2009-05-18 13 views
8

Mam listę wyboru wielokrotnego wyboru, które wiążę do DataTable. DataTable zawiera 2 kolumny opisu i wartości.Ustawianie wybranej pozycji w polu ListBox bez zapętlenia

Tutaj jest listbox wypełnianie kodu:

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; 

ja ustawiania opisu jako DisplayMember i wartości jako ValueMember w ListBox. Teraz w zależności od tego, jaka wartość jest przekazywana, muszę ustawić wybrany element w ListBoxie.

Oto mój kod:

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

który nie działa. Dlatego muszę uciekać się do kodu poniżej (gdzie pętla przez wszystkie elementy w polu listy)

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; 
       } 
      } 

Chcę wiedzieć, czego brakuje/błędne w moim kodu. Dlaczego lb.SelectedValue = valuePassedByUser; wybieranie niewłaściwych przedmiotów?

+0

Czy możesz podać więcej informacji na temat tego, co dokładnie musisz zrobić lub dokładniejszego przykładu kodu? Czy obiekt odczytuje pole z bazy danych i ustawia wybrany indeks/wartość na pasującą wartość w polu listy? – ryanulit

+0

Pole listy jest zapełniane tabelą DataTable, która z kolei ma dane pobrane z bazy danych. Obawiam się, że jeśli ustawiłem wartość w czasie wypełniania listy, dlaczego jest lb.SelectedValue = valuePassedByUser; nie działa? –

Odpowiedz

7

Ok ... tutaj przychodzi trudna do strawienia odpowiedź, którą zdałem sobie dopiero wczoraj. Błędem jest jednak to, że nie wspomniałem o jednej ważnej rzeczy w moim pytaniu, ponieważ czułem, że nie ma to związku z problemem:

Dane w tabeli danych nie zostały posortowane. Stąd I ustawił właściwość Sortbox listbox na true. Później się zorientowałem Kiedy właściwość posortowana listbox lub nawet pola kombi zostanie ustawiona na wartość true, element wartości nie zostanie poprawnie ustawiony. Więc jeśli piszę:

lb.SelectedValue = valuePassedByUser;

ustawia jakąś inną pozycję jako wybrany zamiast settting ten, którego wartość jest valuePassedByUser. W skrócie miesza się z indeksami.

Dla np. jeśli moje początkowe dane to:

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

Ustawiłem posortowany = true. Następnie elementy ListBox są:

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

Teraz jeśli chcę ustawić Banana jako wybrany, uruchomić stmt:

lb.SelectedValue = "B";

Ale zamiast ustawiania Banana jako wybrany, ustawia pomarańcza jako wybrany. Czemu? Ponieważ lista nie została posortowana, wskaźnik Banana wynosiłby 4. Tak więc, mimo że po sortowaniu indeksu Banana wynosi 2, ustawia on indeks 4 jako wybrany, co sprawia, że ​​Orange jest wybierany zamiast Banana.

Stąd dla segregowanych listbox, używam następujący kod, aby ustawić wybrane elementy:

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

Spróbuj tego: -

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

Nie ma FindByValue w kolekcji Items. – norlando

1

Myślę, że jedynym sposobem będziesz w stanie wybrać kilka pozycji jest za pomocą pętli foreach. Właściwość SelectedValue wydaje się zwracać tylko 1 element. Jeśli chcesz wybrać więcej niż 1 przedmiot musisz używać:

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

Również FindStringExact nie przeszukiwać pola Wartość wygląda tylko przez wyświetlanego tekstu. Również zredukowanie kodu może chcieć rzucić nową zmienną jako listbox, więc nie będziesz dalej rzucał C jako listbox.

0

Możesz użyć "FindByValue" tak:

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

Oto jak rozwiązać to, używając WinForm, DotNet 4.6

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

Jeśli nie chcesz tworzyć pętli dla wybranych elementów, pobierz wybraną wartość pola listy ze zdarzenia listBox_SelectedIndexChanged i dodaj tę wartość do tablicy globalnej. Następnie, uzyskując dostęp do tej tablicy, otrzymasz pożądane wybrane wartości o wartości itemlist bez żadnej pętli.

Powiązane problemy