簡體   English   中英

當用戶控件在公共屬性上具有Browsable false時,為什么設計器在添加到表單時將其設置為null?

[英]When a user control has Browsable false on public property, why does designer set it to null when added to a form?

我有一個具有一些公共屬性的用戶控件,一個是我設置[Browseable(false)]的對象。 當我在Visual Studio的設計器中添加此控件時,生成的代碼將此對象設置為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。

這里有幾個選擇。 首先,BrowsableAttribute僅確定屬性是否顯示在屬性網格中。 要防止屬性完全序列化,請使用DesignerSerializationVisibilityAttribute:

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

其次,如果您希望序列化屬性,但僅當用戶實際更改了值時,請使用DefaultValueAttribute:

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

這將導致屬性僅在與其默認值不同時才被序列化。 這也有其他積極的副作用

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

有更多先進的技術可以控制與設計師的交互(Google“ShouldSerialize”),但這些屬性應該可以幫助你完成大部分工作。

通常,當您在自定義控件的構造函數中設置值時,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還沒有趕上你的改變。 嘗試從窗體中刪除控件並重新生成控件。 然后重新添加它,它應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM