
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/findc …
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();
}
}
この回答への補足
しまった、補足とお礼の使い方が逆になってしまった。
よってお礼です。
僕のほしかったものそものもがソースでもらえるとは思いませんでした。かるく数時間の僕の時間が短縮されました。
ここまでしていただいて文字でお礼することしかできないのが心苦しいですが、そういった部分は僕がもっと学びレベルを上げて同じように困っている人を助けることで恩返しとさせていただきます。
本当にありがとうございました。
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などをプログラム上でインスタンス化して画面上に表示させようと
しているようだとちょっと違います。
あれこれ書くと混乱してしまいそうですから敢えて記しません。
解決しないようでしたら、現在、どのようなプログラムでボタンやテキストの表示を実現しているのかを
示した方が良いでしょう。
この回答への補足
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);
}
なのでインスタンス化してるパターンになります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
-
Excel VBA Application.caller...
-
VBAでオプションボタンによって...
-
ユーザーフォームに別シートか...
-
閉じると「+」になり開くと「-...
-
ASP.Net ラベルの内容をすぐに...
-
BorlandC++Builderでのタイマー...
-
VBA IE ダウンロード ダイアロ...
-
VBA でのボタンの移動について
-
アイコンとボタンの違い
-
フォームの再読み込み
-
コマンドボタンの長押し
-
ダウンロードダイアログをVB...
-
C#でSendInputを使ったサンプル...
-
セルをマクロのボタンにしたい。
-
ボタンをマウスで押し続けたと...
-
コマンドボタンやイメージにマ...
-
C#プログラムで、ボタンをショ...
-
バックスペース機能の作り方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
-
ユーザーフォームに別シートか...
-
VBAで多数のプログラムを一つの...
-
Excel VBA Application.caller...
-
VBA CommandButtonの文字ずれ
-
コマンドボタンやイメージにマ...
-
C#プログラムで、ボタンをショ...
-
BorlandC++Builderでのタイマー...
-
[VB.net] ボタン(Flat)のEnable...
-
フォームの再読み込み
-
ボタンをマウスで押し続けたと...
-
閉じると「+」になり開くと「-...
-
Access VBA でデータペーストを...
-
C#でSendInputを使ったサンプル...
-
バックスペース機能の作り方
-
アイコンとボタンの違い
-
セルをマクロのボタンにしたい。
-
Excel マクロ 閉じるボタン
-
VBAのボタンの位置が変わって困...
おすすめ情報