在flowlayoutpanel中按下了哪个按钮?

时间:2012-04-04 13:48:48

标签: 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

现在我将在flowlayoutpanel中有几个这样的用户控件,我想在按下该按钮时触发一个事件。使用EventHandler我可以触发一个事件,但我需要为另一个按钮触发不同的事件。

    void uco_OnButtonclick(object sender, EventArgs e)
    {
        lblStatus.Text = "TEST";
    }

我不知道如何知道我按下了哪个按钮(或用户控件)。而且我的想法,任何建议都没有?

谢谢, 托马斯

2 个答案:

答案 0 :(得分:2)

事件的发件人实际上是按钮之一。将发送者强制转换为按钮类型时,可以访问任何按钮属性并确定按下了哪个按钮:

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)是很常见的。如果你想引发事件,那么好的风格是受保护的方法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();
}

答案 1 :(得分:2)

那么,发件人应该是用户控制权吗?然后,您可以通过ucTask.id投射和确定项目。

void uco_OnButtonclick(object sender, EventArgs e)
{
    ucTask uc = sender as ucTask;
    lblStatus.Text = uc.id.ToString();
}

这假设用户控件的OnButtonclick事件发送对用户控件的引用,而不是对作为事件发送者的按下按钮的引用。