アプリ版:「スタンプのみでお礼する」機能のリリースについて

C#でツールを作っています。

ボタンを押すと、TextBoxやらbuttonが生成されるツールを作ったのですが、
ボタンのうまい消し方がわかりません。

最初にボタンを押すと、機能1のためのボタンやTxtboxが作られるとこまではいいのですが、機能2のボタンを押すと、機能1のボタンが残ったまま機能2のボタンが作られてしまいます。

今は、別にVISIBLEをfalseするボタンで対応しましたが、やっぱり不便です。二度手間です。よそのアプリケーションはどれもほかの機能のボタンを押した時点で切り替わってくれます。

どのように書けばいいのでしょうか?

A 回答 (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();
}
}

この回答への補足

しまった、補足とお礼の使い方が逆になってしまった。
よってお礼です。

僕のほしかったものそものもがソースでもらえるとは思いませんでした。かるく数時間の僕の時間が短縮されました。

ここまでしていただいて文字でお礼することしかできないのが心苦しいですが、そういった部分は僕がもっと学びレベルを上げて同じように困っている人を助けることで恩返しとさせていただきます。

本当にありがとうございました。

補足日時:2014/03/12 18:52
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/03/12 13:02

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);

}


なのでインスタンス化してるパターンになります。

補足日時:2014/03/11 14:46
    • good
    • 0

最初っから全部のbuttonやtextboxを作っておいて、非表示にしておく。


ボタンによって表示・非表示を切り替えるようにすればいいと思いますけど。

ボタン1のイベントハンドラに(ボタン1の機能をon、ボタン2の機能をoff)
ボタン2のイベントハンドラに(ボタン1の機能をoff、ボタン2の機能をon)

動的生成は管理が面倒なので...

この回答への補足

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

ありがとうございます。

補足日時:2014/03/11 14:47
    • good
    • 0

>機能2のボタンを押すと、機能1のボタンが残ったまま機能2のボタンが作られてしまいます。



機能2のボタンのイベントハンドラで、機能1のボタンやTextBoxを非表示にする(または削除する)処理を入れればよろしいかと。
# 非表示で十分かと思われますが…作り次第なのでなんとも。
    • good
    • 0
この回答へのお礼

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

ありがとうございます。

お礼日時:2014/03/11 14:48

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

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