3

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

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

  1. 在我的代码中,无法访问 DataGridView。它就像它不存在于表单上。对此进行调查,这是因为设计人员将其声明为 InitializeComponent() 方法的一部分,而不是在它初始化所有其他控件的位置。

  2. 因为它在设计器中,所以我在那里所做的任何更改都会被撤销,所以我无法解决这个问题。

有没有办法阻止视觉工作室这样做?我通过使用其中一个 datagrid 列(可以访问)来创建对其关联的 datagridview 的引用并以这种方式访问​​它,从而发现了一个 hack。它有效,但它丑陋且根本不直观。

4

3 回答 3

2

我想我找到了:

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

该属性用于执行此操作:从代码窗口中隐藏控件。它对于不需要在代码中处理的标签或工具条分隔符很有用。

于 2013-05-14T16:16:54.143 回答
0

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

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

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

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

orderDetailBindingSource.DataSource = orderDetList;

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

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

于 2013-05-14T15:20:48.337 回答
0

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

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

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

警告!

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

编辑

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

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

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

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

于 2016-01-07T18:15:03.897 回答