• ベストアンサー

C#で動的に作ったtextboxを消す。

C#でツールを作っています。 ボタンを押すと、TextBoxやらbuttonが生成されるツールを作ったのですが、 ボタンのうまい消し方がわかりません。 最初にボタンを押すと、機能1のためのボタンやTxtboxが作られるとこまではいいのですが、機能2のボタンを押すと、機能1のボタンが残ったまま機能2のボタンが作られてしまいます。 今は、別にVISIBLEをfalseするボタンで対応しましたが、やっぱり不便です。二度手間です。よそのアプリケーションはどれもほかの機能のボタンを押した時点で切り替わってくれます。 どのように書けばいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

> public void DLL関数(Control.ControlCollection Controls) > { > var textbox1 = new TextBox(); > textbox1.Location = new System.Drawing.Point(10, 260);// > textbox1.Size = new System.Drawing.Size(180, 20); > textbox1.Name = "textbox1"; > Controls.Add(textbox1); > } DLL側がまさにこうだとすると、ちょっとあまりよろしくないのではないでしょうか。 TextBoxのNameプロパティも被るし、作成したコントロールを戻しているわけでもないし。 実際、その生成されたコントロールを操作したい場合はどのようにしているのでしょうか? 生成されたコントロールが判断つくなら、フォーム内で Control control = 対象コントロール; this.Controls.Remove(control); control.Dispose(); で消せます。 以下、実際の動きとは異なるでしょうが、機能1ボタン、機能2ボタンでコントロールを切り替える例になります。 Findメソッドは全プロパティからその文字列を検索するので、都合が悪いようなら、やはり 生成したコントロールを呼び元で認識できる方が良いと思います。 Nameプロパティだけを調べて見つけ出すには、下記ページのように作りこまなければならないので、 そもそも複雑な制御でない場面で、それが必要になる方が問題のような気がします。 http://jeanne.wankuma.com/tips/csharp/form/findcontrol.html public void DLL関数(Control.ControlCollection Controls) { var textbox1 = new TextBox(); textbox1.Location = new System.Drawing.Point(10, 260);// textbox1.Size = new System.Drawing.Size(180, 20); textbox1.Name = "textbox1"; Controls.Add(textbox1); } private void 機能1_Click(object sender, EventArgs e) { this.removeDynamicControls(); this.DLL関数(this.Controls); } private void 機能2_Click(object sender, EventArgs e) { this.removeDynamicControls(); this.DLL関数(this.Controls); } private void removeDynamicControls() { Control[] controls = Controls.Find("textbox1", true); foreach (Control control in controls) { this.Controls.Remove(control); control.Dispose(); } }

satisfied999
質問者

お礼

ありがとうございます。後で試してみます☆

satisfied999
質問者

補足

しまった、補足とお礼の使い方が逆になってしまった。 よってお礼です。 僕のほしかったものそものもがソースでもらえるとは思いませんでした。かるく数時間の僕の時間が短縮されました。 ここまでしていただいて文字でお礼することしかできないのが心苦しいですが、そういった部分は僕がもっと学びレベルを上げて同じように困っている人を助けることで恩返しとさせていただきます。 本当にありがとうございました。

その他の回答 (3)

回答No.3

Private Sub 機能1ボタン_Click() Handles 機能1ボタン.Click  ボタンB.Visible = False  テキストB.Visible = False  ボタンA.Visible = True  テキストA.Visible = True End Sub Private Sub 機能2ボタン_Click() Handles 機能2ボタン.Click  ボタンA.Visible = False  テキストA.Visible = False  ボタンB.Visible = True  テキストB.Visible = True End Sub でいいのでは。 ボタンA、ボタンB、テキストA、テキストB自体がそもそもデザイン中にフォーム上に『静的』に 設置しているならば、上記で十分です。 Aグループ、Bグループごとにユーザーコントロールにしているならば そのユーザーコントロールのVisibleプロパティを変更すればいいです。 『動的』にTextBoxやButtonなどをプログラム上でインスタンス化して画面上に表示させようと しているようだとちょっと違います。 あれこれ書くと混乱してしまいそうですから敢えて記しません。 解決しないようでしたら、現在、どのようなプログラムでボタンやテキストの表示を実現しているのかを 示した方が良いでしょう。

satisfied999
質問者

補足

DLLを動的に読み込むプロゴラム(MEF)で、テキストボックスやボタンの情報はDLL側にあります。 public void DLL関数(Control.ControlCollection Controls) { var textbox1 = new TextBox(); textbox1.Location = new System.Drawing.Point(10, 260);// textbox1.Size = new System.Drawing.Size(180, 20); textbox1.Name = "textbox1"; Controls.Add(textbox1); } メイン側では foreach (var item in ○○){ item.DLL関数(this.webBrowser7, this.tabControl1, this.Controls); } なのでインスタンス化してるパターンになります。

  • ok-kaneto
  • ベストアンサー率39% (1798/4531)
回答No.2

最初っから全部のbuttonやtextboxを作っておいて、非表示にしておく。 ボタンによって表示・非表示を切り替えるようにすればいいと思いますけど。 ボタン1のイベントハンドラに(ボタン1の機能をon、ボタン2の機能をoff) ボタン2のイベントハンドラに(ボタン1の機能をoff、ボタン2の機能をon) 動的生成は管理が面倒なので...

satisfied999
質問者

補足

確かに、そのほうほうならできますね☆ しかし、動的につくる必要があるのです。 ありがとうございます。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

>機能2のボタンを押すと、機能1のボタンが残ったまま機能2のボタンが作られてしまいます。 機能2のボタンのイベントハンドラで、機能1のボタンやTextBoxを非表示にする(または削除する)処理を入れればよろしいかと。 # 非表示で十分かと思われますが…作り次第なのでなんとも。

satisfied999
質問者

お礼

どうにもならない時は非表示の方法を使いたいと思います。 ありがとうございます。

関連するQ&A