DOBON.NET DOBON.NETプログラミング掲示板過去ログ

動的に作成されたコントロールの削除

環境/言語:[VB.NET2003]
分類:[.NET]

VB.NET2003を使用しております。
分からないことがあるので教えていただければありがたいです。
みなさまよろしくお願いします。

まず、処理の流れは

1.ボタンを押すと動的にひとつTextBox1が作成されるようにしています。

2.そのときに作成されたTextBox1の名前をtreeviewに追加しています。

3.もう一度ボタンを押すと次はTextBox2が作成されます。

4.treeviewにTextBox2の名前が追加されます。

5.以降、TextBox5まで同じ処理の繰り返しです。

(現在ではボタンを押して作成が終わるとTextBox(変数)+1をしています。
 変数の最大値は5にしております。)


ここで質問なのですがtreeviewの項目をクリックしたときに

項目と同じ名前のTextBoxの削除をしたいのですが

どのようにすればよいのかわかりません。

また、削除した後にボタンを押して追加しようとしたときの変数は

どうすればよいでしょうか?


まだ初心者の為、質問の内容もおかしな事を言っているかもしれませんが
みなさまどうか力になっていただければ幸いです。
よろしくお願いします。
追加したTextBoxの名前がわかっているのであれば、
フォーム上から削除該当のコントロールを検索し、
以下のようにフォーム上からRemoveできます。

this.Controls.Remove(削除対象コントロール);

また、削除後に追加ですが、動的に作成するコントロールの数を
Max値として格納しておき、Max値未満であれば、作成するという形で。

コントロールの名称として1〜5の変数名だけしか駄目だというのであれば、
ここだけちょっとロジックが要ります。

現在作成されているコントロールで、固定数値部分で何処が抜けているかを
見ていく必要があります。

めんどくさければ、配列にして、作成するコントロールと1対1で格納フィールドを
確保しておいてもいいです。

上記のように、配列にして、コントロールの格納位置を用意しておくのであれば、
フォームから、該当コントロールを検索する必要は無いです。

とりあえず、適当に作ったサンプルだけのっけておきます。

private int _createCount = 0;

private void button1_Click(object sender, EventArgs e)
{
TextBox txt = new TextBox();
txt.Name = "TextBox" + _createCount.ToString();
txt.Text = "TextBox" + _createCount.ToString();
this.Controls.Add(txt);
txt.Location = new Point(_createCount, _createCount);
_createCount++;
}

private void button2_Click(object sender, EventArgs e)
{
for(int i = 0; i < _createCount; i++)
{
Control[] ctlLst = this.Controls.Find("TextBox" + i.ToString(), true);

if(ctlLst.Length == 0)
continue;

this.Controls.Remove(ctlLst[0]);
break;
}
}

仕事中の気分転換にさらさらとあまり確認もせずに作ったので、
不備がきっとあると思うので、あった場合は突っ込まないで下さいorz
■No21393に返信(じゅでさんの記事)

じゅでさん、さっそくの回答ありがとうございます。

初心者なので失礼なことを言っているのかもしれませんが

このコードはVB.NET2003でも使えるのでしょうか?

恥ずかしながらVB.NET2003しか見たことも触ったこともないので

見たことない名前ばかりよくわからなかったのです…。

せっかくの回答を台無しにしてしまい申し訳ございません。
■No21394に返信(aplil777さんの記事)
> じゅでさん、さっそくの回答ありがとうございます。
> 初心者なので失礼なことを言っているのかもしれませんが
> このコードはVB.NET2003でも使えるのでしょうか?

C# ですが、(たぶん) 読めないことはないです。

どうしてもイヤであれば、VB.NET に置き換えるコンバータを利用してください。
「C# to VB.NET」 などで検索してみてください。
すいません、仕事中でした。
VBでつくってみました。

Public Class Form1

Private _createCount As Integer = 0

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim txt As New TextBox()
txt.Name = "TextBox" + _createCount.ToString()
txt.Text = "TextBox" + _createCount.ToString()
Me.Controls.Add(txt)
txt.Location = New Point(_createCount, _createCount)
_createCount = _createCount + 1
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
' 2003ではFindが使えないので、ここを見てみてください。丁寧に管理人様が説明しております。
' http://dobon.net/vb/dotnet/control/findcontrolbyname.html

For i As Integer = 0 To _createCount
Dim ctlList As Control() = Me.Controls.Find("TextBox" + i.ToString(), True)
If ctlList.Length <> 0 Then
Me.Controls.Remove(ctlList(0))
Exit For
End If
Next

End Sub
End Class

あくまでも、追加と削除についてです。
5個だけしか作らないというのに、いろいろとやり方があると思いますので、
調べてみてください。
■No21400に返信(じゅでさんの記事)
> すいません、仕事中でした。
> VBでつくってみました。

わざわざありがとうございます!
助かります。

このコードを参考にもう少しがんばってみます!

DOBON.NET | プログラミング道 | プログラミング掲示板