C#のクリックイベントで別のコントロールをクリックする方法

このQ&Aのポイント
  • C#のクリックイベントで他のコントロールをクリックさせるには、`PerformClick()`メソッドを使用します。
  • ただし、ピクチャーボックスの場合、`PerformClick()`メソッドを直接使用することはできません。エラーメッセージが出るため、別の方法を探す必要があります。
  • ピクチャーボックスのボタンクリックイベントを発生させるには、他のイベントハンドラーを介して操作する必要があります。
回答を見る
  • ベストアンサー

C# のクリックイベント

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

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

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

残念ながら無理。 PerformClick()メソッドはSystem.Windows.Forms.Buttonクラスの持ち物で、System.Windows.Forms.PictureBoxクラスにはそれに相当するものがない。 英語のQAサイトを漁っても、「直接pictureBox1_Click(this.pictureBox1, null);を呼べとかそんな風にしか書かれていない。 と、まぁここまでだったらあなたをがっかりさせる普通の何の解決にもなってない回答だ。恐らくあなたがインターネットを検索して得た情報と何も変わりはすまい。 PictureBoxにPerformClick()が無いなら追加すればいいじゃない! by まりーあんもちねっと といっても、System.Windows.Forms.PictureBoxクラスを書き換えるわけではないし使う側も面倒な手順を踏む必要がある。 プロジェクトを右クリックして追加→新しい項目でカスタムコントロールを選ぶ。ファイル名はClickablePictureBox.csとしようか。 で、そうするとControl(System.Windows.Forms.Control)から派生したクラスが自動的にできるのだが、これをSystem.Windows.Forms.PictureBoxに書き換える。 とりあえずさくっとサンプルコードを示す。サンプルでは名前空間をWindowsFormsApplication1にしてるけどお好きなものをどうぞ。 namespace WindowsFormsApplication1 {  public partial class ClickablePictureBox : System.Windows.Forms.PictureBox {   public ClickablePictureBox() {    InitializeComponent();   }   public void PerformClick() {    this.OnClick(new EventArgs());   }  } } これで、PerformClick()というメソッドが追加されてかつそれがClickイベントを引き起こす以外は全てPictureBoxと同じ振る舞いを行うコントロールを使う事が出来るようになる。 で、使う側もSystem.Windows.Forms.PictureBoxの変わりにWindowsFormsApplication1.ClickablePictureBoxを使う。 そうすると、それ以外にあなたのプログラムは何一つ変える事無くあなたのやりたい事が実現できるぜ。 あ、これは.Net 2.0相当の普通のWindows Formアプリケーションを想定してます。まぁWPFにはPictureBox自体無いので大丈夫だと思うけど。

satisfied999
質問者

お礼

すごい☆ こんなこともできるのですね!勉強になりました。

関連するQ&A

  • ピクチャボックスのクリックイベント

    ピクチャボックスのクリックイベント Visual C#でトランプゲームを作っているのですが this.PB = new System.Windows.Forms.PictureBox[54]; ↑のようにピクチャボックスの配列作ったのですが それぞれのクリックイベントを作りたいのですが、それがどうしても分かりません たとえばPB[30]がクリックされたらPB[30]の画像を他のピクチャボックスに移すなど このようなことをするにはどうすればいいですか?

  • C#でstop()が使えない。

    http://kana-soft.com/tech/sample_0012_3.htm#WebBrowser_Stop このHPを参考にstop()メソッドを使おうとしたのですがSTOP()に下記のエラーが出ます。 'System.Windows.Forms.WebBrowser' に 'stop' の定義が含まれておらず、型'System.Windows.Forms.WebBrowser' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。 VS2010を使用し、.NETは4なので問題なく使えると思うのですが原因不明です。 以下ソースです。 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 busywait4 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { webBrowser1.Navigate("http://yahoo.co.jp");//もう一度、アクセスしなおす。 } int i; private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { webBrowser1.stop(); }

  • C# ツリービューの使い方

    現在、Microsoft Visual C# 2008 Express Editionでプログラムを作成しているのですが、ツリービューの使い方がよくわかりません。 具体的には、ツリービューとリストビューを左右に並べて、ツリービューのノードをクリックしたときに、その子ノードをリストビューに表示したいと考えています。 そこで、 ツリービューのNodeMouseClickイベントで foreach ( TreeNode child in this.treeView1.SelectedNode.ChildNodes ) { //リストにノードを表示する } と記述したのですが、 「'System.Windows.Forms.TreeNode' に 'ChildNodes' の定義が含まれておらず、型 'System.Windows.Forms.TreeNode' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。」 というエラーが発生しました。 これを解決するにはどうすればいいのでしょうか?また、私が実装しようと考えている機能を、ツリービューとリストビューを併用した方法以外でより効率的にかけたりしますか? C#に詳しい人、回答よろしくお願いします。

  • 【C#】インデックス番号(?)の取得

    いつもお世話になってます。 C#に関して質問です。 VisualC#2008を使用しています。 private System.Windows.Forms.PictureBox[] kihon_pic = new PictureBox[100]; のように、ピクチャーボックスのコントロール配列を作り、あるピクチャーボックスがクリックされたときに、そのピクチャーボックスのインデックス番号(?)を取得できるようにしたいと思っています。 例えば、クリックされたピクチャーボックスはkihon_pic[4]であるとか、kihon_pic[7]であるとか、そういった具合にです。 誰か方法が分かる人がいましたら、ご回答をよろしくお願いします。

  • C#のargs[0].Successの記述

    if (System.Text.RegularExpressions. Regex.Match(line, args[0].Success)) の記述で, エラー 1 'string' に 'Success' の定義が含まれておらず、型 'string' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。 といったコンパイルエラーが出るようなのですが、usingディレクティブで追加しないといけない記述とかあるのでしょうか? よろしくお願い致します。

  • WPF C# PointToClient

    お世話になります。 宜しくお願いいたします。 以下のコードでエラーが出ます。 System.Drawing.Point p = this.PointToClient(System.Windows.Forms.Cursor.Position); エラー内容 'クラス名' に 'PointToClient' の定義が含まれておらず、型 'クラス名' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。 使用中のクラスは、たしかに System.Windows.Controls.UserControl を継承しています。 さまざまな方法を試しましたが、全く理解できません。 ・解決方法または、WPFでマウス座標を取得する方法について ご教授お願いいたします。

  • VBのイベント処理について

    お世話になります。 VB6.0のイベント処理について教えてください。 VB.NETでは、イベント処理のメソッド(VBだとプロシージャですか) のシグニチャのおしりに Handles Button1.Click という記述がされているので、このメソッドはButton1のクリックという イベントが発生したときに行われる処理だなと見当がつくのですが、 VB6.0ではその記述をしないのが一般的とみました。 してそのときに、このメソッドがButton1のクリック時のイベントだと いうのは、どのように判断されるのですか?メソッド名が Button1_Click みたいに勝手につけられるので、それで判断されるのですか?という ことはメソッド名を変えたらそのメソッドはButton1のクリック時の イベント処理メソッドではなくなってしまうのですか? よろしくご教授ください。

  • c# イベント用デリゲートの引数

     こんにちは。c#初心者です。  今回はイベントに用いるためのデリゲートの引数に関する質問です。  通常、「System.Windows.Forms.Control」のイベントで用いられているデリゲートの引数は全て  void SampleHandler(object sender, SampleEventArgs e)  のようになっていますが、コントロール以外のクラス(System.Windows.Forms.Controlから派生しないクラス)、例えばコレクションクラスのようなものでも同じように「EventHandler<T>」デリゲートを使わなければならないのでしょうか?  それともう一つ質問です。コントロールクラスでのイベントの引数は  SampleHandler(object sender, …  のようにせずに  SampleHandler(SampleControl sender, …   としてはいけないのでしょうか? (いけないと思いますが…)  質問は以上の2点です。どなたか詳しい方がいらっしゃいましたら教えていただけませんか?

  • VC++:pictureBoxにイベントなしで描画

    前略 ・ Visual Studio 2012 のVC++を使っています。 フォームに貼り付けたピクチャーボックスに、フォームが表示された時にボタンクリック等特にイベントを発生させないでも 描画したいのですができません。 どなたか教えていただければ幸いです。  以下の例で具体的に教えてください。 ボタンもフォームに貼りつけてボタンクリックイベントの中に以下のようにコーディングしてボタンをクリックすると円が描けます。 どのようにすれば、ボタンクリックしないでもフォームが表示された時に、円がピクチャーボックスの中に描画されているようになるのででしょうか?    private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { // 描画を行うグラフィックスクラスを生成 Graphics^ g = pictureBox1->CreateGraphics(); //円の描画 Pen^ blackPen = gcnew Pen(Color::Black, 3); g->DrawEllipse(blackPen, 50, 50, 75,75); //基点(50,50) 幅×高さ:75×75  } 以上、よろしくお願いします

  • VC# 追加フォーム生成時、フォームに描画できない

    前略 ・VC#(.NET 2008)のプログラムでおしえてください。 ・メインのWindowsフォームからボタンクリックで 追加したサブWindowsフォーム上のピクチャーボックス上に何も操作なしでに描画したいのですができません。CreateGraphics()でオブジェクトを生成して描画しています。どのようにしたらよいのかおしえてください。フォームのイベントとして、Paint,Load,shown,Activated等いろいろやってもだめでした。  尚、サブフォームにボタンをもうけ このメソッドの中に描画コマンドを書き、ボタンを操作すると描画できます。下記は円を描こうとしていますが、shapeコンポーネントでは描けな複雑な描画をしたいと思っています。 ・以下に 下記の動作となるソースコードを記載します。 (1)起動するとメインフォームForm1のpictureBox1に 赤い円が描かれる (2)ボタンbutton1をクリックするとForm2が表示される。  Form2上のラベルlabel1とlabel2の文字色は青色に変わっています。  しかし、円は何故か描かれていません (3)Form2上のボタンをクリックすると赤い円がForm2上に描かれます。  どこをどのように直せば追加のサブフォームForm2が表示された時に Form2上のpictureBox1に円が描がかれているのでしょうか。以上、よろしくお願いします //----------------------------------------------------------- //メインフォーム 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 temp2 { public partial class Form1 : Form { public Form1(){ InitializeComponent(); } private void button1_Click(object sender, EventArgs e){ Form2 form2 = new Form2(); form2.ShowDialog(); } private void Form1_Paint(object sender, PaintEventArgs e){ Graphics g = pictureBox1.CreateGraphics(); g.DrawEllipse(Pens.Red, 0, 0, 200, 200); } } } //サブフォーム 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 temp2 { public partial class Form2 : Form { public Form2(){ InitializeComponent(); } private void pictureBox1_Paint(object sender, PaintEventArgs e){ label1.ForeColor = Color.Blue; Graphics g1 = pictureBox1.CreateGraphics(); g1.DrawEllipse(Pens.Blue, 0, 0, 50, 50); label2.ForeColor = Color.Blue; } private void button1_Click(object sender, EventArgs e){ Graphics g2 = pictureBox1.CreateGraphics(); g2.DrawEllipse(Pens.Blue, 0, 0, 50, 50); } private void Form2_Paint(object sender, PaintEventArgs e){ } private void Form2_Load(object sender, EventArgs e){ } private void Form2_Shown(object sender, EventArgs e){ } } } 以上

専門家に質問してみよう