Domanda

Sto usando un PropertyGrid in un'app per strumenti per mostrare una finestra per monitorare un oggetto in un'app remota. Ogni secondo ricevo un aggiornamento dall'app con lo stato di tutti i membri che sono stati modificati e aggiorno la griglia. Chiamo Refresh () per effettuare le modifiche. Tutto funziona abbastanza bene tranne una cosa.

Supponi che l'oggetto sia troppo alto per adattarsi alla griglia, quindi c'è una barra di scorrimento. L'utente ha selezionato un elemento della griglia ma ha anche fatto scorrere verso l'alto sopra di esso in modo che l'elemento selezionato si trovi al di sotto della parte inferiore del controllo.

Il problema è che su Refresh () il controllo scorre automaticamente l'elemento della griglia in vista (stranamente non lo fa quando l'elemento si trova sopra la parte superiore del controllo).

Sto cercando un modo per impedire questo, o per salvare lo stato, eseguire Refresh () e quindi ripristinarlo. Ho provato a ottenere il VScrollBar sottostante in PropertyGridView all'interno di PropertyGrid e a fare scherzi con "Value", ma non rimane impostato in modo permanente. Torna sempre indietro in modo che l'elemento sia visibile.

Deselezionare l'elemento durante lo scorrimento è il mio fallback (lo scorrimento automatico nella vista non avviene senza alcun elemento griglia selezionato) ma danneggia un po 'l'usabilità quindi sto cercando un altro modo.

Qualcuno si imbatte in qualcosa di simile?

È stato utile?

Soluzione

Questo non è possibile nel PropertyGrid di MS. Questo componente ha troppi interni inaccessibili per darti la flessibilità che stai richiedendo e quando ti rendi conto che non è coerente (hai il problema per una proprietà sotto la griglia ma non quando è sopra). Ecco perché ho creato Smart PropertyGrid.Net . Se un prodotto commerciale è un'opzione per te, questa griglia ha la possibilità di memorizzare gli stati delle proprietà e ripristinarli dopo aver effettuato un'azione sulla griglia (come Refresh ()) senza sfarfallio.

Altri suggerimenti

Ho trovato un trucco interessante:

puoi selezionare manualmente gli elementi della griglia che hai modificato e si aggiorneranno :)

var panProp = categ.GridItems[3];
var tiltProp = categ.GridItems[4];
panProp.Select();
tiltProp.Select();

Quindi seleziono gli elementi di cui ho bisogno e poi sposta indietro la selezione

Per me quanto segue ha fatto la differenza:

non assegnare un nuovo oggetto.

Aggiorna semplicemente i campi del vecchio oggetto con i nuovi dati.

Ora, al momento dell'aggiornamento, il mio PropertyGrid non scorre più e mostra anche il contenuto aggiornato.

public void SoftRefreshPropertyGrid()
{
     var peMain = propertyGrid.GetType().GetField("peMain", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(propertyGrid)as  System.Windows.Forms.GridItem;
     if (peMain != null)
     {
           var refreshMethod = peMain.GetType().GetMethod("Refresh");
           if (refreshMethod != null)
           {
                  refreshMethod.Invoke(peMain, null);
                  propertyGrid.Invalidate(true);
           }
     }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top