VS2008 Windows Form Designer не нравится мой контроль - PullRequest
0 голосов
/ 06 декабря 2008

У меня есть элемент управления, который создается следующим образом:

public partial class MYControl : MyControlBase
{
    public string InnerText {
        get { return textBox1.Text; }
        set { textBox1.Text = value; } 
    }
    public MYControl()
    {
        InitializeComponent();
    }
}

partial class MYControl
{
    /// <summary> 
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary> 
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Component Designer generated code

    /// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        this.textBox1 = new System.Windows.Forms.TextBox();
        this.listBox1 = new System.Windows.Forms.ListBox();
        this.label1 = new System.Windows.Forms.Label();
        this.SuspendLayout();
        // 
        // textBox1
        // 
        this.textBox1.Location = new System.Drawing.Point(28, 61);
        this.textBox1.Name = "textBox1";
        this.textBox1.Size = new System.Drawing.Size(100, 20);
        this.textBox1.TabIndex = 0;
        // 
        // listBox1
        // 
        this.listBox1.FormattingEnabled = true;
        this.listBox1.Location = new System.Drawing.Point(7, 106);
        this.listBox1.Name = "listBox1";
        this.listBox1.Size = new System.Drawing.Size(120, 95);
        this.listBox1.TabIndex = 1;
        // 
        // label1
        // 
        this.label1.AutoSize = true;
        this.label1.Location = new System.Drawing.Point(91, 42);
        this.label1.Name = "label1";
        this.label1.Size = new System.Drawing.Size(35, 13);
        this.label1.TabIndex = 2;
        this.label1.Text = "label1";
        // 
        // MYControl
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.Controls.Add(this.label1);
        this.Controls.Add(this.listBox1);
        this.Controls.Add(this.textBox1);
        this.Name = "MYControl";
        this.Size = new System.Drawing.Size(135, 214);
        this.ResumeLayout(false);
        this.PerformLayout();

    }

    #endregion


    private System.Windows.Forms.Label label1;
}

MyControlBase содержит определения для ListBox и TextBox. Теперь, когда я пытаюсь просмотреть этот элемент управления в конструкторе форм, он выдаёт мне следующие ошибки:

Переменная 'listBox1' либо необъявленный или никогда не был назначен.

Переменная 'textBox1' либо необъявленный или никогда не был назначен.

Это, очевидно, неправильно, так как они определены в MyControlBase с открытым доступом. Можно ли как-то поменять конструктор форм, чтобы я мог визуально редактировать свой элемент управления?

Ответы [ 4 ]

1 голос
/ 06 декабря 2008

Я думаю, вам придется использовать base.listBox1 и base.textBox1 . Они определены в MyControlBase, который является базовым классом, а не дочерним классом, где вам нужно использовать ключевое слово this .

0 голосов
/ 06 декабря 2008

Компилятор прав (как обычно).

Ни textbox1, ни listbox1 не определены в исходном коде. Они не отображаются ни в производном, ни в базовом классе.

Вы должны добавить следующее в ваш базовый класс:

protected System.Windows.Forms.TextBox textbox1; 
protected System.Windows.Forms.ListBox listbox1;

Вам также нужно будет внести изменения, описанные Nazgulled, если вы решите использовать private вместо text для textbox1 и listbox1.

0 голосов
/ 06 декабря 2008

Иногда (всегда?) VS требует, чтобы вы перекомпилировали ваш проект, прежде чем он сможет успешно отобразить ваш пользовательский контроль в конструкторе.

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

0 голосов
/ 06 декабря 2008

Не знаю, если это ваша проблема, но конструктор имеет проблемы, когда несколько типов определены в одном и том же файле .cs. Если это так, попробуйте использовать файл .cs для каждого класса.

...