C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: クリックイベントをどちらにつけるか


(過去ログ 128 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■76001 / inTopicNo.1)  クリックイベントをどちらにつけるか
  
□投稿者/ pod (37回)-(2015/05/22(Fri) 14:42:06)

分類:[C#] 

VS2013 C# のフォームアプリケーションで、フォーム内に複数のパネルを配置されていて、それぞれのパネルにはラベルが張り付いています。
パネルは Panel を継承した独自クラスで、コンストラクタで自動的にラベルを作成して自身に追加してあります。
ラベルをクリックした際に、座標入力用ダイアログを表示してその結果を元にパネルをの位置を変更しようと思うのですが、クリックイベントをフォームかラベルのどちらにつけるべきか迷っています。

1. label を public にしてフォームに panel.label.Click イベントをつける
2. パネルクラスに this.label.Click イベントをつける

最初は 2 の方法で実装したのですが、入力ダイアログでの位置変更後に他のパネルと重なっていた場合は位置をずらすという処理を新たに加える際、親フォームにある全てのパネルを参照する必要が出てしまいます。
フォーム側は List<MyPanel> panels の形でパネル一覧を持っています。

このような場合どういう構造にすべきでしょうか?
引用返信 編集キー/
■76007 / inTopicNo.2)  Re[1]: クリックイベントをどちらにつけるか
□投稿者/ WebSurfer (582回)-(2015/05/22(Fri) 15:33:42)
No76001 (pod さん) に返信

処理を行う上で、どの Panel がクリックされたかを知る必要はないのですか?

その必要があるなら、From ではなく Panel の Click イベントを利用するという
ことになると思うのですが。
引用返信 編集キー/
■76008 / inTopicNo.3)  Re[1]: クリックイベントをどちらにつけるか
□投稿者/ 魔界の仮面弁士 (346回)-(2015/05/22(Fri) 15:41:42)
No76001 (pod さん) に返信
> パネルは Panel を継承した独自クラスで、コンストラクタで自動的にラベルを作成して自身に追加してあります。
> ラベルをクリックした際に、座標入力用ダイアログを表示してその結果を元にパネルをの位置を変更しようと思うのですが、

仕様を読み解ききれているかは自信がありませんが、
私はこのようなコードをイメージしました。

/// ----------------------------------------
public Form1()
{
 InitializeComponent();
 this.originalPanel1.LabelClick += originalPanels_LabelClick;
 this.originalPanel2.LabelClick += originalPanels_LabelClick;
 this.originalPanel3.LabelClick += originalPanels_LabelClick;
}

public originalPanels_LabelClick(object sender, LabelClickEventArgs e)
{
 var panel = (OriginalPanel)sender;
 int labelIndex = e.LabelIndex;
 Point pos = e.MouseLocation;

 using(var dlg = new 座標入力用ダイアログ(e))
 {
  if(dlg.ShowDialog() == DialogResult.Cancel) return;

  var 新しい座標 = dlg.NewPosition;
  panel.Locaption = 調整処理(新しい座標);
 }
}
/// ----------------------------------------
引用返信 編集キー/
■76009 / inTopicNo.4)  Re[2]: クリックイベントをどちらにつけるか
□投稿者/ pod (38回)-(2015/05/22(Fri) 16:15:14)
2015/05/22(Fri) 18:32:20 編集(投稿者)
2015/05/22(Fri) 18:32:12 編集(投稿者)

WebSurferさん、魔界の仮面弁士さん、回答ありがとうございます。

No76007 (WebSurfer さん) に返信

> 処理を行う上で、どの Panel がクリックされたかを知る必要はないのですか?

今のところ区別に関してはsenderをキャストする形で行おうと思っています。


No76008 (魔界の仮面弁士 さん) に返信
カスタムイベントを使うのですね。
ひとまず「public event EventHandler LabelClick;」を定義した上で、
パネル側のラベルクリックイベントで LabelClick(this, e) を発生させてフォーム側でそれを拾う形で実装して正しく動作しました。
独自のイベント引数に関しては必要に応じて定義しようと思います。
ありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -