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

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

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移动/缩放到另一个窗体(ZoomForm)。 Anchor似乎不适用于使用SetParent()移动的控件…更确切地说,它可能正在工作,但我重新绘制了问题。

我得到Anchor / Dock对没有重新绘制问题[我删除了resize事件连线并调整了Dock to Fill]

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

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

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

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

正如递归注释,您应该只使用Anchor属性。

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

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

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

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

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

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

第一部分 –

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

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

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

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