我有一个这样的课程:
private class MyClass {
[DisplayName("Foo/Bar")]
public string FooBar { get; private set; }
public string Baz { get; private set; }
public bool Enabled;
}
当我创建List<MyClass>
并将其分配给DataSource
的{{1}}时,网格会显示两列,“Foo / Bar”和“Baz”。这就是我想要发生的事情。
它目前有效,因为Enabled是一个字段,而不是属性 - DataGridView只会获取属性。然而,这是一个肮脏的黑客。
我也希望启用一个属性,但仍然将它隐藏在DataGridView上。
我知道我可以在绑定后手动删除列..但这并不理想。
是否有类似于DisplayName的属性,我可以用?标记属性?像DataGridView
?
答案 0 :(得分:71)
[Browsable(false)]
会隐藏DataGridView
的属性。
可视化设计器通常在“属性”窗口中显示那些 没有可浏览属性或标记为的成员 BrowsableAttribute构造函数的可浏览参数设置为true。 可以在设计时修改这些成员。成员标有 BrowsableAttribute构造函数的可浏览参数设置为false 不适合设计时编辑,因此不适合 在视觉设计师中展示。默认值为true。
答案 1 :(得分:10)
我一直没有意识到System.ComponentModel
装饰器属性如BrowsableAttribute
和它的亲属与绑定到PropertyGrid
之外的任何东西都有关系。 ( facepalm )我喜欢C-Pound Guru的方法,因为它允许你保持GUI比我过去做的更松散耦合。
仅仅从不同的角度来看,我长期使用的方法是以编程方式或通过表单设计器预先定义DataGridView中的列。执行此操作时,您可以将每列的DataPropertyName
设置为您的媒体资源的名称。唯一的技巧是您需要将DataGridView的AutoGenerateColumns
属性设置为false,否则DGV将完全忽略您手动创建的列。请注意,无论出于何种原因,AutoGenerateColumns
属性在表单设计器的属性网格中隐藏...不知道为什么。我看到这种方法的一个优点是你可以预先设置列格式等 - 你不必绑定然后调整列渲染/大小调整设置。
这是我的意思的一个例子:
_DGV.AutoGenerateColumns = false;
DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn();
textColumn.DataPropertyName = "FooBar";
textColumn.HeaderText = "Foo/Bar"; // may not need to do this with your DisplayNameAttribute
_DGV.Columns.Add(textColumn);
textColumn = new DataGridViewTextBoxColumn();
textColumn.DataPropertyName = "Baz";
List<MyClass> data = GetMyData();
_DGV.DataSource = data;
答案 2 :(得分:-2)
使用[Display(AutoGenerateField = false)]
隐藏您不想要的属性。