我是C#的新手,但对编码并不陌生 - 已经做了差不多二十年了 - 并且在我正在构建的自定义控件中存在属性问题,这些属性继承自Panel。当我放置我的属性时,我可以在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; }
}
....
所以在我的表单中,例如在加载中,甚至在某个地方的click事件中,如果我把colorStrip1.showButtons = false;或colorStrip1.showButtons = true;无论如何(colorStrip1将是在设计模式下将控件放入表单后的实例名称)... console.write总是说'false';即使我在设计属性列表中将其设置为“true”,它也不会反映已确定的值,即使我将其默认为true,也不会在外部进行更改。有任何想法吗?非方法都没有获得新的和外部结算的属性值,显然getter / setter的东西不起作用。在我看来,我没有按照我设置或获得我的属性的方式做得很好在课堂外。它只在它里面工作,作为一种魅力......任何帮助......非常感谢!
干杯
锂
P.S。澄清解决方案:
在这种情况下设置属性不起作用,因为我试图在构造函数中使用新的设置值,这似乎无法获取新值,因为它是,好吧,构建事情。如果我在设计模式中更改属性值>属性编辑器或在对象外部的代码中,比如在它的父窗体的加载事件中,它将改变它,但除了构造函数之外的所有方法都可读,当然:)
答案 0 :(得分:1)
这可能是执行顺序的问题。你的属性setter只是设置一个变量,但实际上并没有触发控件上的任何东西来更新与这个变量相关的状态(例如添加或显示我假设的按钮)。
当你设置属性时,剩余的初始化完成,正在使用该值,否则不是因为在初始化期间默认值仍然是属性值。
你需要对setter采取行动,这里有一些假代码来说明:
set {
_showButtons = value;
if (alreadyInitialized) {
UpdateButtons();
}
}
注意:请务必先设置值,然后执行操作 - 否则您最终会使用旧值(就像Console.Write()
正在做的那样)。
答案 1 :(得分:0)
引用的代码看起来没有问题。您确定要引用相同的ColorStrip实例吗?另外,请检查.Designer.cs文件以确保设置属性的代码存在。
实际上,请尝试使用自动实现属性来简化代码:
public int clusterSize { get;set;}
public Boolean showButtons {get;set;}
public ColorStrip() { ... clusterSize = 20; ... }