2009-05-20 26 views
12

我有一個用戶控件,有幾個公共屬性,一個是我設置的對象[可瀏覽(false)]。當我在Visual Studio的設計器中添加此控件時,生成的代碼將此對象設置爲null。當用戶控件在公共屬性上的Browsable爲false時,爲什麼設計者在添加到表單時將其設置爲null?

public class Foo : System.Windows.Forms.UserControl 
{ 
    [Browsable(false)] 
    public object Bar { get; set; } 

    [Browsable(true)] 
    public bool IsSomething { get; set; } 

    ... 
} 

private void InitializeComponent() 
{ 
    ... 
    this.foo = new Foo(); 

    this.foo.IsSomething = false; 
    this.foo.Bar = null; 
    ... 
} 

我不明白爲什麼Visual Studio中想做到這一點,我很好奇,如果有一種方法,以紀念它,這樣它不設置它。我通過將對象設置爲構造函數中的某些東西來發現這一點,只是爲了觀察控件的父級將其設置回null。

+0

`Browseable`屬性僅用於指定公共屬性是否應在設計時顯示在「屬性窗口」中。所以如果你把它設置爲'false',它應該被顯示。你的`null`值可能是由`no rebuild`造成的。 – 2015-08-13 13:25:16

回答

20

這裏有幾個選項。首先,BrowsableAttribute只確定屬性是否顯示在屬性網格中。爲了防止序列在所有的屬性,使用DesignerSerializationVisibilityAttribute:

[Browsable(false)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
public object Bar { get; set; } 

第二,如果你想被序列化的屬性,但只有當用戶實際上已經改變了值,使用DefaultValueAttribute:

​​

如果屬性與默認值不同,這將導致該屬性僅被序列化。這還具有其他積極的副作用

  1. 屬性值在未更改時以普通字體顯示,但在更改時以粗體顯示。
  2. 右鍵單擊屬性網格中的屬性時,「重置」選項將可用。

有更多先進的技術來控制與設計者的財產交互(谷歌「ShouldSerialize」),但這些屬性應該讓你在那裏大部分。

+0

感謝您的回答。花了一點時間回到這個問題,但DesignerSerializationVisibility停止將控件設置爲null。 – Jeff 2009-08-04 14:23:26

2

通常,當您在自定義控件的構造函數中設置值時,VS設計器將生成代碼,以設置您在構造函數中設置的所有這些值。 IE:

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
} 

public class MyTextBox : TextBox 
{ 
    public MyTextBox() 
    { 
     this.Person = new Person 
     { 
      FirstName = "John", 
      LastName = "Doe", 
      Age = 45 
     }; 
    } 


    [Browsable(false)] 
    public Person Person { get; set; } 
} 

當我添加一個MyTextBox我的表,這是生成的代碼:

// 
// myTextBox1 
// 
this.myTextBox1.Location = new System.Drawing.Point(149, 91); 
this.myTextBox1.Name = "myTextBox1"; 
person1.Age = 45; 
person1.FirstName = "John"; 
person1.LastName = "Doe"; 
this.myTextBox1.Person = person1; 
this.myTextBox1.Size = new System.Drawing.Size(100, 20); 
this.myTextBox1.TabIndex = 3; 

這裏美中不足的是,雖然,如果你改變你的構造函數,你需要重建該項目並在很多情況下從窗體中刪除控件並重新添加它,以便VS可以重新生成代碼。我猜你的情況VS只是沒有趕上你的改變。嘗試從窗體中刪除控件並重新構建控件。然後重新添加它,並且它應該工作。

相關問題