无法修改表达式,因为它不是变量

时间:2009-04-15 00:33:11

标签: c# winforms user-controls

我正在尝试在Windows窗体上获取一个UserControl(其上有一个网格)来调整大小。 以下代码是我在表单中的内容。我得到的行为是,当我把它变大时,控件会被调整大小。但它并没有缩小。我做错了什么(或)我错过了什么?

private void AdjustGrid()
{
    ZoomControl.Location = new Point(5, 5);
    ZoomControl.Size = new Size(this.Width - 15, this.Height - 75);
}

void zoomform_Resize(object sender, EventArgs e)
{
    AdjustGrid();
}

现在用户控件具有以下代码:

//Resize the grid that the UserControl has on it
private void NameValuePropertyBag_Resize(object sender, EventArgs e)
{
    grdNameValueProperties.Location = new Point(4,4);
    grdNameValueProperties.Size = new Size(this.Width - 8, this.Height - 8);
}

<击> 我试过

grdNameValueProperties.Size.Width = this.Width - 8;
grdNameValueProperties.Size.Height = this.Height -8;

它给了我“无法修改表达式,因为它不是变量”错误...我错过了什么?

其他信息:

我正在使用SetParent()Windows调用将UserControl移动/缩放到另一个Form(ZoomForm)。 <击> Anchor似乎不适用于使用SetParent()移动的控件...更确切地说,它可能正在工作,但我重新绘制了问题。

我让Anchor / Dock对工作没有重复问题[我删除了调整大小事件连线并调整了Dock to Fill]

ZoomForm最初没有控件。 Usercontrol动态添加到ParentForm。

目前,我可以使用上面的代码使缩放形式更大,但不能更小。

5 个答案:

答案 0 :(得分:7)

grdNameValueProperties.Size.Width = this.Width - 8;
grdNameValueProperties.Size.Height = this.Height -8;

该代码给出错误,因为Size是值类型,而不是引用类型。阅读此http://www.yoda.arachsys.com/csharp/parameters.html可能有助于解释值类型和引用类型之间的区别。

答案 1 :(得分:4)

在递归评论时,您应该只使用Anchor属性。

错误发生,因为Size属性公开结构而不是引用类型。 Size属性返回控件的size对象的副本。写入此副本的属性Width和Hight是没有意义的,因为它只是一个临时副本,而不是由内存在任何地方支持。

答案 2 :(得分:1)

您无法直接更改UserControl上的Size.Width属性,因为Size属性是值类型,因此更改其宽度基本上会覆盖整个Size属性。相反,WinForms中的控件提供了自己的Width和Height属性,因此这段代码应该可以工作:

grdNameValueProperties.Width = this.Width - 8;
grdNameValueProperties.Height = this.Height - 8;

话虽如此,我同意@recursive的评论,你应该只使用UserControl的Anchor属性来“自动”调整大小。

答案 3 :(得分:1)

目前,我可以使用上面的代码使缩放形式更大但不小。

某些控件上有一个MinSize(或类似)属性。你有任何这样的设置,你不能调整小吗?

答案 4 :(得分:0)

第一部分 -

首先,我建议在UserControl上使用Anchor属性,而不是尝试自己调整大小。它非常简单,非常可靠,用于处理窗口大小调整。

如果你想这样做,你应该看看链接off.ClientSize而不是this.Height和this.Width。你可能把你的控制设置得太大了,而且你没有考虑你所坐的面板或其他东西,这会导致各种各样的问题。

第二部分是由于gridNameValue Properties.Size.Width是结构的成员。

当你调用gridNameValueProperties.Size时,你将返回一个Size结构,然后尝试在返回的结构(而不​​是原始结构)上设置Width。这就是您需要一次性设置整个Size值类型的原因。创建一个新的Size()并将其设置为gridNameValueProperties.Size是使其工作的唯一方法。