ボタンを動的に作成するとき、新しいMouseEventHandlerが必要でした。私はそうしました、
this.Controls[btnAdd.Name].MouseClick += new MouseEventHandler(generalMethods.generatePopup());
ただし、イベントにパラメーターを渡す必要があるため、ボタン番号を示す整数を受け入れるようにgeneratePopupを作成しました(さらに使用できるようにしました)。以前は、匿名のデリゲートを使用して追加のパラメーターを渡すだけでしたが、新しいインスタンスを作成したいので、これは機能しないようです。
this.Controls[btnAdd.Name].MouseClick += delegate(object sender, MouseEventArgs e) { new MouseEventHandler( generalMethods.generatePopup(sender, e, i); };
エラーは新しいMouseEventHandlerにあるようです。これを取り出すと、正常に動作し、追加のデータを渡すことができますが、新しいインスタンスではないため、各ボタンに独自のイベントを与えることはありません。
this.Controls[btnAdd.Name].MouseClick += new MouseEventHandler(generalMethods.generatePopup());
誰かがこれを回避する方法を知っていますか?たとえば、アノンデリゲートアプローチを引き続き使用し、イベントの新しいインスタンスを作成するにはどうすればよいですか?
編集:うーん、私はこれを試しました(パラメーターはうまくいくと思います)が、ボタンごとに新しいマウスイベントハンドラーを作成する代わりに、すべてのボタンに同じものを使用しているようです。正しいボタン番号を取得していますが、ポップアップのすべてのラベルは、正しいボタン番号ではなく、最後のボタン番号を返しています。何か案は?
編集2:ボタンを生成するための私のコードブロックは次のとおりです。
for (int i = 0; i <= count && i < 2; i++)
{
Button btnAdd = new Button();
btnAdd.Text = dataTable.Rows[i]["deviceDescription"].ToString();
btnAdd.Location = new Point(x, y);
btnAdd.Tag = i;
btnAdd.Name = "btn" + i.ToString();
btnAdd.BackColor = Color.Green;
this.Controls.Add(btnAdd);
this.Controls[btnAdd.Name].MouseClick += (sender, e) =>
{
int index = i;
generalMethods.generatePopup(sender, e, index);
};
これが私のgeneratePopupメソッドです。これはmouseEventHandlerです。
public void generatePopup(object sender, MouseEventArgs e, int buttonNumber)
{
// DBConnector mDBConnector = new DBConnector();
// DataTable dataTable = mDBConnector.Select("SELECT * FROM devices WHERE deviceID = " + buttonNumber);
DeviceBreakdownPopup popupDevice = new DeviceBreakdownPopup();
popupDevice.lblDeviceNo.Text = buttonNumber.ToString();
PopupWindow popup = new PopupWindow(popupDevice);
popup.Show(Cursor.Position);
}
わかりやすくするために、何が起こっているのかを示した画像を次に示します。
ここでは、ラベル「2」が付けられた両方のポップアップユーザーコントロールが表示されていますが、それぞれに正しい値「1」と「2」が必要です。