2012-05-03 3 views
7

Sto tentando di deselezionare (vuoto) un numero di caselle combinate nella mia applicazione per i moduli Windows. Nella mia applicazione ho un metodo di reset che imposta il SelectedIndex per ogni combo su -1. Tutte le mie caselle combinate sono database, ovvero ogni casella combinata viene popolata utilizzando un'origine dati.Come deleselect/blank un ComboBox del database? SelectedIndex = -1 non funziona

Ho notato che a volte il mio metodo di ripristino funziona, cioè deseleziona l'elemento attualmente selezionato e oscura la combinazione. Tuttavia, altre volte sceglie il primo elemento (SelectedIndex = 0) subito dopo aver tentato di impostarlo su -1. Dal punto di vista degli utenti questo sembra un bug in quanto non sempre "cancella" il modulo.

Secondo MSDN:

"Per deselezionare l'elemento selezionato, impostare il SelectedIndex a -1 Non è possibile impostare il SelectedIndex di un elemento ComboBox a -1 se l'articolo è un elemento di associazione a dati.".

Qualcuno sa di un lavoro in giro?

Molte grazie

+0

questo è un vecchio filo, ma poiché stavo solo cercando di capirlo e ho trovato questo, lo aggiungerò qui. Questo comportamento è un bug secondo MS: https://support.microsoft.com/en-us/help/327244/bug-combobox-does-not-clear-when-you-set-selectedindex-to--1 – CuppM

risposta

-3

si può tentare di utilizzare questa soluzione ..

dataGrid.DataSource = Nothing 

dataGrid.DataBind() 

speranza il suo aiuto ..!: D

+0

dataGrid ?? intendi ComboBox? – Habib

+0

Questo è chiaramente contrassegnato come C#, Non VB. Inoltre, ha detto ComboBox, non DataGrid. – KidCode

+0

dataGrid.DataSource = null dataGrid.DataBind() –

2

Si può cercare di impostare il valore o la voce selezionata per null (Nothing in VB)

Non ricordo il comportamento di generare un'eccezione. Tuttavia, ricordo che ho usato per inserire un valore chiamato -1, (Nessuno) nella casella combinata dopo che è stato catalogato di solito attraverso gli eventi del database. Mi consiglia di ottenere i dati in un elenco e inserire il nuovo valore in questo elenco. Bind il combo alla lista ora.

+0

'SelectedItem', sì. Tuttavia, se si imposta 'SelectedValue' su null (e il ComboBox è legato ai dati) genererà un'eccezione. –

+1

Inoltre non è una buona idea legare per vivere i dati comunque. Recupera sempre i dati in un elenco locale e collegali all'elenco. Spero tu stia usando LINQ. – DoomerDGR8

+0

Impostandolo come valore selezionato ha generato un'eccezione, SelectedIndex = null ha funzionato, tuttavia su una particolare casella combinata (menu a discesa) ho dovuto eseguire questa operazione due volte, il che è piuttosto strano. Non sono sicuro del perché?Inoltre, non sto usando LINQ, il mio progetto deve essere .net 2 – bobbo

-1

Aggiungi alla tua casella combinata un elemento vuoto, qualcosa di simile:

cb.Items.Add(""); 

Dopo questo è possibile deselezionare la tua casella combinata selezionando la voce ultima CB:

cb.SelectedIndex = cb.Items.Count - 1; 

ci si va!

Avrai l'ultimo posto vuoto nella tua casella combinata, ma non ti disturberà. sara? :-)

0

Se il quadro di riferimento è 4.0 - ecco la soluzione:

Installare .NET Framework 4.5 (non cambiare framework di destinazione del progetto, è sufficiente installare il quadro). Dopo l'installazione, quella linea deseleziona casella combinata databound:

combobox.SelectedValue = 0; 

mio membro valore è "Id" int primario di incremento automatico chiave, in modo che il campo non contiene il valore 0. Tuttavia, che non funziona su Windows versioni, che non supportano .net45

0

Provare a impostare [ComboBoxObj] .SelectedIndex = -1; che lo renderà a valore vuoto. -1 si riferisce a deselezionare o annullare il valore della casella combinata

Grazie

1

Solo il seguente codice funziona per me, in modo da provare:

comboBox.ResetText(); //framework 4.0 
16

Uso combinazione di vuoto e di proprietà

comboBox.ResetText(); 

//to reset selected value 
comboBox.SelectedIndex = -1; 
+0

ha funzionato per me. Grazie. –

+0

Per me 'ResetText()' è stato sufficiente. C'è un motivo per impostare 'SelectedIndex' su' -1'? – C4u

+0

sì c'è un motivo perché se si utilizza l'origine di associazione con backgroundworker che aggiorna la GUI dopo il rendering così dopo l'associazione rimuoverà il testo senza valore di riposo per questo sarà necessario utilizzare entrambi – Hisham

0

Ho avuto questo problema per un po ', ma se si utilizza:

'ComboBox.ResetText();'

farà sì che il testo "" e lasciare gli elementi nella casella combinata inalterato.

Ho usato il seguente codice nella mia applicazione

private void UpdateComboBox(ComboBox Box, string Group, List<string> Numbers) 
     { 
       Box.Items.Clear(); 
       Box.BeginUpdate();    
       Box.Items.Add("<<Add Contact>>"); 
       foreach (string item in Numbers) 
       { 
        if(item != "") 
         Box.Items.Add(item); 
       } 
      Box.EndUpdate(); 
      Box.ResetText(); 
     } 

Così ho eseguito l'ultimo metodo, una volta che tutti gli articoli sono nella casella combinata.

0

ComboBox1.SelectedItem = null;

0

Non so se qualcuno è ancora interessato a questo, visto che è ora 5 anni dopo, ma ho trovato una soluzione molto facile. Totalmente non-intuitivo (ho trovato solo guardando il codice sorgente di riferimento), ma banale da implementare:

ComboBox1.FormattingEnabled = True; 

Sì, questo è tutto quello che c'è da fare!

Se sei curioso, puoi leggere lo source code per vedere cosa sta succedendo. Sembra che la causa principale del bug notato da @CuppM è il tentativo di impostare la posizione della fonte di dati:

if (!FormattingEnabled || SelectedIndex != -1) { 
    this.DataManager.Position = this.SelectedIndex; 
} 

Direi che avrebbe dovuto semplicemente essere '& &' invece di '|| ' nella condizione, poiché il codice probabilmente non dovrebbe impostare la Posizione su un valore non valido indipendentemente dalla proprietà FormattingEnabled.

In ogni caso, consente una soluzione semplice. E poiché il comportamento predefinito se la proprietà 'Format' è vuota è un no-op, non devi cambiare nient'altro. Funziona e basta. :-)

(Vorrei sottolineare che ho provato solo questo con .NET 4.7, quindi non posso dire se funziona per le versioni precedenti del .NET Framework.)