C#フォーム間のイベント駆動方法とは?

このQ&Aのポイント
  • C#のフォーム間でイベント駆動する方法について知りたいです。具体的には、Form1とForm2の間でチェックボックスの状態が変わったときに、それぞれのピクチャーボックスのイメージも変更したいです。静的変数を使ったり、Form1とForm2が分かれていない例が多く、解決策が見つかりません。
  • C#の初心者です。Form1とForm2の間でイベント駆動する方法を教えてください。具体的には、Form2のチェックボックスの状態が変わったときに、Form1のピクチャーボックスのイメージも変更したいです。ネットで調べても良い解決策が見つからず、困っています。
  • C#でフォーム間のイベント駆動方法について質問です。Form1とForm2の間でチェックボックスの状態が変わったときに、ピクチャーボックスのイメージも変更したいのですが、具体的な方法が分かりません。静的変数を使用する方法や、Form1とForm2が分かれていない例が多く、困っています。
回答を見る
  • ベストアンサー

C#のフォーム間のイベント駆動

C#悩んでおります。初心者です。 Form1とForm2があります。 Form1にはピクチャボックスが二つ並んでいて。 Form2にはチェックボックスが二つ並んでいます。 Form2のチェックボックスをオン-オフすると、それぞれのピクチャーのイメージを変更したいのですが、 なにせ、Form2の状況をForm1に知らせる方法がわかりません。 なにやら、デリゲートとイベントを使ってForm1に知らせるらしい、ということまではわかったのですが、具体的にどうやるのかわかりません。 いろいろネットで調べてはいるのですが、Form1,2が分かれていない例や、静的変数を使った例が多く、だめです。 静的だとイベントが発生しないので、イメージを更新するタイミングが無いですし、Form1,2が分かれていない場合を無理やりに分かれて記述すると、必ず記述のエラーが出ます。 どうすればいいのでしょうか?

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

  • ベストアンサー
  • FoolWord
  • ベストアンサー率73% (14/19)
回答No.3

ANo2の質問への回答と補足 ちょっと質問の内容と回答が外れてしまい申し訳ありませんでした。 >> プログラミングの一般論として、こういう場合はデリゲートとイベントでやったほうが安全なんでしょうか? プログラミングの一般論としては申し訳ありませんがわかりません。 個人的にはプログラムを作成する際に後の見やすさを優先して作成するので、publicとDelegateどちらを使うかは遣りたい処理の内容で決めています。 参考程度にDelegate版も記述しておきます。 [Form1] public delegate void SetImageDgt(Bitmap bmp); public partial class Form1 : Form { private void SetImage(Bitmap bmp) { this.pictureBox1.Image = bmp; } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 f2 = new Form2(); f2.dgSetImage = new SetImageDgt(SetImage); f2.Show(); } } [Form2] public partial class Form2 : Form { public Form2() { InitializeComponent(); } public SetImageDgt dgSetImage; private Bitmap bmp; private void checkBox1_CheckedChanged(object sender, EventArgs e) { if (this.checkBox1.Checked == true) { bmp = イメージ1; } else { bmp = イメージ2; } dgSetImage(bmp); } }

その他の回答 (2)

  • FoolWord
  • ベストアンサー率73% (14/19)
回答No.2

Form2のチェックボックスイベントでForm1のピクチャーボックスを操作するという考え方でどうでしょう? [Form1] PicturBox1とPictureBox2をPublicにしておく。 Form2 f2 = new Form2(); // Form2を生成 f2.Show(this); // Form2を表示する時にForm1が親であることを教える [Form2] チェックボックスのCheckedChangeイベント Form1 f1 = (Form1)this.Owner; if ( this.checkBox1.Checked == true ) { f1.pictureBox1.Image = 表示したい画像1; } else { f1.pictureBox1.Image = 表示したい画像2; }

suyamah
質問者

お礼

ありがとうございます。今動きました。 確かに、親子の関係を利用して動かすのは考えていたんですよね(負け惜しみです)。 いろいろ探ったんですが、「コンテキストがありません」のエラーが取れなくて・・・ よくわかりました。ありがとうございます。 ただ、やはりpublicにするということの怖さが、一抹の不安がぬぐえません。 どうなんでしょう。 プログラミングの一般論として、こういう場合はデリゲートとイベントでやったほうが安全なんでしょうか? お考えを聞かせていただけないでしょうか?

回答No.1

C++/CLIでそれっぽいことやってみた。

参考URL:
https://skydrive.live.com/?cid=07c558f8e11e708f#!/?cid=07c558f8e11e708f&sc=documents&uc=1&id=7C558F8E11E708F%21678
suyamah
質問者

補足

本当にありがとうございます。まさにそういうことをやっています。まさに。 プログラミング自体が素人なもので、C++もよくわからないのですが、 まず、Form1に関してですが、 Form2でformというオブジェクトを作りますが、そのときにactionというメンバー関数をActionDelegate型でForm1のPutLabelと結び付けていますね(おそらく。自信はないのですが・・・) Form2ですが、 ActionDelegat型を宣言しその型でactionを生成し、その後はactionを関数として普通に使っています。 なるほど、なんとなくわかりました。 イベント発生元でデリゲートの型宣言・生成をし、イベントの受け元で結びつけと処理の記述をする。 ありがとうございます。参考になります。

関連するQ&A

  • C# のクリックイベント

    別のイベントからクリックイベントを発生させるのに Button1.PerformClick(); は、うまくいくのですが、 これがピクチャーボックスになったとき pictureBox1.PerformClick(); 下記のエラーが出てしまいます。 ピクチャーボックスのボタンクリックイベントを発生させる方法はないでしょうか? 'System.Windows.Forms.PictureBox' に 'PerformClick' の定義が含まれておらず、型 'System.Windows.Forms.PictureBox' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。

  • フォームのResizeイベントについて

    超ド級の初心者ですが、Visual Basic.NETの本を買って勉強を始めました。 その中で「フォームのResizeイベントが発生するたびに、フォームのWidthプロパティをテキストボックスに表示するように」との練習問題がありましたがうまくできません。 Visual Basic6.0もあるので、そちらで同じことをやってみたところ、以下のようなコードで正常に動作しました。 Private Sub Form_Resize() Text1.Text = Me.Width End Sub Visual Basic.NETではどう記述すればいいのか教えていただけませんか?

  • フォームのピクチャーボックスの内容の退避

    動的に変わるピクチャーボックスの内容を以下の配列変数に設定したいのです。 dim Pct(X) as picturebox set pct(X) = form1.picture1 同じピクチャーボックスを表示したい場合は、以下のように変数から画面に設定したいのです。 set form1.picture1 = pict(X) が、退避しているはずなのに、全てがおなじピクチャーになってしまいます。 そんなことってありますか? 私が間違っているところがあれば、教えてください。 ピクチャーの内容は、VBからExcelのグラフを編集した後、クリップボード経由でピクチャーボックスに貼り付けたものです。

  • PHPでチェックボックスの結果を離れた配列に入れる

    PHPにて、複数あるチェックボックスの操作結果(オン/オフ)を変数に格納する方法を探しています。 予定として プログラム実行 → ボタンが1つと、チェックボックスが複数表示される → チェックボックス操作 → ボタンを押す → 複数のオン/オフ状況が配列に格納される といったものを作りたいと考えています。 現在はそのためのテストとして、ボタンを押した際のオン/オフの状況が画面に順に表示されるものを作っていますが、変数がUndefined Indexであると言われ、表示することができません。 現在のプログラムは下の通りです。 実際のプログラム上では、(1),(2),(3)はそれぞれソース内のかなり離れた場所にあります。 各チェックボックス(各<form>~</form>)毎にボタンを用意していないのが原因であるとは思うのですが、ボタンは特定の箇所に1つだけ用意したいと考えています。 またチェックボックス表示部とボタン表示部は(ソース的に)離れているため、 ボタン表示部で<form>を開いて、開いたまま進み、チェックボックス表示部が終わってやっと閉じる、という方法は難しいと思います。 どうすればチェックボックスの結果を離れた箇所にある配列に入れることができるのでしょうか。 宜しくお願いします。 [regist.php] <?php //(1) 更新ボタンを押すとチェックボックスのon/off結果が表示される if(isset($_POST['cmd_Print'])){ $check = $_POST["cb"]; for($i=0; $i<count($check); $i++){ print "${check[$i]}<br>"; } } //(2) 更新ボタンの表示 print("<form method=\"post\" action=\"regist.php\">"); print("<input type=\"submit\" name=\"cmd_Print\" value=\"結果表示\">"); print("</form>"); //(3) チェックボックス(on,off)を交互に表示 for($i=0; $i<5; $i++){ //チェックボックスをオンの状態で表示 print("<form method=\"POST\" action=\"./regist.php\">"); print sprintf('<input type="hidden" name="cb[]" value="off">'); print sprintf('<input type="checkbox" name="cb[]" value="on" checked="checked">'); print("</form>"); //↑チェックボックス操作後、オフの状態なら$cb[]に"off"を、オンの状態なら$cb[]に"on"を入れる //チェックボックスをオフの状態で表示 print("<form method=\"POST\" action=\"./regist.php\">"); print sprintf('<input type="hidden" name="cb[]" value="off">'); print sprintf('<input type="checkbox" name="cb[]" value="on">'); print("</form>"); //↑チェックボックス操作後、オフの状態なら$cb[]に"off"を、オンの状態なら$cb[]に"on"を入れる } ?>

    • 締切済み
    • PHP
  • VB6.0で複数フォームのグラフ描写ができません

    VB6.0でForm1にある描画ボタンを押すと、Form2が表示され、Form2のピクチャーボックスにグラフが描かれるコードを作っているところです。 ところが、Form2にはグラフが描かれません。 以下の簡単なコード(ピクチャーボックス2の背景を白色にする)も実行されません。 Form1にピクチャーボックスを作り、描画ボタンを押すとそこにグラフが表示されるようにしたところ、グラフが描かれました。 フォームは2つ表示させると問題があるのでしょうか? なにか考えられる原因を教えていただけないでしょうか。 Form1に記述しているコード Dim GraphForm As New Form2 GraphForm.Show Form2.Picture2.BackColor = vbWhite

  • Access データ表示 完了時のイベント

    Access2003で開発しております。 フォームのLoadが完了したというタイミングを取得したいのですが、 Formのイベントでそのようなイベントはありますでしょうか? 本当は「各テキストボックスにテーブルからのデータがセットされた後」 というタイミングが取得したいのですが、VBとは違い、ロジックに よる値の変更ではChangeイベントは発生しないようで・・・、 AfterUpdateイベントも、フォーカスを当てて直に編集しないと 発生しないようなので・・・。ですので、値セットが完了した= Form_Loadが完了した、というようなイベントがありましたら ご教授願いします。宜しくお願いします。

  • mouse dowunイベントについて

    VB6.0 MouseDowunイベントについて質問です。 ピクチャーボックスをクリックした場合 ピクチャーボックス領域の上半分をクリックしたら フォーム表示位置を上移動、下半分だったら下移動という処理を行っています。 しかし、現状ではチェックボックスなどのその他コントロールを操作している際に すこしでもクリック位置がずれると表示位置が移動してしまう誤作動が起こってしまいます。 これを防止するためにクリックではなくダブルクリックで対応したいのですが マウスダウンイベントでダブルクリックを対応させることは可能ですか? Private Sub Picture2_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) If Form1.ScaleHeight / 2 - y < 0 Then Picture2.Top = Form1.ScaleHeight / 2 - y If Picture2.Top < -VScroll1.Max Then Picture2.Top = -VScroll1.Max End If Else Picture2.Top = 0 End If End Sub

  • C#で別スレッドからメインformをアクティブ化

    質問番号:7352165で質問中の者です。 デリゲートとInvokeを使ったスレッドでは、スレッド実行中にイベントが発生しないので止む無く直接スレッドを起動しているのですが、この方法ではメインformのTextBoxなどに直接アクセスできません。 それでアクセスするメソッドをデリゲート+Invokeで呼んでおり、TextBoxの表示は正常に動作していますが、フォーカスをメインformに移動させる為にActivate();メソッドを記述すると「フィールド初期化子は静的でないフィールド、メソッド、または……を参照できません」の記述エラーとなります。 あまり理解できていないので基本的な使い方が間違っているかも知れませんが、何か解決策があればお教え下さい。 public void FormActive()  ← メインform(fmTax)に記述 {   this.Activate(); } private delegate void ActivDelegate(); ← 別スレッドに記述 ActivDelegate activDelegate = delegate() {   fmTax.FormActive(); ← ここにエラー表示 };

  • VBA チェックボックスのイベント発生タイミング

    すみません、初心者なのですが教えてください。 エクセルのシート上に複数のチェックボックスを貼り付け、 そのうちいくつかにチェックをいれ、 別のシートに同時にデータがとぶようにしたいのですが、 今はチェックボックスにチェックをつけた瞬間に イベントが発生してしまいます。 どのような記述をすれば、まとめてデータが とぶようになりますか。教えて頂けませんか。 よろしくお願いします。

  • ディスプレイ電源イベントについて

    こんにちは。 現在、ディスプレイ電源がOFFになったタイミングで処理を行うアプリを作成しています。 言語はC++、WM_POWERBROADCASTイベントのGUID_MONITOR_POWER_ONを受け取り、処理を行っているのですが、ディスプレイ電源ON/OFF以外に、何故かアプリ起動時にもこのイベントが発生してしまいます。 これはそういう仕様なのでしょうか? 端末の電源プラン等何か関わりがあるのでしょうか? どなたかわかる方、ご回答よろしくお願いいたします。

専門家に質問してみよう