对于我当前的项目,我在我的flowlayoutpanel : flpTasks中添加了一个可变数量的usercontrols : ucTask
foreach (task t in tasks)
{
ucTask uct = new ucTask();
uct.id = t.task_id;
uct.date= t.date.ToString();
uct.btnNaam = t.task_id.ToString();
uct.OnButtonclick += new EventHandler(uct_OnButtonclick);
flpTasks.Controls.Add(uct);
}

现在,我将在flowlayoutpanel中有几个这样的用户控件,并且我想在按下该按钮时触发一个事件。使用EventHandler我可以触发一个事件,但我需要为不同的按钮触发一个不同的事件。
void uco_OnButtonclick(object sender, EventArgs e)
{
lblStatus.Text = "TEST";
}我不知道如何知道我按下了哪个按钮(或用户控件)。我没主意了,有什么建议吗?
谢谢,托马斯
发布于 2012-04-04 21:51:38
事件的发送者实际上是一个按钮。将发件人类型转换为Button类型时,可以访问任何按钮属性并确定按下的按钮:
void uco_OnButtonclick(object sender, EventArgs e)
{
Button button = sender as Button;
if (button == null)
return;
lblStatus.Text = button.Name;
}更新:在再次阅读您的问题后,我了解到ucTask实际上是UserControl,当它里面的按钮被单击时,它会引发事件。
所以,首先是命名。PascalCase是c#中很好的类名样式。例如,对于任务用户控件,好的名称将是TaskControl。下一步是事件命名。将事件命名为EventName(-ing, -ed)是很常见的。如果你想引发事件,那么好的风格是受保护的方法OnEventName(-int, -ed)。另外,当你编写用户控件时,你可以自由地使用业务术语来命名你的事件。例如,TaskCreated,TaskChanged。您还可以通过创建自定义EventArgs将任何参数传递给您的事件。
因此,对于您的用户控件:
public class TaskChangedEventArgs : EventArgs
{
public TaskChangedEventArgs(int taskId)
{
TaskId = taskId;
}
public int TaskId { get; private set; }
}
public class TaskControl : UserControl
{
public event EventHandler<TaskChangedEventArgs> TaskChanged;
// raise it inside button click event handler
protected void OnTaskChanged(int taskId)
{
if (TaskChanged != null)
TaskChanged(this, new TaskChangedEventArgs(taskId));
}
}当您使用用户控件时,只需订阅它的TaskChanged事件:
uct.TaskChanged += new EventHandler<TaskChangedEventArgs>(uct_TaskChanged);您通过事件参数传递的所有参数都将在该事件处理程序中可用:
void uco_TaskChanged(object sender, TaskChangedEventArgs e)
{
lblStatus.Text = e.TaskId.ToString();
}发布于 2012-04-04 21:52:11
那么,发送者应该是用户控件,对吧?然后,您可以通过ucTask.id进行强制转换和确定项目。
void uco_OnButtonclick(object sender, EventArgs e)
{
ucTask uc = sender as ucTask;
lblStatus.Text = uc.id.ToString();
}这假设用户控件的OnButtonclick事件发送对用户控件的引用,而不是对作为事件发送者的按下按钮的引用。
https://stackoverflow.com/questions/10012456
复制相似问题