Pregunta

¿Cómo se puede activar mediante programación el evento SelectedIndexChanged de un ListView?

Mi intención es que el primer elemento en mi ListView se seleccione automáticamente después de que el usuario complete una determinada acción. El código ya existe dentro del evento SelectedIndexChanged para resaltar el elemento seleccionado. No solo no se resalta el elemento, sino que nunca se alcanza un punto de interrupción establecido en SelectedIndexChanged. Además, un Debug.WriteLine no produce resultados, por lo que estoy bastante seguro de que el evento no se ha activado.

El siguiente código no puede activar el evento:

listView.Items[0].Selected = false;
listView.Items[0].Selected = true;
listView.Select();
Application.DoEvents();

La llamada al método .Select () adicional se incluyó como buena medida. ;) Se incluyó la deselección (.Selected = false) para deseleccionar ListViewItem en la colección .Items en caso de que se haya seleccionado de forma predeterminada y, por lo tanto, establecerlo en "true" no tendría ningún efecto. La llamada 'Application.DoEvents ()' es otro último método de zanja.

¿No debería el código anterior hacer que se active el evento SelectedIndexChanged?

Debo mencionar que el evento SelectedIndexChanged se activa correctamente cuando un elemento se selecciona mediante la entrada del teclado o el mouse.

¿Fue útil?

Solución

Si lo deseleccionas configurándolo en falso, no se activará el evento, sino que se establece en verdadero.

    public Form1 ()
    {
        InitializeComponent();
        listView1.Items[0].Selected = false; // Doesn't fire
        listView1.Items[0].Selected = true; // Does fire.
    }

    private void listView1_SelectedIndexChanged (object sender, EventArgs e)
    {
        // code to run
    }

Es posible que tenga algo más en juego. ¿Qué evento estás ejecutando tu código de selección?

Otros consejos

¿Por qué no puede mover el código que está actualmente dentro del método de su controlador de eventos a un método al que se puede llamar desde el punto original y también desde su código?

Algo como esto:

class Foo
{
    void bar(Object o, EventArgs e)
    {
        // imagine this is something important
        int x = 2;
    }

    void baz()
    {
        // you want to call bar() here ideally
    }
}

se refactorizaría a esto:

class Foo
{
    void bar(Object o, EventArgs e)
    {
        bop();
    }

    void baz()
    {
        bop();
    }

    void bop()
    {
        // imagine this is something important
        int x = 2;
    }
}

Si crea una clase derivada de ListView , puede llamar al método protegido OnSelectedIndexChanged . Esto activará el evento SelectedIndexChanged .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top