2011-11-19 11 views
6

In WinForms ho un ciclo in esecuzione su una casella di riepilogo che seleziona gli elementi.Winform - Come impedire la selezione delle voci della casella di riepilogo

Durante questo periodo non desidero che l'utente selezioni gli elementi in tale casella di elenco con il mouse oi tasti.

Ho guardato MyListbox.enabled = falso ma elimina tutti gli elementi. Non lo voglio

Come impedire la selezione degli elementi in una casella di riepilogo?

risposta

5

Passare il Listbox.SelectionMode proprietà SelectionMode.None

Modifica come la vedo impostazione SelectionMode.None deseleziona tutti gli elementi precedentemente selezionati e genera un'eccezione se SetSelected viene chiamato sulla casella di riepilogo.

Penso che il comportamento desiderato non sia possibile (senza voler rendere più grigi gli articoli con Enabled=false).

+0

Se faccio che il mio ciclo che è in esecuzione in quel momento non sarà in grado di selezionare le voci. Ricorda che voglio che il ciclo selezioni gli elementi ma non l'utente. – tomfox66

+0

Questo funziona nel mio scenario: non voglio che l'utente sia in grado di controllare gli oggetti, ma deve essere in grado di controllarli a livello di programmazione. Grazie. –

1

Si può avere un po 'di fortuna se sub classe ListBox e l'override del metodo OnMouseClick:

public class CustomListBox : ListBox 
{ 
    public bool SelectionDisabled = false; 

    protected override void OnMouseClick(MouseEventArgs e) 
    { 
     if (SelectionDisabled) 
     { 
      // do nothing. 
     } 
     else 
     { 
      //enable normal behavior 
      base.OnMouseClick(e); 
     } 
    } 
} 

Naturalmente si consiglia di fare una migliore informazione nascondere o design di classe, ma questo le funzionalità di base. Potrebbero esserci altri metodi che è necessario sovrascrivere.

7

troppo Volevo una sola casella di riepilogo leggere, e finalmente, dopo molte ricerche, ha trovato questo da http://ajeethtechnotes.blogspot.com/2009/02/readonly-listbox.html:

public class ReadOnlyListBox : ListBox 
{ 
    private bool _readOnly = false; 
    public bool ReadOnly 
    { 
     get { return _readOnly; } 
     set { _readOnly = value; } 
    } 

    protected override void DefWndProc(ref Message m) 
    { 
     // If ReadOnly is set to true, then block any messages 
     // to the selection area from the mouse or keyboard. 
     // Let all other messages pass through to the 
     // Windows default implementation of DefWndProc. 
     if (!_readOnly || ((m.Msg <= 0x0200 || m.Msg >= 0x020E) 
     && (m.Msg <= 0x0100 || m.Msg >= 0x0109) 
     && m.Msg != 0x2111 
     && m.Msg != 0x87)) 
     { 
      base.DefWndProc(ref m); 
     } 
    } 
} 
+0

La magia con DefWndProc è incredibile! +1 – Neolisk

+0

Funziona perfettamente - Presumo che tu voglia un ReadOnlyListBox per default _readOnly su true, non lo faresti? – Mani5556

1

Creare un gestore di eventi che rimuove attenzione dalla casella di riepilogo e sottoscrivere il gestore per Attivato della casella di riepilogo evento. In questo modo, l'utente non sarà mai in grado di selezionare nulla nella casella di riepilogo. La seguente riga di codice lo fa con un metodo anonimo in linea:

txtBox.GotFocus + = (oggetto anonSender, EventArgs anonE) => {txtBox.Parent.Focus(); };

* Edit: codice di spiegazione

Problemi correlati