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

时间:2013-05-14 15:09:57

标签: c# winforms visual-studio-2010 datagridview designer

我正在使用带有DataGridView控件的winforms应用程序,我遇到了一些令人沮丧的事情。

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

  1. 在我的代码中,DataGridView无法访问。它就像在表格上不存在一样。考虑到这一点,因为设计者将其声明为InitializeComponent()方法的一部分,而不是初始化所有其他控件的地方。

  2. 因为它在设计师中,我在那里所做的任何改变都被颠倒了所以我无法解决这个问题。

  3. 有没有办法阻止Visual Studio这样做?我通过使用其中一个datagrid列(可访问的ARE)来创建对其关联的datagridview的引用并以此方式访问它。它有效,但它的丑陋和根本不直观。

3 个答案:

答案 0 :(得分:2)

我想我找到了它:

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

该属性用于执行此操作:从代码窗口隐藏控件。它对于您不需要在代码中处理的Labels或ToolStripSeparators非常有用。

答案 1 :(得分:0)

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

单击数据源上的下拉列表并添加新数据源,然后选择必要的对象,在我的示例中为订单明细对象。以下是我的一些设计师代码,由VS2010

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

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

orderDetailBindingSource.DataSource = orderDetList;

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

关于第二个问题,一旦您使用设计师进行上面列出的更改,我认为您不会遇到这个问题。

答案 2 :(得分:0)

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

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

我同意,应该有更好的方法,例如Visual Studio Designer声明控件就像它对表单上的大多数其他控件一样。与此同时,这也有效。

警告!

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

修改

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

在Designer的形式中,选择DataGridView,打开其属性并查找GenerateMember属性(在“设计”节点下),并确保将其设置为True。设置为True后,Designer将为DataGridView控件声明成员变量。

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

顺便说一下,@ LarsTech的回答与此次更新相同。