c# - 在流程布局面板中按下了哪个按钮?

标签 c# winforms user-controls event-handling

对于我当前的项目,我将可变数量的 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);
}

ucTask

现在我将在 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/

相关文章:

c# - Response.cookies出现在request.cookies中

c# - 从另一个线程写入 TextBox?

user-controls - 银光2.0 : Determine if a dependency property is set before changing it

c# - ImageList.RemoveAt(index1); 的逆运算是什么?

c# - 如何在 .NET 枚举中搜索正确的方法

winforms - .NET/Visual Studio 编辑器中的相对控件位置

c# - .NET WinForm GC 问题

c# - Win Forms UserControl 未检测到按键

wpf - 按属性替换 UserControl

使用 AxShockwaveFlash 的 C#/ActionScript