我使用的是PropertyGrid中显示从我的对象的属性。不过,我也允许用户创建自己的属性,并为这些自定义属性设置的值。可以具有这些自定义属性的每个对象具有字典集合,其中所述字符串是一个唯一键来标识属性,对象是一个基本类型的值(字符串,布尔,整数等。)

我已经创建与获得自定义的PropertyDescriptor并设置检查词典匹配键,或者创建/覆盖分别与匹配的密钥值的方法。

然而,我也希望给用户清除特性,因此删除完全字典其条目的能力。我把代码给这个在我的自定义的PropertyDescriptor的ResetValue重写方法,但是我没有看到过的PropertyGrid接口的任何方式来envoke呢?这似乎不是一个上下文菜单选项或类似的东西明显。

所以,如果我有一个自定义的ResetValue方法自定义PropertyDescriptor的,实际上,我怎么从PropertyGrid中唤起的方法?

有帮助吗?

解决方案

我认为实现这一目标的最简单的方法是将一个文本菜单添加到您的属性网格,与菜单项“复位”,然后再处理它的Click事件是这样的:

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

我觉得Visual Studio中做这样的事情。

其他提示

译注: 该PropertyGrid.SelectedObject返回错误的值(成分)Childobjects。 因此,该方法CanResetValue recived一个不正确的组件。

我的解决方案:

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();
}

有关子对象的引用包含属性隐藏在Instance类的非公开的后代的GridItem属性的对象。值得庆幸的是,这个属性是ITypeDescriptorContext接口,这些子类都实现的成员。所以,存在包含在正确的上下文菜单使复位命令的所有属性的一个解决方案:

private void contextMenuToolStrip_Opening(object sender, CancelEventArgs e)
{
  var item = propertyGrid.SelectedGridItem;
  resetToolStripMenuItem.Enabled = item != null &&
                                   item.GridItemType == GridItemType.Property &&
                                   item is ITypeDescriptorContext context &&
                                   item.PropertyDescriptor.CanResetValue(context.Instance);
}

private void resetToolStripMenuItem_Click(object sender, EventArgs e)
{
  propertyGrid.ResetSelectedProperty();
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top