2009-05-18 7 views
8

Ho una casella di selezione a selezione multipla che sto vincolando a un DataTable. DataTable contiene 2 colonne descrizione e valore.Impostazione dell'elemento selezionato in un ListBox senza loop

Ecco il codice popolando casella di riepilogo:

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; 

io pongo descrizione come il DisplayMember e valore come il ValueMember del ListBox. Ora, a seconda di cosa viene passato il valore, devo impostare l'elemento selezionato nel ListBox.

Ecco il mio codice:

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

che non sta funzionando. Quindi devo ricorrere al codice qui sotto (dove ho scorrere tutti gli elementi nella casella di riepilogo)

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

vorrei sapere cosa manca/errato nel mio codice. Perché lb.SelectedValue = valuePassedByUser; selezionando articoli errati?

+0

Puoi fornire ulteriori informazioni su cosa è esattamente necessario o un esempio più completo del codice? L'oggetto legge un campo da un database e imposta l'indice/il valore selezionato su un valore corrispondente nella casella di riepilogo? – ryanulit

+0

La casella di riepilogo viene popolata con un DataTable che a sua volta ha i dati recuperati dal database. La mia preoccupazione è che se ho impostato ValueMember mentre compilavo la lista, perché è lb.SelectedValue = valuePassedByUser; non funziona? –

risposta

7

Ok ... ecco una risposta difficile da digerire che ho realizzato solo ieri. È un mio errore, tuttavia, che non ho menzionato una cosa importante nella mia domanda perché ritenevo che fosse irrilevante per i problemi a portata di mano:

I dati nella tabella dati non erano ordinati. Quindi I aveva impostato la proprietà Sorted della listbox su true. Più tardi mi sono reso conto che quando la proprietà ordinata della casella combinata della casella di riepilogo o anche è impostata su true, il membro del valore non viene impostato correttamente. Quindi, se scrivo:

lb.SelectedValue = valuePassedByUser;

si definisce qualche altro elemento come selezionato piuttosto che settting quella il cui valore è valuePassedByUser. In breve, incasina gli indici.

Ad es. se i miei dati iniziali sono:

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

E ho impostato ordinato = vero. Poi le voci ListBox sono:

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

Ora, se voglio impostare Banana come selezionato, corro lo stmt:

lb.SelectedValue = "B";

Ma invece di impostare banana come selezionato, imposta arancione come selezionato. Perché? Dato che la lista non è stata ordinata, l'indice di Banana sarebbe 4. Quindi, anche se dopo aver ordinato l'indice di Banana è 2, imposta l'indice 4 come selezionato, rendendo Arancione selezionato invece di Banana.

Quindi, per listbox ordinato, io sto usando il seguente codice per impostare gli elementi selezionati:

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

Prova questo: -

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

Non c'è FindByValue nella raccolta Articoli. – norlando

1

Credo che l'unico modo sarete in grado di selezionare più elementi è quello di utilizzare un ciclo foreach. La proprietà SelectedValue sembra restituire solo 1 elemento. Se si desidera selezionare più di 1 articolo dovrete usare:

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

Anche il FindStringExact non cerca attraverso i campi Valore appare solo attraverso il testo visualizzato. Anche per ridurre il codice potrebbe volere lanciare una nuova variabile come una lista in modo da non continuare a lanciare C come listbox.

0

È possibile utilizzare "FindByValue" come questo:

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

Ecco come ho risolto esso, utilizzando Winforms, DotNet 4.6

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

Se non si desidera eseguire il looping per gli elementi selezionati, recuperare il valore selezionato della casella di riepilogo dall'evento listBox_SelectedIndexChanged e aggiungere tale valore nell'array globale. Quindi accedendo a quell'array otterresti il ​​valore degli oggetti selezionati di itemlist senza alcun loop.

Problemi correlati