21

Windowsフォームのパネルに動的にコントロールを生成し、コントロールを削除するためのボタンもすべて行に生成しました。

int c = 0;
private void button1_Click(object sender, EventArgs e)
{
    int v;
    v = c++;
    panel1.VerticalScroll.Value = VerticalScroll.Minimum;
    ComboBox combo = new ComboBox();
    combo.Name = "combobox" + v ;
    combo.Location = new Point(30, 5 + (30 * v));

    ComboBox combo2 = new ComboBox();
    combo2.Name = "combobox2" + v ;
    combo2.Location = new Point(170, 5 + (30 * v));

    TextBox txt = new TextBox();
    txt.Name = "txtbx" + v;
    txt.Location = new Point(300, 5 + (30 * v));

    TextBox txt2 = new TextBox();
    txt2.Name = "txtbx2" + v;
    txt2.Location = new Point(450, 5 + (30 * v));

    TextBox txt3 = new TextBox();
    txt3.Name = "txtbx3" + v;
    txt3.Location = new Point(600, 5 + (30 * v));

    Button btn = new Button();
    btn.Name = "btn" + v;
    btn.Text = "Remove";
    btn.Location = new Point(750, 5 + (30 * v));
    panel1.Controls.Add(combo);
    panel1.Controls.Add(btn);
    panel1.Controls.Add(txt);
    panel1.Controls.Add(combo2);
    panel1.Controls.Add(txt2);
    panel1.Controls.Add(txt3);
    btn.Click += new EventHandler(btn_Click);
    combo.Tag = btn; 
    combo2.Tag = combo; 
    btn.Tag = combo2;

}

 private void btn_Click(object sender, EventArgs e)
 {
     ComboBox cb3 = btnh.Tag as ComboBox;
     ComboBox cb4 = cb3.Tag as ComboBox;
     panel1.Controls.Remove(cb3);
     panel1.Controls.Remove(cb4);
     panel1.Controls.Remove(btnh);
  }

行のボタンをクリックしたときに、その行からすべてのコントロールを削除するにはどうすればよいですか?

4

5 に答える 5

43

どのコントロールを削除したいのか、どのタイプのコントロールを削除したいのか、どのようにそれらを識別したいのか、まだ言っていません。

コントロールをループして、特定のコントロールを削除することができます。

あなたが持っているならLinq、それは簡単です:

private void btn_Click(object sender, EventArgs e)
{
    panel1.Controls.Clear(); //to remove all controls


    //to remove all comboboxes
    foreach (Control item in panel1.Controls.OfType<ComboBox>().ToList())
    {
        panel1.Controls.Remove(item); 
    }


   //to remove control by Name
    foreach (Control item in panel1.Controls.OfType<Control>().ToList())
    {
        if (item.Name == "bloodyControl")
            panel1.Controls.Remove(item); 
    }

    
    //to remove just one control, no Linq
    foreach (Control item in panel1.Controls)
    {
        if (item.Name == "bloodyControl")
        {
             panel1.Controls.Remove(item);
             break; //important step
        }
    }
}

編集:

すでにコントロールにタグを付けているので、同じことを簡単に行うことができます。必要なのは、タグからコントロールを取得することだけです。ただし、適切にタグ付けする必要があります。

代わりにこれを行ってください:

private void button1_Click(object sender, EventArgs e)
{
    int v;
    v = c++;
    panel1.VerticalScroll.Value = VerticalScroll.Minimum;

    Button btn = new Button();
    btn.Name = "btn" + v;
    btn.Text = "Remove";
    btn.Location = new Point(750, 5 + (30 * v));
    btn.Click += new EventHandler(btn_Click);
    
    ComboBox combo = new ComboBox();
    combo.Name = "combobox" + v ;
    combo.Location = new Point(30, 5 + (30 * v));
    combo.Tag = btn;

    ComboBox combo2 = new ComboBox();
    combo2.Name = "combobox2" + v ;
    combo2.Location = new Point(170, 5 + (30 * v));
    combo2.Tag = btn;

    TextBox txt = new TextBox();
    txt.Name = "txtbx" + v;
    txt.Location = new Point(300, 5 + (30 * v));
    txt.Tag = btn;

    TextBox txt2 = new TextBox();
    txt2.Name = "txtbx2" + v;
    txt2.Location = new Point(450, 5 + (30 * v));
    txt2.Tag = btn;

    TextBox txt3 = new TextBox();
    txt3.Name = "txtbx3" + v;
    txt3.Location = new Point(600, 5 + (30 * v));
    txt3.Tag = btn;

    panel1.Controls.Add(combo);
    panel1.Controls.Add(btn);
    panel1.Controls.Add(txt);
    panel1.Controls.Add(combo2);
    panel1.Controls.Add(txt2);
    panel1.Controls.Add(txt3);    
}

private void btn_Click(object sender, EventArgs e)
{
   //to remove control by Name
    foreach (Control item in panel1.Controls.OfType<Control>().ToList())
    {
        if (item.Tag == sender || item == sender)
            panel1.Controls.Remove(item); 
    }
}

ここでは、ボタンでコントロールにタグを付けています。したがって、ボタンをクリックすると、sender引数から取得したクリックされたボタンであるタグを持つすべてのコントロールを削除できます。ただし、このアプローチの欠点は、パネルのすべてのコントロールを列挙する必要があることです。これは素晴らしいことではありません。

編集:以下のコードは、OPが現在使用していないテーブルレイアウトパネル用であることがわかりました。しかし、とにかく、テーブルパネルのレイアウトはこの仕事により適しています。

私はあなたにこれをすることを提案します:

private void button1_Click(object sender, EventArgs e)
{
    int v;
    v = c++;
    panel1.VerticalScroll.Value = VerticalScroll.Minimum;

    Button btn = new Button();
    btn.Name = "btn" + v;
    btn.Text = "Remove";
    btn.Location = new Point(750, 5 + (30 * v));
    btn.Click += new EventHandler(btn_Click);
    btn.Tag = v;

    ComboBox combo = new ComboBox();
    combo.Name = "combobox" + v ;
    combo.Location = new Point(30, 5 + (30 * v));
    combo.Tag = v;

    ComboBox combo2 = new ComboBox();
    combo2.Name = "combobox2" + v ;
    combo2.Location = new Point(170, 5 + (30 * v));
    combo2.Tag = v;

    TextBox txt = new TextBox();
    txt.Name = "txtbx" + v;
    txt.Location = new Point(300, 5 + (30 * v));
    txt.Tag = v;

    TextBox txt2 = new TextBox();
    txt2.Name = "txtbx2" + v;
    txt2.Location = new Point(450, 5 + (30 * v));
    txt2.Tag = v;

    TextBox txt3 = new TextBox();
    txt3.Name = "txtbx3" + v;
    txt3.Location = new Point(600, 5 + (30 * v));
    txt3.Tag = v;

    panel1.Controls.Add(combo);
    panel1.Controls.Add(btn);
    panel1.Controls.Add(txt);
    panel1.Controls.Add(combo2);
    panel1.Controls.Add(txt2);
    panel1.Controls.Add(txt3);    
}

private void btn_Click(object sender, EventArgs e)
{
    int toBeDeletedRow = (int)((Control)sender).Tag;
    for (int row = panel1.RowCount - 1; row >= 0; row--)
    {
        if (row == toBeDeletedRow)
        {
            panel1.RowStyles.RemoveAt(row);
            panel1.RowCount--;
            return;
        }
    }
}
于 2012-12-15T02:29:33.297 に答える
5

パネルまたは他のコンテナに、すべてまたは複数のコンポーネントを削除するためのより動的なコンポーネントがある場合は、この方法で続行できます。

最初のステップでは、コンポーネントを配列またはリストにロードします。

List<PersonalUserControl> lst = new List<PersonalUserControl>();

foreach (Object obj in this.PanelImplementationTeam.Controls)
{     
    //DO NOT REMOVE COMPONENT IN THIS LOOP BECAUSE
    //YOU DECREASE THE .Controls  ARRAY AND YOU WILL HAVE AN ERROR      
    if (obj is PersonalUserControl)
    {
        lst.Add((PersonalUserControl)obj);
    }
}

foreach(PersonalUserControl uc in lst)
{
    uc.Dispose();
}
于 2015-10-12T13:52:00.397 に答える
2

削除するすべてのコントロールがパネルにある場合は、次の操作を実行できます。 panel.Controls.Clear(); これにより、パネルからすべてのコントロールがクリアされます。

于 2018-01-16T03:51:33.483 に答える
0

コントロールイベントを削除します。MSDNから

プログラムでコレクションからコントロールを削除するには

  1. イベントからイベントハンドラーを削除します。Visual Basicでは、RemoveHandlerStatementキーワードを使用します。Visual C#では、-=演算子(C#リファレンス)を使用します。
  2. Removeメソッドを使用して、パネルのControlsコレクションから目的のコントロールを削除します。
  3. Disposeメソッドを呼び出して、コントロールによって使用されているすべてのリソースを解放します。

リンク先のページでは、VBとC#を使用した具体的な例を示しています。

于 2014-12-05T19:06:35.570 に答える
0

コントロールは実行時に追加されるため、メソッドを使用するfindNameメソッドを使用する前に、コントロールを登録してくださいregister

StackPanel sp = new StackPanel
{
   Name = "mySP",
   Orientation = Orientation.Horizontal,
};

//need to register the control to find it by name
RegisterName(sp.Name, sp);

//now to find control by name 
StackPanel sp = (StackPanel)mainStackPanel.FindName("mySP");

//deleting the control found
mainStackPanel.Children.Remove(sp);

//if you need to use the same name again, you have to unregister too
UnregisterName(sp.Name);
于 2020-09-22T13:05:30.457 に答える