【问题标题】:Designer resets property value设计器重置属性值
【发布时间】:2010-02-10 18:20:20
【问题描述】:

我在为属性设置默认值时遇到问题,每次在其中修改表单时,Visual Studio 设计器都会“更新”该属性。

情况:

class MyHour { 
    MyHour() {} 
    MyHour(string h) {} 
}

class MyPanel { 
    _FirstHour = new FirstHour("13:00");

    [DefaultValue("13:00")]
    Hour FirstHour {get { return _FirstHour; } set{...}} 
}

当 MyPanel 在 VS Designer 中,并且 Designer 被修改时,它(重新)设置 my(已经预初始化):

MyHour myHour1 = new MyHour();
...
myPanel1.FirstHour = myHour1;

我希望它设置这个(或者只是不要触摸这个属性):

MyHour myHour1 = new MyHour("13:00");
...
myPanel1.FirstHour = myHour1;

【问题讨论】:

    标签: .net .net-2.0 windows-forms-designer visual-studio-designer


    【解决方案1】:

    如果我正确理解了这个问题,您想知道为什么 VS 设计器不将该属性初始化为您使用 DefaultValue 设置的属性?

    DefaultValueAttribute 实际上并没有导致该默认值被设置,它只是通知设计者一个默认值,该对象通常被初始化,以便设计者知道是否它已被修改(即是否需要序列化并在属性网格中显示为粗体)。

    要实际设置默认值,您需要在字段上使用初始化程序或在默认(无参数)构造函数中设置值。

    【讨论】:

    • 是的,我还从 MSDN 看到:“成员的默认值通常是它的初始值。视觉设计师可以使用默认值来重置成员的值。代码生成器也可以使用默认值来确定是否应该为成员生成代码。”最后“A DefaultValueAttribute 不会导致成员使用属性值自动初始化。您必须在代码中设置初始值。”我设置了,但设计者将其重置回来。 “初始化程序”是什么意思?
    • @serhio:字段初始化程序将字段声明为private string hour = "13:00"。最后一部分是初始化程序。如果你不能这样做(即你正在使用自动属性),那么你必须在构造函数中初始化它。
    • 我已经在 MyObj 中进行了初始化。我会更新代码。我进行了初始化,但设计师用一个新的(空的)“更新”了我的初始化小时。
    • @serhio:您更新的问题发生了重大变化。您不能简单地将字符串设置为类的默认值。您需要实现一个类型转换器,然后使用[DefaultValue("13:00", typeof(Hour))] 初始化默认值。见这里:msdn.microsoft.com/en-us/library/ayybcxe5.aspx
    【解决方案2】:

    即使不是“完全满意”的解决方案,这也是一个:

    class MyPanel { 
        _FirstHour = new FirstHour("13:00");
    
        [DefaultValue("13:00"), 
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        Hour FirstHour {get { return _FirstHour; } set{...}} 
    }
    

    设计师不再碰FirstHour属性。

    【讨论】:

      猜你喜欢
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 2020-06-06
      相关资源
      最近更新 更多