C# 子のコントロールからイベントを送る方法?

このQ&Aのポイント
  • C# 子のコントロールからイベントを送る方法とは?
  • C# 子のコントロールからイベントを発生させる方法について解説します。
  • C# 子のコントロールから親フォームを閉じるイベントを発生させる方法について詳しく説明します。
回答を見る
  • ベストアンサー

C# 子のコントロールからイベントを送る方法?

毎度お世話になっております。 何の手も加えていないフォームに自分で作った ユーザコントロールを張り付け、そのコントロールからイベントが 発生したら、親フォームを閉じるようにしたいと思っています。 下記にサンプルを記述します。 フォーム側(using文、Designer文は省略) namespace WindowsFormsApplication1 { public partial class Form1 : Form { private string[] stLines = { "こんにちは。", "こんばんは。", "おはよう。", "さようなら。", "おやすみなさい。", }; public Form1() { InitializeComponent();  // 省略 JLabel j = new JLabel(stLines); j.Dock = DockStyle.Fill; this.Controls.Add(j); } } } ユーザコントロール側(Labelを継承) namespace WindowsFormsApplication1 { public class JLabel : Label { private string[] stLines = null; private int lineNo = 0; public JLabel(string[] Lines) { this.Click += new System.EventHandler(this.Jlabel_Click); this.stLines = Lines; this.lineNo = 0; } private void Jlabel_Click(object sender, EventArgs e) { this.lineNo++; if (this.stLines.Length > this.lineNo) { this.Text = this.stLines[this.lineNo]; } else { //ここでイベントを発生させたい //this.lineNo = 0; } } } } 上記のように、渡された文字列をもとに、クリックするごとに次の行を 表示するプログラムですが、行番号が行数を超えた場合にイベントを 発生させて、それを親のフォームが監視し、受け取った際にフォームを 閉じるといった処理をさせたいのです。 親のフォームにクリックイベントを仕掛ければ楽ではありますが、 子供のコントロールからの信号を、親が受け取る…といった流れにしたいのです。 以上、よろしくお願いいたします。

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

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

C#の文法書を読めば,イベントの作成方法は書いていませんか。 推奨される手順は,次のような感じでしょうか。 ・イベントをメンバーとして定義する public event EventHandler Foo; ・イベントを呼び出すメソッドを定義する protected virtual void OnFoo (EventArgs e) { if (Foo != null) { Foo(this, e); } } あとは,イベントを発生させたいところでOnFooを呼び出せばよいです。 イベント引数に情報を載せたいのであれば,EventArgsを派生させたHogeEventArgsを用意して, イベントの型をEventHadnler<HogeEventArgs>にします。 ref) http://msdn.microsoft.com/ja-jp/library/vstudio/w369ty8x(v=vs.110).aspx ref) http://msdn.microsoft.com/ja-jp/library/vstudio/hy3sefw3(v=vs.110).aspx

tatapatank
質問者

お礼

ありがとうございます。 おかげで実現できました。 解り易い説明、ありがとうございました。

関連するQ&A

  • c#で次の次のフォームへのデータの渡し方

    c#で次の次のフォームへのデータの渡し方 お世話になります。 c#初心者です。 フォーム1にはbuttonが2つあり、どちらを押したかで 次(フォーム2)の次のフォーム(フォーム3)を開く時に そのフォームにあるボタンを表示させるか・非表示にさせるか したいと思っております。 中途半端ですが下記の様なコードを書いておりましてその先 フォーム3での記述をどの様に書いたら良いのか行き詰って しまいました。 どなたかご親切な方、ご教示頂きたく宜しくお願い申し上げます。           記 クラス using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WindowsFormsApplication1 { public class Keikaku { public enum Mode { Syuuse, Syoukai } } } ---------------------------------- フォーム1 namespace WindowsFormsApplication1 { public partial class MainMenu : Form { private void button1_Click(object sender, EventArgs e) { Form2 cForm2 = new Form2(); cForm2.Syuusei = Keikaku.Mode.Syuusei; cForm2.ShowDialog(); } private void button2_Click(object sender, EventArgs e) { Form2 cForm2 = new Form2(); cForm2.Syuusei = Keikaku.Mode.Syoukai; cForm2.ShowDialog(); } } } ---------------------------------- フォーム2 namespace WindowsFormsApplication1 { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private Keikaku.Mode _kakunin; public Keikaku.Mode Syuusei { set { _kakunin = value; } } private void button1_Click_1(object sender, EventArgs e) { Form3 cForm3 = new Form3(); cForm3.ShowDialog(); } } } ---------------------------------- フォーム3 namespace WindowsFormsApplication1 { public partial class Form3 : Form { } }

  • 【.NET】動的に作成したコントロールの操作

    動的に作成したコントロールのイベントハンドラから、 同じく動的に作成したコントロールを操作するにはどうすれば良いのでしょうか? どちらのコントロールもKani.csからForm1.csに追加するものです。 例) ・Form1.cs ~省略~ namespace Chef {  ~省略~  KANI kani = new KANI();  kani.form1 = this;  kani.KanaFire();  ~省略~ ・Kani.cs ~省略~ namespace Chef {  public class KANI{   public Form1 form1;   public void KaniFire(){    //ラベル作成    Label LabelTARABA = new Label();    LabelTARABA.Text = "かにふらい";    form1.Controls.Add(LabelTARABA);    //ボタン作成    Button ButtonZUWAI = new Button();    form1.Controls.Add(ButtonZUWAI);    ButtonZUWAI.Click += new System.EventHandler(ButtonZUWAI_Clicked);   }   public void ButtonZUWAI_Clicked(object sender, System.EventArgs e){    /*ここでLabelTARABAを操作したい*/   }

  • C#

    form2で入力した文字を form1で表示させたいのですが、上手くいきません。プログラムの(文字制限の為)一部だけ のせます。アドバイス よろしくお願いします。 まず、form1 public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.MainMenu mainMenu1; private System.Windows.Forms.MenuItem menuItem1; private System.Windows.Forms.MenuItem menuItem2; private System.Windows.Forms.Label label1; private Form2 form2; /// <summary> /// 必要なデザイナ変数です。 /// </summary> private System.ComponentModel.Container components = null; public Form1() { // // Windows フォーム デザイナ サポートに必要です。 // InitializeComponent(); form2= new Form2(); label1.Text=string.Format("{0}",form2.s); // // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。 // } static void Main() { Application.Run(new Form1()); } private void menuItem2_Click(object sender, System.EventArgs e) { if (form2.ShowDialog(this) == DialogResult.OK) this.Refresh(); } } 次にform2です private void button1_Click(object sender, System.EventArgs e) { string s; s=(string)textBox1.Text; } public string s { get { return s; } }

  • ラベルのクリックイベントについて

    現在、MDIParent1フォームに、MDI子フォーム(Form1)を表示させています。 MDIParent1フォーム,MDI子フォーム(Form1)には、それぞれlabel1が配置されています。 やりたい事 MDIParent1フォーム上のlabel1をクリックしたとき MDI子フォーム(Form1)上のlabel1のリックイベント を発生させたい よろしくお願いします

  • C# Form処理

    Form1とForm3からForm2を表示させれるようにして,どちらかのフォームのコントロールをクリック したらform2が立ち上がりformに応じた処理を行いたいのですが,下記のコードではエラーとなって 動きません int Pin1 = f1.butt1; int Pin3 = f3.butt3; if (Pin1 == 1) { int h = f1.but; for (int hj = 1; hj < 43; hj++) { if (h == hj) { //Labelに文字を入力。 string Memo = "label" + (hj + 93); string Hd = "label" + (hj + 51); Label f1_Memo = (Label)f1.Controls[Memo]; f1_Memo.Text = this.textBox1.Text; Label f1_Hd = (Label)f1.Controls[Hd]; f1_Hd.Text = this.textBox2.Text; } } } else if (Pin3 == 1) { int h3 = f3.but3; for (int hj3 = 1; hj3 < 43; hj3++) { if (h3 == hj3) { //Labelに文字を入力。 string Memo = "label" + (hj3 + 744); MessageBox.Show(Memo.ToString()); Label f3_Memo = (Label)f3.Controls[Memo]; f3_Memo.Text = this.textBox1.Text; } } } Form1のコントロールであれば上のforループ,Form3であれば下のforループで処理するように考えております.Form1でform3を開くコントロールを選択した場合上記コードのbutt1は0になるように しているつもりです. エラーは NullReferenceExceptionがハンドルされませんでした. オブジェクト インスタンスの作成には new キーワードを使用します。 何がいけなくてどう対処すればよろしいのでしょうか? ご教授よろしくお願いいたします.

  • (Visual C#)カスタムコントロールで作ったリストのプロパティを

    (Visual C#)カスタムコントロールで作ったリストのプロパティを.Items[i]で参照できるように したいです。 具体的に言うと、 Form1…フォームアプリケーション MyList…フォームコントロールライブラリ MyListItem…フォームコントロールライブラリ の3つのソリューションがあります。 Form1にはMyListをデザイナーで、 MyListにはFlowLayoutPanelがあり その中にMyListItemを入れるようにコードを組んであります。 MyList.sln - UserControl1.cs using 省略 namespace MyList { public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); } public int Count = 0; public int SelectRow = -1; private MyListItem.MyListItem[] Mylistitem; private void Add (string URL, string Text, string ShowName, string Date){ Mylistitem[Count] = new MyListItem.MyListItem(); Mylistitem[Count].Text = Text + Count.ToString(); Mylistitem[Count].ImageURL = URL; Mylistitem[Count].ShowName = ShowName; Mylistitem[Count].Date = Date; Mylistitem[Count].Name = "MyListItem" + Count; Mylistitem[Count].Parent = this.flowLayoutPanel1; Mylistitem[Count].count = Count; this.Mylistitem[Count].Click += newEventHandler(this.MyListItem_Click); Count++; } private void button1_Click(object sender, EventArgs e) { Add("http://画像URL", "文字列1", "2", "3"); } private void UserControl1_Load(object sender, EventArgs e) { this.Mylistitem = new MyListItem.MyListItem[1000]; } } } MyListItem.sln - UserControl.csは省略します。 ここで質問なんですが、 Form1.csで、 private void TestMethod() { MyList1.Items[i].ImageURL = "http://画像URL"; } のようにしてMyList内のMyListItemのオブジェクト配列のなかで、 Count==iのものを探し、それのImageURLの値を変更することは可能でしょうか? 可能でしたら、その方法またはコードを教えていただけないでしょうか? 検索しても見つからなかったので質問しました。 回答よろしくお願いします。 あ、ちなみにVisual Studio 2010です。

  • VB6 ユーザコントロールでクリックイベント

    コンボボックスにclickイベントを書いたのち(この段階ではprivate) このコントロールをユーザコントロールにしました。 フォーム上に上記のユーザコントロールを配置したところ クリックイベントが発生しません クリックイベントを発生させるには 何か特殊な記述が必要ですか?(例えばオーバライドとか) どうすればクリックイベントを発生させられますか

  • C# 引数の渡し方について

    C# 引数の渡し方について //Form1 private void loginbutton_Click(object sender, EventArgs e) { book[] bk = new book[100]; Form2 f = new Form2(bk[0]); f.ShowDialog(this); //モーダルフォーム } public class book { public string name; public int price; } //Form2 public Form2(WindowsFormsApplication1.Form1.book bk) { InitializeComponent(); } Form2にbkの配列のすべてを渡したいのですが今のソースだとbk[0]しかわたせていないようです どうすればbk[0]~bk[99]のすべてを渡せるのでしょうか

  • C# コントロールの移動について

    数年のブランクののち、VB6からの乗り換えで、数日前から、C#を始めたところのまったくの素人ですが、よろしく。 起動時に、フォームは、指定の位置に移動・サイズ変更は反映しているのですが、 ピクチャアボックスの、移動は反映されません。 なぜでしょうか。 お手数ですが、素人にも理解できるように、ご教授ください。 ソース・・・ namespace C_TRY { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.Left = 200 ; // X位置 this.Top = 100; // Y位置 this.Width = 640; // 幅 this.Height = 480; // 高さ } private void pictureBox1_Layout(object sender, LayoutEventArgs e) { this.pictureBox1.Location = new Point(1000, 128); } } }

  • VSC#Epressで、FormのShowsに

    お世話になります。 VisualStudioC#2010Expressにて、フォーム(A)を作成し、 そのフォーム(A)にShownイベントを取り付けます。 そして、そのフォームを継承したフォーム(B)を作ります。 すると、そのフォーム(B)のみ、実行時だけではなく、 VisualStudioでフォームのデザイン時に そのフォームを開くと、VisualStudio内でもShownイベントが発生してしまいます。 (A)のフォームでは、この現象は起こりません。 下記のように、表示時に閉じるか否かの分岐をしておくと、 デザイナでも開いた瞬間にメッセージボックスが出て閉じてしまい、 二度と編集できなくなってしまいます。 はっきり言って迷惑です。 デザインしている途中でイベントが発生しないようにするには、 どうすればよいでしょうか。 よろしくお願いいたします。 フォーム(A) 継承元 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { private string a = null; public Form1() { InitializeComponent(); } private void Form1_Shown(object sender, EventArgs e) { if (a == null) { MessageBox.Show("aが設定されていません。"); this.Close(); } } } } フォーム(B) 継承先 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WindowsFormsApplication1 { public class Class1 : Form1 { } }

専門家に質問してみよう