数据网格和设计器在VS2010中的奇怪行为

本文关键字:VS2010 网格 数据网 数据 | 更新日期: 2023-09-27 18:13:24

我正在制作一个带有DataGridView控件的winforms应用程序,我正在经历一些令人沮丧的事情。

首先,我想关闭AutoColumnGeneration,但它没有在属性中列出。没问题,我可以用一行代码做到这一点……这就是奇怪的地方:

  1. 在我的代码,DataGridView是不可访问的。就好像它不存在于表格上。仔细研究一下,这是因为设计师将其声明为InitializeComponent()方法的一部分,而不是在初始化所有其他控件的地方。

  2. 因为它在设计器中,我在那里做的任何更改都会被逆转,所以我无法修复这个。

有什么方法可以阻止visual studio这样做吗?我发现了一种破解方法,通过使用其中一个数据网格列(可访问的)来创建对与其关联的数据网格视图的引用,并以这种方式访问它。它可以工作,但它很丑,一点也不直观。

数据网格和设计器在VS2010中的奇怪行为

我想我找到了:

在设计器中,单击DataGridView控件,将GenerateMember的属性更改为true。我猜它被设置为false。

该属性的作用就是:在代码窗口中隐藏控件。对于不需要在代码中处理的标签或ToolStripSeparators,它非常有用。

我个人使用绑定源作为数据源,它甚至可以是一个对象,然后在列下它将列出所有可用的列,您可以选择哪些列是可见的,以及一系列其他选项,包括格式化。

单击数据源上的下拉菜单,添加一个新的数据源,并选择必要的对象,在我的例子中是一个订单详细信息对象。这是我的一些设计器代码,这是由VS2010

创建的
this.dgvOrderDetails.DataSource = this.orderDetailBindingSource;
this.orderDetailBindingSource.DataSource = typeof(OrderDetail);

以及设置数据以填充datagridview的绑定源代码(我编写了这一部分)

orderDetailBindingSource.DataSource = orderDetList;

然后只需单击datagridview的Columns属性上的省略号,它将列出对象中可用的所有列,并设置我想要的可见列,顺序,格式等。

至于第二期,我认为一旦你使用设计师做了我上面列出的更改,你就不会有这个问题了。

在我的例子中,我在Form的部分类(我的代码的文件,而不是设计器的文件)中声明了一个私有属性,通过在Controls层次结构中导航来返回控件。

private DataGridView MyGrid
{
    get { return (DataGridView)this.Controls[0].Controls[1].Controls[0].Controls[1].Controls[0]; }
}

我同意,应该有一个更好的方法,比如Visual Studio Designer像窗体上的大多数其他控件一样声明控件。在此期间,这是有效的。

警告!

如果表单的控件层次结构被更改,则必须手动更新属性的定义。

编辑

我有一个更好的解决方案——至少在Visual Studio 2012中。

在表单设计器中,选择DataGridView,打开其属性并查找GenerateMember属性(在Design节点下),并确保将其设置为True。一旦设置为True,设计器将为DataGridView控件声明一个成员变量。

奇怪的是,默认值似乎是True,所以我很好奇它是如何更改为False ?也许我在设置名称时点错了?

顺便说一下@LarsTech的回答和这个更新是一样的