C#自定义控件属性在加载和数组清空之前加载

时间:2010-06-16 14:16:23

标签: c# controls properties

为了更好的理解而被编辑

我为一些全局变量制作了一个带有属性的自定义控件。

private string[] LBTitles = new string[1] { "Rien" };
//...
[CategoryAttribute("WildData"), DescriptionAttribute("Tableau des noms des titres au dessus de le listbox")]
public string[] Titles
{
    get { return LBTitles; }

    set { LBTitles = value; OnColumns(EventArgs.Empty); }
}

OnColums做了很多事情来格式化控件。 其中一个是:

int vLongest = 0;
//...
//Si le plus long est plus petit que le titre de la colonne
if (vLongest < LBTitles[i].Length)
{
    vLongest = LBTitles[i].Length;
}

以上是我自己的控制权。一切正常,美好的一天等等。

现在将它添加到表单中: - 我添加它,一切都很好 - 我通过设计修改属性,一切正常 - 我尝试运行它...有问题。

当我构建时,它将以下代码添加到InitializeComponent()中:

this.wildList1 = new WildList.WildList();
//Which is ok but also it add, everytime I build, this:
            // 
            // wildList1
            // 
            this.wildList1.Colors = new string[] {
        null};
            this.wildList1.Font = new System.Drawing.Font("Courier New", 8F);
            this.wildList1.Location = new System.Drawing.Point(211, 33);
            this.wildList1.Name = "wildList1";
            this.wildList1.Positions = new int[] {
        0};
            this.wildList1.Size = new System.Drawing.Size(238, 224);
            this.wildList1.TabIndex = 16;
            this.wildList1.Titles = new string[] {
        null};

它添加了重置我的数组的代码行。 为什么? 我怎么能骑他们?或者至少让他们使用程序员(也就是我)输入的值进入设计师?

因为当它通过重置它的行时,它也调用属性“set”,它调用OnColumns,然后尝试用空数组做事,这会导致崩溃。

4 个答案:

答案 0 :(得分:0)

您应该在控件的构造函数中填充数组。

如果您想查看属性设置的确切顺序,请查看表单的InitializeComponent方法。

答案 1 :(得分:0)

好的,我想出了什么问题。 它来自Form1.Designer.cs

在InitializeComponent()中,它执行

this.wildList1 = new WildList.WildList();

这是好的,但是下面的一些行,它确实是:

// 
            // wildList1
            // 
            this.wildList1.Colors = new string[] {
        null};
            this.wildList1.Name = "wildList1";
        this.wildList1.Font = new System.Drawing.Font("Courier New", 8F);
        this.wildList1.Location = new System.Drawing.Point(190, 64);
        this.wildList1.Name = "wildList1";
        this.wildList1.Positions = new int[] {
    0};
        this.wildList1.Size = new System.Drawing.Size(238, 224);
        this.wildList1.TabIndex = 16;
        this.wildList1.Titles = new string[] {
    null};

...等 它将调用属性“Colors”的“set”,调用函数,使用现在为空的数组。

为什么它会自动添加代码来重置我的全局变量? 有没有办法阻止自动添加此代码?

答案 2 :(得分:0)

如果我理解正确,那么您的属性不应该被更改,因为它们在内部被用作某种const替代品? 如果是,请使用DesignerSerializationVisibilityAttribute

标记它们
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int[] MyArrayProperty
{
    get 
    {
        // get here
    }       
}

void SetMyArrayProperty(int[] a)
{
    // set here
}

这会将它们隐藏在设计器中,并防止它覆盖它们。另请注意,删除属性的set部分也会阻止设计器和属性窗口更改值。

答案 3 :(得分:0)

我发现了问题。

这是由于控件的dll的引用。当我第一次测试它时,它正在使用“缓存”或者我不知道我的控件版本(并且是错误的),即使我正在更改它正在使用的.dll文件。所以我完全擦除了引用并用unbugged版本的dll创建了一个新版本,现在一切正常。