2017-10-26 5 views
0

アイコン付きのピクチャボックスを持つアプリケーションを作成しています。あなたはpictureboxをクリックすると、あなたをウェブサイトに連れて行く。私はピクチャボックスを50回以上再利用しています。それをコード化するにはより良い方法が必要なようです。現在、各写真ボックスにサイトを開くためのイベントトリガーがありますが、それは自分のために多くの作業を行うようになっているようです。画像ボックスを再利用してリンクを開く

private void CreditPic1_Click(object sender, EventArgs e) 
     { 
      System.Diagnostics.Process.Start("website"); 
     } 
     private void CreditPic2_Click(object sender, EventArgs e) 
     { 
      System.Diagnostics.Process.Start("website"); 

更新エラー:

Error 1 'Creditr.Form1' does not contain a definition for 'CreditPic1_Click' and no extension method 'CreditPic1_Click' accepting a first argument of type 'Creditr.Form1' could be found (are you missing a using directive or an assembly reference?)

現在のコード:

public Form1() 
     { 
      InitializeComponent(); 
      EventHandler openwebsite = new EventHandler(delegate { System.Diagnostics.Process.Start("http://warframe.wikia.com/wiki/Credits"); }); 
      foreach (Control c in this.Controls) 
      { 
       if (c.Name.StartsWith("CreditPic")) 
       { 
        c.Click += openwebsite; 
       } 
      } 
     } 

答えて

1

あなたが一緒に何かを試みることができる

は現在、私はそれをこのような何かをしていますlこのINES:フォームのInitializeComponent();そのコンストラクタで直後に

EventHandler openwebsite = new EventHandler(delegate { System.Diagnostics.Process.Start("website"); }); 
foreach (Control c in this.Controls) 
{ 
    if(c.Name.StartsWith("CreditPic")) { 
     c.Click += openwebsite; 
    } 
} 

フォーム内のすべてのコントロールを反復処理する必要があります。コントロールの名前が 'CreditPic'で始まる場合、openwebsiteという代理人をそのClickイベントに添付します。

Visual Studioのフォームビューアで新しいイベントハンドラを追加するか、手作業で追加する(Grantlyの回答を参照)ことと比べて、このような利点は、イベントハンドラを追加するというこの方法は、コードを変更する必要がない新しい 'CreditPic'画像ボックスを追加すると、実行時にイベントが自動的に追加されます(コントロールの名前が 'CreditPic'で始まると仮定します)。


これは、フォームの直接の子であるコントロールでのみ機能します。あなたはそれを反復している間、これを回避するには、スタックにコントロールの子をプッシュするために、スタックを使用することができます。

EventHandler opengoogle = new EventHandler(delegate { System.Diagnostics.Process.Start("http://google.com"); }); 

Stack<Control> Controls = new Stack<Control>(); 
foreach (Control c in this.Controls) Controls.Push(c); 
do 
{ 
    Control c = Controls.Pop(); 

    if (c.Name.StartsWith("GooglePic")) 
     c.Click += opengoogle; 

    foreach (Control nc in c.Controls) 
     Controls.Push(nc); 
} while (Controls.Count > 0); 
+0

これは好きですeベストルート。ヘルプとサポートをありがとう! – dwb

+0

私は何か基本的なものが欠けていると思います。私はあなたのコードを追加し、テストを行いました。私がピクチャボックスlabled 'CreditPic1'をクリックすると、何も起こりません。 (エラーなし)。しかし、私は古いclick_eventsを削除するとエラーになります。私はそのエラーでトップポストを更新しました。 – dwb

+0

何らかの理由でVisual Studioがコード内のメソッドを削除すると、自動的にイベントを削除するとは思われません。フォームビューでコントロールをクリックし、コントロールのプロパティウィンドウでライトニングボルトをクリックし、「クリック」アクションを見つけてクリアする必要があります。 – AlphaDelta

1

あなたが動的になるように、彼らがポイント、ピクチャボックスの各インスタンスにイベントハンドラを追加することができます同じ機能をするときのようなイベントが発生し、この

CreditPic1.Click += new EventHandler(YourNewFunctionName); 
CreditPic2.Click += new EventHandler(YourNewFunctionName); 

... でも、これはあまりにも悪いことではありませんハードコーディングするか、すべてを介してすべてPictureBoxes ...(またはループをループするためにリフレクションのいくつかの並べ替えを使用することができますフォーム上のコントロール)

関連する問題