Domanda

Come si può generare a livello di programmazione l'evento SelectedIndexChanged di un ListView?

Ho previsto che il primo elemento nel mio ListView venga automaticamente selezionato dopo che l'utente ha completato una determinata azione. Il codice esiste già all'interno dell'evento SelectedIndexChanged per evidenziare l'elemento selezionato. Non solo l'elemento non viene evidenziato, ma un punto di interruzione impostato in SelectedIndexChanged non viene mai raggiunto. Inoltre, Debug.WriteLine non riesce a produrre output, quindi sono piuttosto certo che l'evento non è stato generato.

Il seguente codice non genera l'evento:

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

La chiamata extra del metodo .Select () è stata inclusa per buona misura. ;) La deselezione (.Selected = false) è stata inclusa per deselezionare ListViewItem nella raccolta .Items nel caso in cui fosse stata selezionata per impostazione predefinita e quindi impostarla su "true" non avrebbe alcun effetto. La chiamata 'Application.DoEvents ()' è ancora un altro ultimo metodo di eliminazione.

Il codice sopra riportato non dovrebbe generare l'evento SelectedIndexChanged?

Vorrei menzionare che l'evento SelectedIndexChanged si attiva correttamente quando un elemento viene selezionato tramite input da tastiera o mouse.

È stato utile?

Soluzione

Deselezionandolo impostandolo su false non si attiva l'evento ma impostandolo su true will.

    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
    }

Potresti avere qualcos'altro in corso. A quale evento stai eseguendo il tuo codice di selezione?

Altri suggerimenti

Perché non riesci a spostare il codice che è attualmente all'interno del metodo del gestore di eventi in un metodo che può essere chiamato dallo spot originale e anche dal tuo codice?

Qualcosa del genere:

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

verrebbe refactored a questo:

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

    void baz()
    {
        bop();
    }

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

Se si crea una classe derivata da ListView , è possibile chiamare il metodo protetto OnSelectedIndexChanged . Ciò genererà l'evento SelectedIndexChanged .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top