Pergunta

Como pode um programaticamente acionar o evento SelectedIndexChanged de um ListView?

Eu tenho pretendido para o primeiro item no meu ListView para automaticamente se tornar selecionados depois que o usuário completa uma determinada ação. Código já existe dentro do evento SelectedIndexChanged para destacar o item selecionado. Não só o item não seja realçado, mas um conjunto de ponto de interrupção dentro SelectedIndexChanged nunca é atingido. Além disso, uma Debug.WriteLine não consegue saída de produtos, por isso estou bastante certo de que evento não foi acionado.

O código a seguir não dispara o evento:

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

A chamada de método extra de .Select () foi incluído para uma boa medida. ;) O deselection (.selected = false) foi incluído para desmarcar o ListViewItem na coleção .Items apenas no caso que pode ter sido selecionado por padrão e, portanto, definindo-o como 'verdadeiro' não teria nenhum efeito. Dos Application.DoEvents () "chamada é mais um último método vala.

não deve o código acima causa o evento SelectedIndexChanged ao fogo?

Eu devo mencionar que os incêndios evento SelectedIndexChanged corretamente em quando um item é selcted através da entrada de teclado ou mouse.

Foi útil?

Solução

Ao desmarcar-lo, definindo-o como false não irá disparar o evento, mas defini-la como verdadeira vontade.

    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
    }

Você pode ter algo mais acontecendo. O evento que você está executando o seu código de seleção?

Outras dicas

Por que você não pode mover o código que está atualmente dentro do método do seu manipulador de eventos para um método que pode ser chamado a partir do local original e também do seu código?

Algo parecido com isto:

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
    }
}

seria reformulado para isso:

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

    void baz()
    {
        bop();
    }

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

Se você criar uma classe derivada de ListView, você pode chamar o método protegido OnSelectedIndexChanged . Isto irá acionar o evento SelectedIndexChanged.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top