2010-03-12 38 views
8

我甚至不知道如果我正确地做到这一点。但基本上我有一个由类构建的对象列表。从那里,我绑定列表,这是一个Windows窗体(C#)对象的数据绑定列表到WinForms DataGridView,但不显示某些公共属性

从那里放置了一个DataGrid视图,它显示了对象的所有公共属性,在数据网格视图。然而,我仍然需要从我的应用程序的其他部分访问某些属性,但并不需要在DataGridView中可见。

那么,有没有一个属性或类似的,我可以写入属性上面被排除出它的东西。

P.S.我在运行时绑定。所以我不能通过设计师编辑列。

P.P.S.请不要只是公开变量的答案(虽然如果这是唯一的方式,让我知道:))。

+3

您可以禁用'DataGridView.AutoGenerateColumns'(http://goo.gl/41qt)并动态添加所需的列。当你说“...我是在运行时绑定的,所以我不能通过设计师编辑列”。 – Vivek 2010-03-12 23:52:01

+0

我说的是。我不使用设计器并绑定到数据源。我只是写作: datagridview.datasource = mylist; – MindingData 2010-03-13 00:02:12

+0

也许你可以告诉我们为什么你在运行时绑定而不是通过设计器。这可能有帮助 – 2010-03-13 00:42:49

回答

14

添加[Browsable(false)]属性,你不想生成列的公共属性。

+1

+1如果只是添加这个工程,这比我的答案要好得多! :-) – Javier 2010-03-13 00:52:40

+0

不错,我已经试过了,它的工作原理=)我正在尝试添加我的自定义类。谢谢! – Javier 2010-03-13 00:59:56

2

我回答一样@Vivek在他的评论说。我不知道他为什么didn't这里补充一个答案......

好吧,如果你让一个DataGridView控制自动生成它的列,它显示了在绑定对象的所有属性。所以首先,你必须打开DataGridView.AutoGenerateColumns = false

然后,您可以在运行时添加列。例如:

DataGridViewColumn myColumn = new DataGridViewTextBoxColumn(); 
myColumn.DataPropertyName.HeaderText = "Title of the column"; 
myColumn.DataPropertyName = "NameOfTheProperty"; 

//... 

MyDataGridView.Columns.Add(myColumn); 
+0

手动添加所有内容可能是我在这里的最后一招。 – MindingData 2010-03-13 00:02:53

+0

然后,我有一个想法,但它太大了,我会把它放在另一个答案。 – Javier 2010-03-13 00:11:41

+1

忘掉这个第二个想法。请参阅@Vivek答案,而不是= P – Javier 2010-03-13 01:00:50

0

除了我以前的答案,因为你喜欢示意不要手动添加列,我建议你另一种选择:在属性定义使用自定义属性。

首先,你必须编写自定义属性:

MyPropertyAttribute类

你可以在你的类使用它,就像这样:

Foo类

public class Foo 
{ 
    private string name; 
    private string surname; 

    [MyPropertyAttribute(MyPropertyAttribute.VisibilityOptions.visible)] 
    public string Name 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
     } 
    } 

    [MyPropertyAttribute(MyPropertyAttribute.VisibilityOptions.invisible)] 
    public string Surname 
    { 
     get 
     { 
      return surname; 
     } 
     set 
     { 
      surname = value; 
     } 
    } 

} 

您可以编写一个方法,使用反射来迭代绑定对象中的属性,并测试它们是否被标记为可见或不可见,以添加或不添加列。你甚至可以拥有一个自定义的DataGridView,所以你不必每次都重复这个。您只能使用自定义的DataGridView,并在属性中标记可见性。

事情是这样的......

public class MyCustomDataGridView : DataGridView 
    { 

     public MyCustomDataGridView() 
     { 
      this.AutoGenerateColumns = false; 
     } 

     public void Load<T>(ICollection<T> collection) 
     { 

      foreach(object myAttribute in typeof(T).GetCustomAttributes(typeof(MyPropertyAttribute).GetType(), true)) 
      { 
       if (((MyPropertyAttribute)myAttribute).Visibility == MyPropertyAttribute.VisibilityOptions.visible) 
       { 
        //... 
       } 
      } 

     } 

    } 
0

我知道它的一些旧帖子,但为了清晰起见,我想补充一点,这也可以通过使用ICustomTypeDescriptor界面定义自定义类型定义来实现。它看起来有点多工作,但你只能实现你需要的东西(在这种情况下GetProperties)。它让事情变得更容易,因为大多数列表自动生成的网格/列表支持这种方法。

相关问题