Frage

Ich bin mit einem Property in einem Werkzeug App ein Fenster zu zeigen, ein Objekt in einem Remote-App zu überwachen. Jede Sekunde oder so bekomme ich ein Update von der App mit dem Zustand der Mitglieder, die sich geändert haben, und ich das Raster aktualisieren. Ich nenne Refresh (), um die Änderungen zu machen. Das alles funktioniert ganz gut bis auf eine Sache.

Sprechen Sie das Objekt zu groß ist im Raster zu passen so eine Scrollbar gibt. Der Benutzer hat ein Gitterelement ausgewählt hat aber auch darüber nach oben gerollt, so dass das ausgewählte Element unter dem Boden der Kontrolle ist.

Das Problem, das auf Refresh ist () scrollt die Steuerung automatisch das Rasterelement in Sicht (seltsam ist es dies nicht tun, wenn das Element über den obere Ende der Kontrolle ist).

Ich bin auf der Suche nach einer Möglichkeit, diese entweder zu verhindern oder Zustand zu speichern, führen Sie die Refresh () und dann wieder eingestellt. Ich habe versucht, immer den zugrunde liegenden VScrollBar im PropertyGridView innerhalb des Property und Messing mit „Value“, aber es bleibt nicht fest eingestellt. Immer springt zurück, so dass die Artikel in Sicht ist.

Abwählen das Element während des Scrollens ist mein Rückfall (die Autoscroll-in-Ansicht geschieht nicht ohne Gitterpunkt ausgewählt), aber es tut weh, die Nutzbarkeit ein wenig so für einen anderen Weg, ich bin auf der Suche.

Jeder läuft in etwas ähnlichem?

War es hilfreich?

Lösung

Dies ist in der MS Property nicht möglich. Diese Komponente hat zu viele unaccessible Interna Ihnen die Flexibilität zu geben, die Sie anfordern und wie Sie selbst realisiert ist es nicht konsistent (Sie haben das Problem für eine Eigenschaft unter dem Gitter, aber nicht, wenn es oben). Deshalb habe ich Smart-PropertyGrid.Net erstellt. Wenn ein kommerzielles Produkt, eine Option für Sie ist, dieses Gitter die Option Zustände speichern Eigenschaft hat und diese wiederherstellen, nachdem Sie eine Aktion auf dem Gitter gemacht (wie Refresh ()) ohne Flimmern.

Andere Tipps

`ve fand eine interessante Hack:

Sie können manuell die Rasterelemente wählen Sie geändert und sie wird aktualisiert:)

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

So wähle ich Dinge, die ich brauche und als die Auswahl verschieben zurück

Für mich folgendes machte den Unterschied:

nicht ein neues Objekt zuweisen.

Sie einfach die Felder des alten Objekts aktualisiert mit den neuen Daten.

Nun, auf Refresh, mein Property blättert nicht mehr, und zeigt auch aktualisiertem Inhalt.

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);
           }
     }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top