Свойства пользовательского элемента управления C # загружаются до загрузки и массивы пустые - PullRequest
1 голос
/ 16 июня 2010

ИЗМЕНЕНО ДЛЯ ЛУЧШЕГО ПОНИМАНИЯ

Я создал пользовательский элемент управления с возможностью настройки некоторых глобальных переменных.

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 голосов
/ 16 июня 2010

Я обнаружил проблему.

Это было из-за ссылки dll элемента управления.Он использовал «кэшированную», или я не знаю версию своего элемента управления, когда я впервые его тестировал (и был глючит), даже если я менял используемый файл .dll.Так что я полностью стер ссылку и сделал новую с несжатой версией dll, и теперь все работает нормально.

0 голосов
/ 16 июня 2010

Хорошо, я понял, в чем проблема. Это происходит из 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};

и т.д. ... который будет вызывать "set" свойства "Colors", вызывая функцию, с пустым массивом.

Почему он автоматически добавляет код для сброса моих глобальных переменных? Есть ли способ предотвратить автоматическое добавление этого кода?

0 голосов
/ 16 июня 2010

Если я правильно вас понимаю, у вас есть свойства, которые не следует изменять, поскольку они используются как некая альтернатива const для внутренних нужд? Если это так, пометьте их DesignerSerializationVisibilityAttribute

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int[] MyArrayProperty
{
    get 
    {
        // get here
    }       
}

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

Это скрывает их от дизайнера и предотвращает их перезапись. Обратите внимание, что удаление части свойства set также не позволяет изменять значение в конструкторе и окне свойств.

0 голосов
/ 16 июня 2010

Вы должны заполнить массивы в конструкторе элемента управления.

Если вы хотите увидеть точный порядок установки свойств, посмотрите на метод InitializeComponent формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...