0

次のように作成されたコントロールがあります。

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 でパブリック アクセスで定義されているため、これは明らかに間違っています。コントロールを視覚的に編集できるように Form Designer を操作する方法はありますか?

4

4 に答える 4

1

base.listBox1base.textBox1を使用する必要があると思います。これらは、 thisキーワードを使用する必要がある子クラスではなく、基本クラスである MyControlBase で定義されています。

于 2008-12-05T22:31:21.210 に答える
0

これがあなたの問題かどうかはわかりませんが、同じ .cs ファイルで複数の型が定義されている場合、デザイナーは問題を抱えています。この場合は、クラスごとに .cs ファイルを使用してみてください。

于 2008-12-05T22:41:27.150 に答える
0

ときどき (常に?) VS は、デザイナーでユーザー コントロールを正常に表示する前に、プロジェクトを再コンパイルする必要があります。

また、VS デザイナーが実際にコントロールをロードしてインスタンス化し、フォームに表示することも考慮してください。コードは実際にはバックグラウンドで実行されています。ただし、いくつかのグローバル アプリケーション変数や同じフォーム上の他のものなど、そこにあると予想されるすべてのものがあるわけではありません。コントロールは「デザイン モード」に対応する必要があります。それ以外の場合、例外が生成された場合、デザイナーはそれを表示しません。すべてのコントロールにはプロパティがあり (名前は覚えていませんが、簡単に見つけることができます)、コントロールが「デザイン モード」にあるか、実際に実行されているかを判断できます。

于 2008-12-05T22:46:54.940 に答える
0

コンパイラは正しいです(そうなる傾向があります)。

ソースコードでは textbox1 も listbox1 も定義されていません。これらは、派生クラスにも基本クラスにも表示されません。

以下を基本クラスに追加する必要があります。

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

また、textbox1 と listbox1 に protected の代わりに private を使用することにした場合は、Nazgulled によって概説されている変更を行う必要があります。

于 2008-12-05T23:02:12.600 に答える