2009-04-13 11 views
5

Używam PropertyGrid do wyświetlania właściwości z moich obiektów. Jednakże pozwalam również użytkownikowi na tworzenie własnych właściwości i ustawianie wartości dla tych niestandardowych właściwości. Każdy obiekt, który może mieć te niestandardowe właściwości, ma kolekcję Dictionary, gdzie ciąg jest unikalnym kluczem do identyfikacji właściwości, a Object jest wartością typu pierwotnego (string, bool, int itd.). ve stworzył niestandardowy PropertyDescriptor z metodami get i set, które sprawdzają słownik dla pasującego klucza, lub tworzą/zastępują wartość odpowiednio pasującym kluczem.Resetowanie właściwości z siatki właściwości

Jednak chcę również umożliwić użytkownikowi wyczyszczenie właściwości, a tym samym całkowite usunięcie jej wpisu ze słownika. Wstawiłbym kod do tego w metodzie zastępowania ResetValue mojego niestandardowego PropertyDescriptor, jednak nie widzę żadnego sposobu przez interfejs PropertyGrid, aby to zneutralizować? Nie wydaje się być opcją menu kontekstowego lub czymś tak oczywistym.

Więc jeśli mam niestandardowy PropertyDescriptor z niestandardową metodą ResetValue, w jaki sposób faktycznie wywołać tę metodę z PropertyGrid?

Odpowiedz

3

Myślę, że najprostszym sposobem osiągnięcia tego celu jest dodanie ContextMenu do sieci nieruchomości, z pozycji menu „Reset”, a następnie przenoszenia jej zdarzenie click tak:

private void resetToolStripMenuItem_Click(object sender, EventArgs e) 
{       
    PropertyDescriptor pd = propGrid.SelectedGridItem.PropertyDescriptor; 
    pd.ResetValue(propGrid.SelectedObject); 
} 

myślę Visual Studio robi coś takiego.

+0

Ahh tak właśnie znalazłem ten post MSDN, jak również. Wydaje się, że to najlepsza opcja. http://social.msdn.microsoft.com/Forums/pl-PL/winforms/thread/9dd7b9bf-4134-4105-aba8-65002fed04f2 –

+0

Tak, wywołanie propGri.SelectedGridItem.Select() wygląda na to, że usuń również niektóre problemy z aktualizacją. –

1

Adnotacja: Obiekt PropertyGrid.SelectedObject zwraca nieprawidłową wartość (składnik) w obiektach potomnych. W związku z tym metoda CanResetValue uzyskała nieprawidłowy składnik.

Moje rozwiązanie:

private void OnContextMenuOpening(object sender, CancelEventArgs e) 
{ 
    var lGrid = mCurrentControl as PropertyGrid; 

    if (lGrid != null) 
    { 
    var lItem = lGrid.SelectedGridItem; 

    // Für untergeordnete Eigenschaften kann nicht SelectedObject verwendet werden 
    // Component ist eine interne Eigenschaft der Klasse System.Windows.Forms.PropertyGridInternal.GridEntry 
    // ((System.Windows.Forms.PropertyGridInternal.GridEntry)(lItem)).Component 
    // Zugriff via Reflection 
    var lComponent = lItem.GetType().GetProperty("Component").GetValue(lItem, null); 

    if (lComponent != null) 
     tsmi_Reset.Enabled = lItem.PropertyDescriptor.CanResetValue(lComponent); 
    else 
     tsmi_Reset.Enabled = lItem.PropertyDescriptor.CanResetValue(lGrid.SelectedObject); 
    } 
} 

// Contextmenu -> Reset 
private void OnResetProperty(object sender, EventArgs e) 
{ 
    var lGrid = mCurrentControl as PropertyGrid; 

    if (lGrid != null) 
    lGrid.ResetSelectedProperty(); 
}