2

メソッドで動的にラベル「label1」を作成します。次に、ボタンをクリックすると、作成されたそのラベルを削除したいのですが、Controls.Remove(label1)と書くと、そのコントロールがコンテキストに存在しないと表示されます。これを達成するにはどうすればよいですか?

編集: Jonの提案に従って、foreachループを実装しましたが、何も実行されません。これは私のコードです。私が使用するパネルは設計によって作成されています。

void GenerateControls() {
    Label labelOne = new Label();
    Button btnContinue = new Button();
    panel.SuspendLayout();
    SuspendLayout();
    //btnContinue
    btnContinue.BackColor = System.Drawing.Color.Black;
    btnContinue.ForeColor = System.Drawing.SystemColors.Menu;
    btnContinue.Location = new System.Drawing.Point(145, 272);
    btnContinue.Name = "btnContinue";
    btnContinue.Size = new System.Drawing.Size(95, 28);
    btnContinue.TabIndex = 13;
    btnContinue.Text = "Continue";
    btnContinue.Visible = true;
    Controls.Add(btnContinue);
    btnContinue.Click += new System.EventHandler(btnContinue_Click);            
    //labelOne            
    labelOne.Location = new Point(0,65); 
    labelOne.Size = new System.Drawing.Size(100,20);
    labelOne.Text = "labelOne";
    labelOne.Name = "labelOne";
    labelOne.Visible = true;
    labelOne.TextChanged += new System.EventHandler(this.lbl_TextChanged);
    labelOne.BackColor = System.Drawing.Color.PaleGreen;
    Controls.Add(labelOne);
    //panel
    panel.Controls.Add(labelOne);
    panel.Visible = true;
    panel.Location = new Point(0,0);
    panel.Size = new Size(240, 320);
    //
    Controls.Add(panel);
    panel.ResumeLayout();
    ResumeLayout();
}

そして、btnContinueをクリックすると:

private void btnContinuar_Click(object sender, EventArgs e) {
    foreach (Control control in panel.Controls) {
        if (control.Name == "labelOne"){
            panel.Controls.Remove(control);
            break;
        }
    }
}

私はそれをデバッグし、パネルでそれを制御しますそれは空のパネルであるかのように続行します。ご協力いただきありがとうございます!

4

2 に答える 2

5

変数がそのコンテキストに存在しないと言っているのではないかと思います。あなたはそのテキストでラベルを見つけるか、それについて何か他のことを知っている必要があります。たとえば、作成するときにNameプロパティを設定し、削除するときにそれを見つけることができます。

panel.Controls.RemoveByKey("YourLabelName");

編集:コメントに記載されているようRemoveByKeyに、コンパクトフレームワークには存在しません。したがって、参照を自分で覚えておく(この場合、名前は必要ありません)、次のようなものを使用する必要があります。

foreach (Control control in panel.Controls)
{
    if (control.Name == "YourLabelName")
    {
        panel.Controls.Remove(control);
        break;
    }
}

EDIT2:さらに「汎用」でデスクトップ互換にするために、RemoveByKey呼び出しを維持して、これをアプリに追加できます。

public static class FormExtensions
{
    public static void RemoveByKey(this Control.ControlCollection collection,
                                   string key)
    {
        if(!RemoveChildByName(collection, key))
        {
            throw new ArgumentException("Key not found");
        }
    }

    private static bool RemoveChildByName(
        this Control.ControlCollection collection,
        string name)
    {
        foreach (Control child in collection)
        {
            if (child.Name == name)
            {
                collection.Remove(child);
                return true;
            }

            // Nothing found at this level: recurse down to children.
            if (RemoveChildByName(child.Controls, name))
            {
                return true;
            }
        }

        return false;
    }
}
于 2012-06-05T16:32:48.527 に答える
4

OPの質問を20回編集し、元の問題とは似ていないJonの回答を行った後、小さな不具合が1つ残っています。

フォームに追加するパネルにlabelOneを追加しない。

変化する

Controls.Add(labelOne); 

panel.Controls.Add(labelOne);

その後、すべてが機能するはずです

于 2012-06-05T18:33:11.057 に答える