首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在flowlayoutpanel中按下了哪个按钮?

在flowlayoutpanel中按下了哪个按钮?
EN

Stack Overflow用户
提问于 2012-04-04 21:48:48
回答 2查看 2.7K关注 0票数 1

对于我当前的项目,我在我的flowlayoutpanel : flpTasks中添加了一个可变数量的usercontrols : ucTask

代码语言:javascript
复制
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我可以触发一个事件,但我需要为不同的按钮触发一个不同的事件。

代码语言:javascript
复制
    void uco_OnButtonclick(object sender, EventArgs e)
    {
        lblStatus.Text = "TEST";
    }

我不知道如何知道我按下了哪个按钮(或用户控件)。我没主意了,有什么建议吗?

谢谢,托马斯

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-04 21:51:38

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

代码语言:javascript
复制
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将任何参数传递给您的事件。

因此,对于您的用户控件:

代码语言:javascript
复制
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事件:

代码语言:javascript
复制
uct.TaskChanged += new EventHandler<TaskChangedEventArgs>(uct_TaskChanged);

您通过事件参数传递的所有参数都将在该事件处理程序中可用:

代码语言:javascript
复制
void uco_TaskChanged(object sender, TaskChangedEventArgs e)
{
    lblStatus.Text = e.TaskId.ToString();
}
票数 2
EN

Stack Overflow用户

发布于 2012-04-04 21:52:11

那么,发送者应该是用户控件,对吧?然后,您可以通过ucTask.id进行强制转换和确定项目。

代码语言:javascript
复制
void uco_OnButtonclick(object sender, EventArgs e)
{
    ucTask uc = sender as ucTask;
    lblStatus.Text = uc.id.ToString();
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10012456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档