Domanda

Che cosa potrebbe causare un TreeView al collasso, altro che una chiamata al .Collapse () metodo su un TreeNode o il metodo del TreeView .CollapseAll ()?

In un'applicazione che sto sviluppando, TreeView semplicemente non si comportano correttamente. La TreeView mantiene solo due livelli. Quando si seleziona un figlio di un nodo padre, tutti gli altri nodi immediatamente collassano. Tuttavia, non ci sono .Collapse () o .CollapseAll () le chiamate di metodo nel mio codice di sorta!

Tutte le proprietà del TreeView sono lasciati ai valori predefiniti, ad eccezione della proprietà .LabelEdit, che è impostata su true. La TreeView ha qualche codice associato all'interno della manifestazione AfterLabelEdit per un semplice validazione / MessageBox di routine.

ho provato:

  • Collegamento caso BeforeCollapse di la TreeView e l'innalzamento del e.CancelAction bandiera.

  • espandere manualmente tutti i nodi all'interno AfterSelect del controllo TreeView evento. (Questo funziona bene come un sperimentare, ma io non intendo non consentire nodo crollo
    del tutto!)

In molti punti all'interno del codice, sto scorrendo la TreeView, nodo per nodo, per verificare le proprietà. Tuttavia, senza aggiunte o delezioni di nodi verificano. Le uniche proprietà TreeNode che vengono modificati come l'utente effettua selezioni sono .ImageIndex e .SelectedImageIndex.

A parte le due soluzioni di cui sopra, non ho alcun indizio su quello che potrebbe essere la causa di questo errore. Anche se non le soluzioni possono essere realizzate, potrebbe chiunque avere un'idea circa il modo corretto di andare su intrappolando il collasso? (Ho provato a fissare un punto di interruzione all'interno dell'evento BeforeCollapse, ma non innescato meno che l'utente crolla esplicitamente il nodo tramite il mouse o la tastiera.)


UPDATE:

Il problema è dovuto al chaging la proprietà .SelectedImageIndex su qualsiasi TreeNode. La modifica di questa proprietà fa sì che tutti gli altri nodi al collasso.

Ho tentato circonda il codice di modifica di proprietà .SelectedImageIndex con .BeginUpdate () e .EndUpdate () chiama inutilmente.

Come può essere evitato?

È stato utile?

Soluzione

Questo è un effetto collaterale del modo in cui le finestre native funzionano in Windows. Molte delle opzioni della finestra sono specificati dalle bandiere di stile nella chiamata CreateWindowEx (). cose di base, come quello che il confine si presenta come una maschera. Che tipo di vista un ListView dovrebbe avere. Se un TreeView deve visualizzare caselle di controllo.

Questi stili sono esposti come proprietà su un controllo. Ma c'è un problema. Modifica di una tale proprietà richiede la finestra per essere ricreato da zero in modo che le nuove bandiere stile possono essere specificate nel) chiamata (CreateWindowEx. Che ha effetti collaterali, la finestra viene completamente ricreato in modo che perde ogni stato precedente.

Windows Form fa un buon lavoro di rendere questo aspetto liscio, ripristinando lo stato precedente dopo ricreando la finestra. Ma ci sono fughe di notizie qua e là. E alcuni bug a titolo definitivo. Una perdita nel TreeView è l'esatto stato di nodi che vengono compressi e quali non lo sono. Tenere traccia di tutto questo è solo pratico.

Diagnosticare questo mettendo la proprietà Handle del controllo TreeView in una finestra di controllo. Se lo vedi cambia, hai trovato la proprietà. L'elenco delle bandiere di stile è disponibile qui, probabilmente si può mappare i loro nomi alle loro proprietà corrispondente.

Forse è chiaro che non c'è grande soluzione per questo problema, diverso evitando cambiare quella proprietà. Problemi come questo è ciò che generò WPF.

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