【问题标题】:Inherited controls not refreshing correctly继承的控件未正确刷新
【发布时间】:2016-01-31 04:12:39
【问题描述】:

我有 2 个功能相似的按钮,因此我创建了一个基本按钮类和派生按钮类。

我遇到的问题是,如果我将子按钮放在表单上,​​对基本按钮进行一些更改并重建它,表单上的子按钮不会反映更改。重建后放置在表单上的新子按钮,它具有更改的属性。基本上,已经放在窗体上的控件在基础控件重建后不会刷新。

我无法刷新设计器上的控件,因为它们太多了。我猜如果将控件放在表单上,​​它的属性会被设置(?)。也许我在继承方面做得不够好,在这里遗漏了一些东西。

我想知道如何刷新在修改基本控件之前放在表单上的子控件。

更新,带有最小、完整和可验证的示例:

这是 VB.NET 中的示例。

Public Class ButtonA
    Public Sub New()
        Me.Size = New Size(200, 200)
    End Sub
End Class

Public Class ButtonB
    Inherits ButtonA
End Class

将名为 btnB 的 ButtonB 实例放入表单后,ButtonA 的默认大小变为

Me.Size = New Size(300, 300)

项目重建后,当我回顾设计器视图时,btnB 的大小仍然是 (200, 200),而不是 (300, 300) 作为它的基本默认大小。

大小仅用作示例,它适用于任何属性。

【问题讨论】:

  • 也许您打算只使用 winforms 标签而不是 C# 或 VB.NET?将两个标签都放在您的问题上通常是错误的,因为问题和答案都不能同时涉及 C# 和 VB.NET。至于问题本身:“如果将控件放在表单上,​​则设置它的属性” - 是和否。如果属性的值不是控件的默认值,则在 *.Designer.cs 文件中设置属性。如果没有一个好的minimal reproducible example 清楚地表明你在做什么以及确切的问题是什么,就没有办法回答这个问题。
  • 对不起,我不明白你们的意思。这是一个普遍的问题,而不是特定于语言的问题,因为它都发生在我的 C# 和 VB.NET 中的 winform 项目中。他们使用相同的 .NET 框架,我很困惑为什么把两个标签都认为是错误的。如果 C# 可以做某事,那么 VB.NET 大部分时间都可以做同样的事情,即使在语法上会有一些差异。如果我错了,请纠正我。
  • “我很困惑为什么把这两个标签都认为是错误的”——因为(正如你所说的)“这是一个普遍的问题,而不是特定于语言的问题"。您在问题上使用的标签表明您实际需要帮助的问题的哪一部分。语言标签指示正在使用的语言。如果您不在乎什么语言,则无需提供语言标签。您应该包含“winforms”标签,因为您的问题显然涉及 Winforms 功能。
  • 我确实关心语言,.NET,因此我使用了 C# 和 VB.NET。我不是在 Java 或 Python 中问这个问题。 Winform 是 .NET 框架的一部分。按照您的逻辑,您是说 stackoverflow 中的大多数问题都有无效标签。
  • @fwan - 根据您的 逻辑,您也应该使用 F# 标记您的问题,因为该语言是 .NET 框架的一部分。

标签: vb.net winforms


【解决方案1】:

问题在于,一旦您在表单上放置了控件,您正在更改设计者根据设计不得使用的属性值。设计器允许您在表单中放置某个类的控件,第一次插入时会从该控件中获取关于大小应该是多少的线索。然后它将该大小分配给此表单中的该控件。您可以随时通过更改表格中任何表格的大小或位置来修改表格。设计师将跟踪所有这些。

如果您现在修改源代码以使用不同的“默认”尺寸值,那么,这将不会反映在尺寸更改之前创建的表单上 - 那就是因为该控件已经存在于您的表单中,因此设计者不再需要对大小进行任何更改。

如果您确实想要覆盖此行为,则必须在设计器代码(Form.Desisgner.cs - 在 C# 中或其 VB 等效项)中删除 Size 属性的分配。但请注意 - 下次您启动设计师时,它可能会将尺寸放回原处。

【讨论】:

  • 这是我想知道的。我很清楚。我应该小心使用继承控件,因为两个相同的控件可能具有不同的默认值。
猜你喜欢
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 2014-09-25
  • 2011-07-13
  • 2016-11-05
  • 2019-10-16
相关资源
最近更新 更多