如何制作一个剥离的PropertyGrid

时间:2011-02-21 17:57:54

标签: c# .net propertygrid

我正在构建一个应用程序,我在树视图中显示数据,当用户双击树视图中的元素时,他们单击的节点将替换为节点的可编辑版本。编辑不同节点的方式差异很大,因此使用内置功能更改节点文本是不可接受的。我需要使用属性网格并定义[Editor]属性。

唯一的问题是属性网格显示两列:一列具有属性的名称,另一列具有其值。我只需要显示值列(用户可以编辑的部分)。有没有办法删除第一列,或在另一个只显示一列的自定义类中使用属​​性网格的功能?

1 个答案:

答案 0 :(得分:2)

如果不破坏财产网格,这是不可能的。这是一个可以更改标签列宽度的代码:

public static void SetLabelColumnWidth(PropertyGrid grid, int width)
{
    if (grid == null)
        throw new ArgumentNullException("grid");

    // get the grid view
    Control view = (Control)grid.GetType().GetField("gridView", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(grid);

    // set label width
    FieldInfo fi = view.GetType().GetField("labelWidth", BindingFlags.Instance | BindingFlags.NonPublic);
    fi.SetValue(view, width);

    // refresh
    view.Invalidate();
}

public static void ResetLabelColumnWidth(PropertyGrid grid)
{
    SetLabelColumnWidth(grid, -1);
}

像这样使用它来删除标签栏:

    SetLabelColumnWidth(propertyGrid1, 0);

重置功能可恢复标签栏。

当然,它是一个黑客,所以它可能在将来不起作用。还有一些问题:

  • 当鼠标移动到网格的左侧时,会显示v-splitter光标,用户可以选择它并在点击时重置标签列。
  • 某些网格操作也可能会恢复标签列(例如使用属性网格工具栏)。

希望这有帮助!