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

dba5bblo  于 2022-11-16  发布在  其他
关注(0)|答案(5)|浏览(206)

我正在尝试调整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移动/缩放到另一个窗体(ZoomForm)。锚似乎对使用SetParent()移动的控件不起作用...更准确地说,它可能起作用,但我有重画问题。
我得到了锚/码头对工作没有重画的问题[我删除了调整大小事件wireup和调整码头填充]
ZoomForm最初没有控件。Usercontrol是动态添加到ParentForm中的。
目前,我可以用上面的代码使缩放窗体变大,但不能变小。

5vf7fwbs

5vf7fwbs1#

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

因为Size是实值型别,而不是指涉型别,所以该程式码会产生错误。阅读this可能有助于解释实值型别和指涉型别之间的差异。

t3irkdon

t3irkdon2#

正如recursive注解的那样,您应该只使用锚属性。
发生此错误是因为Size属性公开了一个结构而不是引用类型。Size属性返回控件的size对象的副本。写入此副本的Width和Hight属性没有任何意义,因为它只是一个临时副本,没有任何内存支持。

7d7tgy0s

7d7tgy0s3#

您无法直接变更UserControl上的Size.Width属性,因为Size属性是实值型别,所以变更其尺子实际上会覆写整个Size属性。WinForms中的控件会提供自己的Width和Height属性,因此下列程式码应该可以运作:

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

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

4sup72z8

4sup72z84#

  • 目前,我可以使用上面的代码使缩放窗体变大,但不能变小。*

有些控件有MinSize(或类似的)属性。您是否有任何控件设定成无法调整较小的大小?

x759pob2

x759pob25#

第一部分-
首先,我建议使用UserControl的锚属性,而不是自己调整大小。它在处理窗口大小调整时非常简单,也非常可靠。
如果你想这样做,你可能应该考虑链接this.ClientSize而不是this.Height和this. Width。你可能把你的控件设置得太大了,这会使你所在的面板或其他东西失去作用,这会导致各种各样的问题。
第二部分是由于gridNameValue的Properties.Size.Width是一个结构体的成员。
当你调用gridNameValueProperties.Size时,你会返回一个Size结构体,然后试图在返回的结构体(而不是原始结构体)上设置Width。这就是为什么你需要一次性设置整个Size值类型的原因。创建一个新的Size()并将其设置为gridNameValueProperties.Size是唯一的方法。

相关问题