对于我当前的项目,我将可变数量的 usercontrols : ucTask
添加到我的 flowlayoutpanel : flpTasks
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);
}
现在我将在 flowlayout 面板中有几个这样的用户控件,我想在按下该按钮时触发一个事件。使用 EventHandler
我可以触发事件,但我需要为不同的按钮触发不同的事件。
void uco_OnButtonclick(object sender, EventArgs e)
{
lblStatus.Text = "TEST";
}
我不知道如何知道我按下了哪个按钮(或用户控件)。我没有想法,有什么建议吗?
谢谢, 托马斯
最佳答案
事件的发送者实际上是按钮之一。当您将 sender 转换为 Button 类型时,您可以访问任何 Buttons 属性并确定按下了哪个按钮:
void uco_OnButtonclick(object sender, EventArgs e)
{
Button button = sender as Button;
if (button == null)
return;
lblStatus.Text = button.Name;
}
更新:再次阅读您的问题后,我了解到 ucTask 实际上是 UserControl,它在单击其中的按钮时触发事件。
所以,首先是命名。在 C# 中类名的良好风格是 PascalCase。例如。任务用户控件的好名字将是 TaskControl
。接下来是事件命名。通常将事件命名为 EventName(-ing, -ed)
。如果你想引发事件,那么好的风格是 protected 方法 OnEventName(-int, -ed)
。还有一点——当您编写用户控件时,您可以自由使用业务术语来命名您的事件。例如。任务已创建,任务已更改。您还可以通过创建自定义 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();
}
关于c# - 在流程布局面板中按下了哪个按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10012456/