none
FORM上に動的にコントロールを配置する方法 RRS feed

  • 質問

  • いつもお世話になっております。


    C#で外部ファイルから
    x=10,y=10,ctrltype=textBOX
    などの支持を受けて
    FORMの
    x=10,y=10にtextBOXを配置するような事は可能でしょうか?


    無理な場合、使用を満たせるアイデアなどは御座いますでしょうか?

     


    hisuzuki
    2009年3月31日 12:12

回答

  • 可能です。デザイナでテキストボックスを配置することは、そこへテキストボックスを配置するコードを自動で生成しているということです。
    InitializeComponent()を右クリックして「定義へ移動」をクリックしてみて下さい。そこに答えがあります。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク zilch_1975 2009年4月1日 5:33
    • 回答としてマークされていない zilch_1975 2009年4月7日 0:00
    • 回答としてマーク zilch_1975 2009年4月7日 0:00
    2009年3月31日 13:24
    モデレータ
  • trapemiyaさんが書かれているように、デザイナを使うと静的に生成されるInitializeComponent()と同じ内容を動的に実行しても目的にものを得られます。
    それとは別に、仕様変更可能な立場にいるのかわかりませんが、「外部ファイル」をhtmlやWPF(xaml)などで記述して、一気にロードしてしまう方法もあるのかな、と思いました。
    • 回答としてマーク zilch_1975 2009年4月7日 0:01
    2009年4月2日 9:15

すべての返信

  • 可能です。デザイナでテキストボックスを配置することは、そこへテキストボックスを配置するコードを自動で生成しているということです。
    InitializeComponent()を右クリックして「定義へ移動」をクリックしてみて下さい。そこに答えがあります。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク zilch_1975 2009年4月1日 5:33
    • 回答としてマークされていない zilch_1975 2009年4月7日 0:00
    • 回答としてマーク zilch_1975 2009年4月7日 0:00
    2009年3月31日 13:24
    モデレータ

  • 「コントロールの位置等のプロパティを外部ファイルで定義する」
    ということであれば、


    コード上で

    textBox1.DataBindings.Add(
    	new System.Windows.Forms.Binding("Location", global::WindowsFormsApplication1.Properties.Settings.Default, "TextBoxLocation", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));


    とした上で、

    App.Configにて

    <userSettings>
    	<WindowsFormsApplication1.Properties.Settings>
    		<setting name="TextBoxLocation" serializeAs="String">
    			<value>20, 12</value>
    		</setting>
    	</WindowsFormsApplication1.Properties.Settings>
    </userSettings>

    とすることで可能かと思います。


    2009年4月1日 4:00
  • 説明不足でした・・・。
    コントロールのプロパティではなく
    コントロール自体を『動的』に外部ファイルを元に『追加&削除』しなくてはいけません。

    その場合の追加方法は分かるのですが
    追加したコントロールからの情報の取得や
    ボタンなどイベントが必要になるものの作成方法が不明なのです。

     

    2009年4月1日 4:07
  • 追加する方法がわかるのであれば、追加した際にそのインスタンスを取得できますから、それに対してイベントハンドラを結びつけたり、プロパティにアクセスすることは容易にできると思いますが、どこが不明なのでしょうか? イベントハンドラをコードで結びつける方法でしょうか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年4月1日 4:14
    モデレータ
  • textBox1.Click += new EventHandler(textBox1_Click);
    
    void textBox1_Click(object sender, EventArgs e)
    {
    	// 何かやる
    }

    これは、Clickイベントハンドラの実装方法(C#)です。


    rapemiya さんがおっしゃっているように、
    デザイナが生成したコードを見ると良く分かると思いますよ。
    2009年4月1日 4:42
  • イベントの追加方法は理解しているのですが
    外部からボタンを追加した場合に、
    それぞれのボタンによってイベントの処理内容は異なります。
    (1種類のイベントを用意しておけば良いと言うものでもない)
    ・・・これはどうしようもない問題ですね。

    すいません・・・混乱してました。

    有難う御座いました。

     

    2009年4月1日 5:33
  • でしたら
    
    
    textBox1.Click += new EventHandler(textBox_Click);
    textBox2.Click += new EventHandler(textBox_Click);
    textBox3.Click += new EventHandler(textBox_Click);
    とした上で
    void textBox1_Click(object sender, EventArgs e)
    {
    	if (sender == xxx)
    	{
    		// 何かやる
    	}
    	else if (sender == xxx)<br/>	{
    		// 何かやる
    	}
    }
    void textBox1_Click(object sender, EventArgs e)
    {
    	switch (sender.Name) {
    		case "textBox1":
    		case "textBox2":
    	}
    }
    
    とかでどうでしょう?
    2009年4月1日 9:23
  • ボタンのTagプロパティ(Object型)はユーザに開放されていてどんな使い方してもかまいません。
    なのでこのTagプロパティに”押されたらやること”をセットしておくことができます。


    επιστημη @わんくま同盟, Microsoft MVP Visual C++
    2009年4月2日 3:01
  • ご返答有難う御座います。

    現状の仕様の一例を挙げますと
    外部ファイルに記述されたコントロールタイプ、位置、幅に従ってフォームを形成し
    動的に作られたフォームの動的に配置されたボタンを押すと
    動的に作られた子フォームを開き、値を入力させると言う感じです。

    『押されたらやること』は『動的に作られた子フォームを開く』なのですが
    どのフォームを開くかは特定出来ません。

    2009年4月2日 5:37
  • trapemiyaさんが書かれているように、デザイナを使うと静的に生成されるInitializeComponent()と同じ内容を動的に実行しても目的にものを得られます。
    それとは別に、仕様変更可能な立場にいるのかわかりませんが、「外部ファイル」をhtmlやWPF(xaml)などで記述して、一気にロードしてしまう方法もあるのかな、と思いました。
    • 回答としてマーク zilch_1975 2009年4月7日 0:01
    2009年4月2日 9:15