【问题标题】:Why my control's properties won't change outside its class?为什么我的控件的属性在其类之外不会改变?
【发布时间】:2010-12-15 20:43:04
【问题描述】:

我是 C# 新手,但对编码并不陌生——我已经做了将近 20 年——而且我正在构建的自定义控件的属性存在问题,该控件继承自面板。当我放置我的属性时,我可以在 Designer 属性列表中看到它们,甚至可以设置它们,但是在运行我的小应用程序时,似乎没有使用这些属性值。如果我以编程方式更改属性也是如此:没有错误,但我的控件什么也不做,就像它们没有正确设置一样。但是,如果我在课堂上以编程方式进行,它们确实有效。我的猜测是我的属性设置/获取内容中的某些内容不正确。请参阅以下代码块了解我的操作方式:

public class ColorStrip : Panel
{
    // properties
    // ------------------------------------------
    // size of color clusters (boxes)
    private int _clusterSize = 20;
    // controls if show the buttons panel
    private Boolean _showButtons;

    // property setters/getters
    // ------------------------------------------
    // clusterSize...
    public int clusterSize
    {
        get { return _clusterSize; }
        set { _clusterSize = value; }
    }
    // showButtons...
    public Boolean showButtons
    {
        get { return _showButtons; }
        set { Console.Write(_showButtons); _showButtons = value; }
    }
    ....

所以在我的表单中,例如在加载或什至在某处的点击事件中,如果我把 colorStrip1.showButtons = false;或 colorStrip1.showButtons = true;无论如何(colorStrip1 将是在设计模式下将控件放入表单后的实例名称)... console.write 总是说“假”;即使我在设计属性列表中将其设置为“true”,它也不会反映已确定的值,即使我将其默认为 true,它也永远不会在外部更改。有任何想法吗?这些方法都没有获得新的和外部解决的属性值,显然 getter/setter 的东西不起作用。在我看来,我设置或获取属性在类之外的方式并不正确。它仅在其中起作用,作为一种魅力...任何帮助...非常感谢!

干杯

附言澄清解决方案:

在这种情况下设置属性不起作用,因为我试图在构造函数中使用新的设置值,这似乎无法获取新值,因为它正在构建事情。如果我在设计模式 > 属性编辑器或在对象外部的代码中更改属性值,例如在它的父窗体的加载事件中,它将更改它,但对于除构造函数之外的所有方法都是可读的, 当然:)

【问题讨论】:

  • 是否有多个线程获取和设置属性?可以给我们测试代码吗?
  • 请记住,您正在写出 _showButtons 值 - 如果您连续执行两组,您会看到新值吗?跨度>
  • 注意.NET中的属性应该使用pascal-casing命名,即第一个字母应该大写。
  • 男孩们——如果有女孩们——谢谢你的回信。我发现了问题:如果我尝试在构造函数中访问我的属性,他们不会将值放在外部,也不会使用 Design 属性编辑器,我猜为什么:对象此时还没有准备好。哦,愚蠢的我!如果我尝试以任何其他方法访问属性,那么它可以工作。谢谢大家! --谢天谢地,我打了个盹!--

标签: c# properties getter-setter


【解决方案1】:

这可能是执行顺序的问题。您的属性设置器只是设置了一个变量,但实际上并没有触发控件上的任何内容来更新与此变量相关的状态(例如,添加或显示我假设的按钮)。

在其余的初始化完成之前设置属性时,该值正在使用,否则不是因为在初始运行期间默认值仍然是属性值。

你需要对setter进行操作,这里有一些伪代码来说明:

set {
  _showButtons = value;
  if (alreadyInitialized) {
    UpdateButtons();
  }
}

注意:确保先设置值,然后采取行动 - 否则您最终会使用旧值(就像您的 Console.Write() 正在做的那样)。

【讨论】:

  • 好吧,我还没有进一步使用这个属性实现任何东西,只是在构造函数和构造函数调用的函数中读取它:它应该加载一个带有颜色代码的 txt 文件并开始添加颜色clusters --彩色面板--但如果 showButtons 为真或假,左开始应该是不同的 --如果为真,颜色簇的左开始应该是 100 像素,如果是假,它应该是 0
  • 是的!这确实是一个执行顺序....我发现了问题:如果我尝试在构造函数中访问我的属性,他们将不会将值放在外部,也不会使用 Design 属性编辑器,我猜为什么:对象还没有准备好在那时候。哦,愚蠢的我!如果我尝试以任何其他方法访问属性,那么它可以工作。谢谢大家! --谢天谢地,我打了个盹!--
【解决方案2】:

引用的代码看起来没有问题。您确定您引用的是同一个 ColorStrip 实例吗?此外,请检查您的 .Designer.cs 文件以确保设置属性的代码在那里。

事实上,尝试使用自动实现属性来简化您的代码:

public int clusterSize { get;set;}
public Boolean showButtons {get;set;}

public ColorStrip() { ... clusterSize = 20; ... }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2020-06-14
    • 2019-09-10
    • 2022-01-06
    • 2012-02-10
    • 2010-12-14
    • 1970-01-01
    相关资源
    最近更新 更多