Sto creando dinamicamente un ListBox multi-selezione Winforms e aggiungendolo in un controllo del pannello di flusso. Associo un'origine dati da un oggetto che ho creato e verificato che il DataSource abbia effettivamente circa 14 elementi. Quando faccio un listBox.SetSelected(0, true)
viene generato un errore System.ArgumentOutOfRangeException
.La differenza tra la raccolta ListBox.DataSource rispetto a ListBox.Items?
Ho rilevato che il problema è che mentre il DataSource ha 14 elementi, la collection Item non ne ha nessuno (0) e quindi lancia l'eccezione. La mia domanda è perché questi due sono diversi l'uno dall'altro, e perché non dovrei semplicemente aggiungere un elemento foreach in datasource alla raccolta degli oggetti?
Il seguente è il codice che ho finora:
case InsertableItemParameter.ParameterType.ListBox:
//note: two-way bindings are not possible with multiple-select listboxes
Label lblListBox = new Label();
lblListBox.Text = param.DisplayText;
ListBox listBox = new ListBox();
listBox.DataSource = param.Values;
listBox.DisplayMember = "Value";
listBox.SelectionMode = SelectionMode.MultiExtended;
listBox.Size = new System.Drawing.Size(flowPanel.Size.Width - lblListBox.Size.Width - 10, 100);
listBox.SetSelected(0, true); //will throw argument out of range exception here!
listBox.SetSelected(1, true);
flowPanel.Controls.Add(lblListBox);
flowPanel.Controls.Add(listBox);
flowPanel.SetFlowBreak(listBox, true);
break;
Di seguito è una soluzione alternativa ho cercato e ho lavorato, ma ancora una volta perché dovrei usare DataSource contro insieme di elementi?
case InsertableItemParameter.ParameterType.ListBox:
//note: two-way bindings are not possible with multiple-select listboxes
Label lblListBox = new Label();
lblListBox.Text = param.DisplayText;
ListBox listBox = new ListBox();
//listBox.DataSource = param.Values;
listBox.DisplayMember = "Value";
listBox.SelectionMode = SelectionMode.MultiExtended;
listBox.Size = new System.Drawing.Size(flowPanel.Size.Width - lblListBox.Size.Width - 10, 100);
listBox.BeginUpdate();
foreach (String paramater in param.Values)
{
listBox.Items.Add(paramater);
}
listBox.EndUpdate();
listBox.SetSelected(0, true);
listBox.SetSelected(1, true);
flowPanel.Controls.Add(lblListBox);
flowPanel.Controls.Add(listBox);
flowPanel.SetFlowBreak(listBox, true);
break;
RISPOSTA: Grazie per tutte le risposte. Il problema qui è visibilità e rendering in forma di vincita. Sebbene la differenza tra le raccolte DataSource e Items non fosse realmente indirizzata a salvare poche persone, la vera fonte del mio problema è stata risolta chiamando il metodo SetSelected()
dopo che il modulo è stato completato. Ciò causa molti problemi nella progettazione della mia applicazione che devo risolvere, ma questo era il problema. Vedi la risposta che ho contrassegnato come risposta.
Da quello che ho capito del tuo post, il 'ListBox.DataSource' è _where_ i dati sta arrivando _from_ e il' ListBox.Item' è quali dati hai già. – Brian
@Brian In realtà, DataSource è dove ho dati, e ListBox.Item è completamente vuoto. Quando ho tentato di aggiungere il mio DataSource alla mia raccolta di oggetti usando un semplice 'listBox.Items.Add (paramater);' Ho ricevuto un errore che indica che non posso aggiungere elementi alla raccolta Oggetti quando DataSource è impostato. – Magnum
Potete per favore postare tutto il codice? – Brian