2009-04-13 2 views
5

Я использую PropertyGrid для отображения свойств из моих объектов. Однако я также позволяю пользователю создавать свои собственные свойства и устанавливать значения для этих настраиваемых свойств. Каждый объект, который может иметь эти пользовательские свойства, имеет сборник Dictionary, где строка является уникальным ключом для идентификации свойства, а Object является значением примитивного типа (строка, bool, int и т. Д.).Сброс свойств из сетки свойств

I ' ve создал собственный PropertyDescriptor с методами get и set, которые проверяют словарь для соответствующего ключа или создают/перезаписывают значение соответствующим ключом соответственно.

Однако я также хочу дать пользователю возможность очистить свойство и, таким образом, полностью удалить его запись из словаря. Я бы поставил код на это в методе переопределения ResetValue моего настраиваемого PropertyDescriptor, однако я не вижу никакого способа через интерфейс PropertyGrid, чтобы его вызывать? Кажется, это не параметр контекстного меню, а нечто подобное.

Итак, если у меня есть собственный PropertyDescriptor с настраиваемым методом ResetValue, как я действительно вызываю этот метод из PropertyGrid?

ответ

3

Я думаю, что самый простой способ для достижения этой цели является добавление ContextMenu к сетке собственности, с пунктом меню «Сброс», а затем обработать его щелчок событие так:

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

Я думаю, что Visual Studio делает что-то подобное.

+0

Ahh да, я только что нашел этот пост на MSDN, а также. Похоже, это лучший вариант. http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/9dd7b9bf-4134-4105-aba8-65002fed04f2 –

+0

Да, вызов propGri.SelectedGridItem.Select() кажется, что он устраните некоторые проблемы с обновлением. –

1

Аннотация: Свойство PropertyGrid.SelectedObject возвращает неверное значение (компонент) в Childobjects. Следовательно, метод CanResetValue получил неправильный компонент.

Мое решение:

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(); 
} 
Смежные вопросы