代码之家  ›  专栏  ›  技术社区  ›  MindingData

将对象列表数据绑定到Winforms DataGridView,但不显示某些公共属性

  •  8
  • MindingData  · 技术社区  · 16 年前

    我甚至不确定我做的是否正确。但基本上我有一个从类构建的对象列表。从那里,我将列表绑定到windows窗体上的datagrid视图(c)

    在那里,它在datagrid视图中显示对象的所有公共属性。但是,我仍然需要从应用程序的其他部分访问一些属性,但实际上并不要求这些属性在datagridview中可见。

    因此,是否有一个属性或类似的东西,我可以写在属性上方,以排除显示它。

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

    请不要回答只做公共变量的问题(如果这是唯一的方法,请告诉我:))。

    4 回复  |  直到 15 年前
        1
  •  14
  •   Vivek    16 年前

    添加 [Browsable(false)] 属性设置为不希望为其生成列的公共属性。

        2
  •  2
  •   Javier    16 年前

    我的回答和@vivek在评论中说的一样。我不知道他为什么不在这里加一个答案…

    好吧,如果让datagridview控件自动生成其列,它将显示绑定对象中的所有属性。所以首先,你必须 DataGridView.AutoGenerateColumns = false .

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

    DataGridViewColumn myColumn = new DataGridViewTextBoxColumn();
    myColumn.DataPropertyName.HeaderText = "Title of the column";
    myColumn.DataPropertyName = "NameOfTheProperty";
    
    //...
    
    MyDataGridView.Columns.Add(myColumn);
    
        3
  •  0
  •   Javier    16 年前

    除了我之前的回答之外,由于您更愿意指明不手动添加列,我建议您使用另一个选项: 在属性定义中使用自定义属性 .

    首先,必须对自定义属性进行编码:

    MyPropertyAttribute类

    [AttributeUsage(AttributeTargets.Property)]
    public class MyPropertyAttribute : Attribute
    {
        public enum VisibilityOptions
        {
            visible,
            invisible
        }
    
        private VisibilityOptions visibility = VisibilityOptions.visible;
    
        public MyPropertyAttribute(VisibilityOptions visibility)
        {
            this.visibility = visibility;
        }
    
        public VisibilityOptions Visibility
            {
                get
                {
                    return visibility;
                }
                set
                {
                    visibility = value;
                }
            }
    }
    

    你可以在课堂上使用它,就像这样:

    FO类

    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)
                    {
                        //...
                    }
                }
    
            }
    
        }
    
        4
  •  0
  •   mmix    15 年前

    我知道这有点老生常谈,但为了清楚起见,我想补充一点,这也可以通过使用 ICustomTypeDescriptor 接口。这看起来有点麻烦,但您只能实现所需的功能(在本例中是getproperties)。这使得以后的工作更容易,因为大多数列出的列auto gen grids/lists都支持这种方法。

    推荐文章