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

Blo*_*ard 41 c# attributes datagridview properties winforms

我有一个这样的课:

private class MyClass {
  [DisplayName("Foo/Bar")]
  public string FooBar { get; private set; }
  public string Baz { get; private set; }      
  public bool Enabled;
}
Run Code Online (Sandbox Code Playgroud)

当我创建一个List<MyClass>并将其分配给DataSourcea时DataGridView,网格显示两列,"Foo/Bar"和"Baz".这就是我想要发生的事情.

它目前有效,因为Enabled是一个字段,而不是属性 - DataGridView只会获取属性.但是,这是一个肮脏的黑客.

我也想使Enabled成为一个属性,但仍然将它隐藏在DataGridView上.

我知道我可以在绑定后手动删除列..但这并不理想.

是否有类似于DisplayName的属性,我可以用?标记属性?有点像[Visible(false)]

C-P*_*uru 72

[Browsable(false)]将隐藏一个属性DataGridView.

可视化设计器通常在"属性"窗口中显示那些没有可浏览属性或标记为BrowsableAttribute构造函数的可浏览参数设置为true的成员.可以在设计时修改这些成员.标有BrowsableAttribute构造函数的可浏览参数设置为false的成员不适合设计时编辑,因此不会显示在可视化设计器中.默认值为true.

  • 我同意,但在阅读(并重新阅读)框架设计指南(http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756)后,我发现设计师没有'总是遵循他们自己的规则(有时做一些没有意义的事情). (5认同)
  • 这很有趣,在我的眼中[Bindable(false)]应该有效并且Browsable(根据帮助)只定义PropertyGrid中是否显示了属性.但是DataGridView会忽略Bindable(false). (3认同)

Yoo*_*eek 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;
Run Code Online (Sandbox Code Playgroud)

  • 我很高兴看到我不是唯一一个不能通过表单设计器访问`AutoGenerateColumns`属性的人. (2认同)