0

我是 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 的东西不起作用。在我看来,我在课堂外设置或获取属性的方式不正确。它仅在其中起作用,作为一种魅力...任何帮助...非常感谢!

干杯

ps澄清解决方案:

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

4

2 回答 2

1

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

当您在其余的初始化完成之前设置属性时,该值正在被使用,否则不是因为在初始过程中默认值仍然是属性值。

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

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

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

于 2010-12-15T21:11:51.810 回答
0

The quoted code doesn't look problematic. Are you sure you're referencing the same instance of ColorStrip? Also, check your .Designer.cs file to ensure that the code setting the property is there.

In fact, try simplifying your code by using auto-implementing properties:

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

public ColorStrip() { ... clusterSize = 20; ... }
于 2010-12-15T20:47:48.200 回答