2011-11-19 21 views
6

En WinForms ocasionalmente tengo un bucle ejecutándose sobre un Listbox seleccionando Items.Winforms - Cómo evitar la selección del elemento Listbox

Durante ese tiempo, no quiero que el usuario seleccione elementos en ese cuadro de lista con el mouse o las teclas.

Miré MyListbox.enabled = false pero desglosa todos los elementos. No quiero eso.

Cómo evitar la selección de elementos en un Listbox?

Respuesta

5

interruptor de la propiedad Listbox.SelectionMode a SelectionMode.None

Editar como veo el establecimiento de SelectionMode.None anula la selección de todos los artículos seleccionados previamente y produce una excepción si SetSelected se llama en el cuadro de lista.

Creo que el comportamiento deseado no es posible (sin querer atenuar los elementos con Enabled=false).

+0

Si hago que mi bucle que se está ejecutando en ese momento no será capaz de seleccionar elementos. Recuerde que quiero que el ciclo seleccione elementos pero no el usuario. – tomfox66

+0

Esto funciona en mi situación: no quiero que el usuario pueda verificar elementos, pero debe poder verificarlos programáticamente. Gracias. –

1

Es posible que haya un poco de suerte si sub clase ListBox y reemplazar el método 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); 
     } 
    } 
} 

Por supuesto, es posible que desee hacerlo mejor ocultación de la información o el diseño de clase, pero esa es la funcionalidad básica. Es posible que existan otros métodos que debe anular también.

7

yo también quería una única caja de lista de lectura, y finalmente, después de mucho buscar, encontrar esto desde 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 es increíble! +1 – Neolisk

+0

Funciona perfectamente: supongo que querrías que un ReadOnlyListBox fuera predeterminado _readOnly en true, ¿no es así? – Mani5556

1

Crear un controlador de eventos que elimina el foco del cuadro de lista y suscribir el manejador de GotFocus del cuadro de lista evento. De esta forma, el usuario nunca podrá seleccionar nada en el Listbox. La siguiente línea de código lo hace con un método anónimo en línea:

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

* Editar: Código explicación

Cuestiones relacionadas