プロが教える店舗&オフィスのセキュリティ対策術

タイトルの件について、Removeできるのは直前に追加したコントロールが対象のようですが
動的に追加した全てのコントロールをRemoveする方法はありますか。
一括でも、個別でも可能な方法があればご教示ください。
よろしくお願いいたします。

質問者からの補足コメント

  • お世話になります。
    「直前に追加したしたものが対象」は勘違いでした。
    確認したことは、ボタンのクリックイベントで5個のテキストボックスを追加。
    別のボタンにRemoveを設定。
    追加した直後はRemove可能。
    追加ボタンを2回クリックした場合、1回目で追加したものはRemoveされない。
    ということのようです。
    2回以上クリックしなければよいのですが、間違ってクリックした場合はどうしたら
    良いのでしょうか。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/04/27 11:57
  • redfox63様
    めぐみん_様
    お二人のお蔭で、実質的な問題は解決しています。御礼申し上げます。
    ただ、1つ疑問があります。
    繰り返しを10回にし
    if (i < 5)
    {
    ---略---
    testTextBoxes[i].Left = 100;
    Controls.Add(testTextBoxes[i]);
    }
    if (i >= 5)
    {
    ---略---
    testTextBoxes[i - 5].Name = "textBox" + (i-5).ToString();
    testTextBoxes[i - 5].Left = 500;
    Controls.Add(testTextBoxes[i-5]);
    }
    とし、testTextBoxes[0].Text = "ok";とすると見かけ上6個目にアクセスできます。
    では、見かけ上1~5番目にアクセスするにはどうしたらよいのでしょうか。

      補足日時:2018/04/29 10:10
  • お世話になります。
    最初の疑問が、2回追加ボタンをクリックした場合になぜRemoveできないのかわからなかったからです。この時点では全くの上書きですから、最初の5個と次の5個の区別がつきません。だとすれば位置を変えて5個+5個を上書きして、後の5個がRemoveできることやアクセスが可能であることとを確認するために行いました。
    これによって、最初の疑問である2回(2回以上)追加ボタンをクリックするとRemoveできないというか、見かけ上では前に追加したものが残っていると理解できたわけです。10個を利用するために書いたコードではありません。まあ、基本がわかっていないので一つひとつ納得できるよう確認しているような次第です。

    No.8の回答に寄せられた補足コメントです。 補足日時:2018/04/29 14:41

A 回答 (9件)

No.7です。



No.8で回答は出ておりますが、私としては最終的にListクラスによるAddでの追加(要素数を固定化しない)のが良いのでは?と思いますよ。
    • good
    • 0
この回答へのお礼

めぐみん_様
ありがとうございました。
具体的なコードを丁寧に示していただき、勉強になりました。

お礼日時:2018/04/30 22:46

見掛け上の1〜5番目を i=0〜4で


testTextBoxes[i] = new TextBox();
としておいて、見掛け上の6〜10番目を i=5〜9で
testTextBoxes[i-5] = new TextBox();
としてしまったら、 i-5 = 0〜4 となってせっかく覚えていた 1〜5番目を上書きしてしまいます。
testTextBoxes[?] を使って1〜5番目にアクセスすることは不可能です。

Controlsには残っているので、Controls[?]等でアクセスすることは可能です。

それよりも、なぜ i>=5で i-5を使うようにしたのでしょうか?
論理的に説明できますか?

testTextBoxesの大きさを変えて0〜9まで使えるようにするとか
数が変わるのなら可変長の List<TextBox> クラスを使うとか
が普通の方法だと思います。
この回答への補足あり
    • good
    • 0

No.5とNo.6です。



双方をくっつけて

private List<TextBox> testTextBoxes = new List<TextBox>();

private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 5; i++)
{
testTextBoxes.Add(new TextBox());
testTextBoxes[i] = new TextBox();
testTextBoxes[i].Name = "textBox" + i.ToString();
testTextBoxes[i].Text = i.ToString();
testTextBoxes[i].Width = 160;
testTextBoxes[i].Height = 30;
testTextBoxes[i].Top = i * 40;
testTextBoxes[i].Left = 100;
testTextBoxes[i].Font = new Font("Arial", 16);
Controls.Add(testTextBoxes[i]);
}
button1.Enabled = false;
}

private void button2_Click(object sender, EventArgs e)
{
if (testTextBoxes.Count == 0) return;
foreach (TextBox tb in testTextBoxes)
{
Controls.Remove(tb);
tb.Dispose();
}
testTextBoxes.Clear();
button1.Enabled = true;
}

とか。
    • good
    • 0

>間違ってクリックした場合はどうしたら良いのでしょうか。



これを活かすなら

private TextBox[] testTextBoxes;
private void button1_Click(object sender, EventArgs e)
{
testTextBoxes = new TextBox[5];
for (int i = 0; i < 5; i++)
{
testTextBoxes[i] = new TextBox();
testTextBoxes[i].Name = "textBox" + i.ToString();
testTextBoxes[i].Text = i.ToString();
testTextBoxes[i].Width = 160;
testTextBoxes[i].Height = 30;
testTextBoxes[i].Top = i * 40;
testTextBoxes[i].Left = 100;
testTextBoxes[i].Font = new Font("Arial", 16);
Controls.Add(testTextBoxes[i]);
}
button1.Enabled = false;
}

private void button2_Click(object sender, EventArgs e)
{
if (testTextBoxes == null) return;
for (int i = 0; i < 5; i++)
{
Controls.Remove(testTextBoxes[i]);
}
button1.Enabled = true;
}

こうかな?
    • good
    • 0

No.2です。



追加する際に

>testTextBoxes = new TextBox[5];

と前回の追加情報を上書きしてますよね?
なら削除対象は『5個』でしかないと思いますよ。
⇒本来なら要素数を加算していくとか、ListクラスのAddメソッドで追加が良いと思ったのですけどね。


private List<TextBox> testTextList = new List<TextBox>();
private void button1_Click(object sender, EventArgs e)
{
TextBox[] testTextBoxes = new TextBox[5];
for (int i = 0; i < 5; i++)
{
testTextBoxes[i] = new TextBox();
testTextBoxes[i].Name = "textBox" + i.ToString();
testTextBoxes[i].Text = i.ToString();
testTextBoxes[i].Width = 160;
testTextBoxes[i].Height = 30;
testTextBoxes[i].Top = i * 40;
testTextBoxes[i].Left = 100;
testTextBoxes[i].Font = new Font("Arial", 16);
Controls.Add(testTextBoxes[i]);

testTextList.Add(testTextBoxes[i]);
}
}

private void button2_Click(object sender, EventArgs e)
{
foreach (TextBox tb in testTextList)
Controls.Remove(tb);

testTextList.Clear();
}

ご参考になればよいですが。
    • good
    • 0

追加ボタンを押した際のコードの冒頭で testTextBoxes[0] がnullかどうかチェックします



private void button1_click( ... )
{
if (testTextBoxes[0] == null)
{
// ここに既存のコードを追加

// 追加ボタンを無効に
button1.Enabled = false;
// 削除ボタンを有効に
button2.Enabled = true;
}

}

削除側のイベントに
private void button2_Click( ... )
{
if (testTextBoxes[0].IsHandleCreated)
{
for (int i= 0;i< 5; i++)
{
Controls.Remove(testTextBoxes[i]);
// TextBoxの後始末
testTextBoxes[i].Dispose();
testTextBoxes[n] = null;
}

button1.Enabled = true;
button2.Enabled false;
}

}

といった具合でどうでしょう …
    • good
    • 0

具体的にどんなコードなのでしょう?



Removeメソッドは、どのコントロールを削除するのか、引数で指定するようになっています。
記憶してあるのが「一番最後に追加したTextBox」だけだから、それしか削除できないのでは?

#にあるように、別に覚えておくとか、
Contorlsプロパティの内容を確認するとか。
    • good
    • 0
この回答へのお礼

お手数をおかけしております。
public Form1()
{
InitializeComponent();
}
private TextBox[] testTextBoxes;
private void button1_Click(object sender, EventArgs e)
{
testTextBoxes = new TextBox[5];
for (int i = 0; i < 5; i++)
{
testTextBoxes[i] = new TextBox();
testTextBoxes[i].Name = "textBox" + i.ToString();
testTextBoxes[i].Text = i.ToString();
testTextBoxes[i].Width = 160;
testTextBoxes[i].Height = 30;
testTextBoxes[i].Top = i * 40;
testTextBoxes[i].Left = 100;
testTextBoxes[i].Font = new Font("Arial", 16);
Controls.Add(testTextBoxes[i]);
}
}
private void button2_Click(object sender, EventArgs e)
{
for (int i= 0;i< 5; i++)
{
Controls.Remove(testTextBoxes[i]);
}
}

以上ですが、1回目(1回だけ)の追加は、Remove可能ですが
2回以上追加した場合には、Removeできない。
このような状況ですが、よろしくお願いいたします。

お礼日時:2018/04/27 21:38

どのように追加しているのかがわからないですけど、追加する度にリスト(Listクラスでも配列でも)登録してしまい、それを順次吐き出しつつRemoveは


出来ないのでしょうか?

UnityのC#とかって事なら経験無いので的外れかもですけど。
    • good
    • 0

System.Windows.Forms.Control やその派生クラスのControlsプロパティのことだと思うので。


https://msdn.microsoft.com/ja-jp/library/system. …

Controlsプロパティは System.Windows.Forms.Control.ControlCollection
https://msdn.microsoft.com/ja-jp/library/system. …


> 直前に追加したコントロールが対象

https://msdn.microsoft.com/ja-jp/library/system. …
Removeメソッドのマニュアルには、そんなことは書いていませんが。


※ 機械翻訳でむちゃくちゃなので、原語にするか、過去の翻訳者による翻訳版を読みましょう。


完全にクリアする方法は簡単ですが、「動的に追加した全て」だと、どうやって「動的に追加したものか、そうでないか」の判定をするかが難しいかと。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


人気Q&Aランキング