是否有一个属性我可以在我的类中使用,告诉DataGridView在绑定到List <myclass> </myclass>时不要为它创建一个列

时间:2009-07-01 01:33:23

标签: c# winforms datagridview properties attributes

我有一个这样的课程:

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

这样的东西

3 个答案:

答案 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)]隐藏您不想要的属性。