【问题标题】:How can I know if a specific button is the same as the "sender" to an event? C#我如何知道特定按钮是否与事件的“发送者”相同? C#
【发布时间】:2016-04-29 14:42:01
【问题描述】:

我有一个项目,我在其中实现了 70 个按钮,并使用数组 x 声明了每个按钮。当我点击一个按钮时,我需要它来改变颜色和其他我没有问题的东西,所以我创建了一个事件,ClickedButton,它可以帮助我这样做。到目前为止,代码看起来像这样:

private void ClickedButton(object sender, EventArgs e)        
{
    Button button_send = (Button)sender;

    for (int i = 0; i < 70; i++)
        if (x[i] == button_send)
        /* 
            instructions
        */
}

问题是,我需要知道哪个按钮被点击触发了事件,因为我需要i 位置。我该怎么做?显然将它们与== 进行比较是行不通的。

【问题讨论】:

  • 请说明您如何声明和填充您的x 集合
  • 为什么 == 不起作用?
  • 这是winforms吗? wpf?
  • 显然将它们与 == 进行比较是行不通的。 为什么???
  • @AdrianaUifaleanu:你还用按钮填充了数组?什么根本不起作用?你有错误吗?

标签: c# events button


【解决方案1】:

在 wpf 中,每个按钮都有一个标签属性,因此您可以将标签属性设置为数组中的按钮位置。您可以执行类似的操作

 int i=0;
 foreach(var button in x){
 button.tag=i;
 ++i;
}

然后你可以检查标签像

private void ClickedButton(object sender, EventArgs e)        
{

        Button button_send = (Button)sender;
         int position=Convert.ToInt32(button_send.Tag)
        for (int i = 0; i < 70; i++)
            if (position==i)
            /* 
                instructions
            */
}

【讨论】:

  • 当我将i 分配给button.Tag 它给了我Object reference not set to the instance of an object. 的错误:( 我该怎么办?
  • 你的按钮数组初始化了吗?如果不是,请在构造函数中对其进行初始化,并将第一个代码块放入构造函数中。希望对您有所帮助
  • 这是做什么的? for (int i = 0; i
  • 很抱歉,如果 (position==i) 而不是 1,则为 (int i = 0; i
【解决方案2】:

无论平台 - WinForms 或 WPF - 控件都有一个Tag 属性:

public object Tag { get; set; }

我过去所做的是分配一个特定的值来控制Tags。在这种情况下,分配int。然后,您可以执行以下操作:

private void ClickedButton(object sender, EventArgs e)        
{
    Button button_send = (Button)sender;
    var value = string.Empty;

    if (button_send.Tag != null && int.TryParse(button_send.Tag.ToString(), out value)
    {
        // check int 'value' against whatever logic you need
    }
}

另一个选项可能是字典:

Dictionary<Button, int>

通过直接映射到特定值,事件处理程序中的检查变得更短、更快。

不管怎样,Tag 属性最终更加灵活。如果不是 int 您的后继对象,而可能是委托人,您可以轻松地将对 Func&lt;T&gt;Action&lt;T&gt; 的引用存储在 Tag 中。

【讨论】:

  • 如何将int 分配给Tag
【解决方案3】:

这条语句x[i] == button_send 应该可以正常工作,但最好的方法是为每个按钮实例附加一个id 并与该ID 进行比较

而是有一个List&lt;Button&gt; 可以创建按钮实例并添加他们喜欢

Button b1 = new Button();
b1.id = "btn1";
x.Add(b1);

那么你就可以这样做了

x.Select(b => b.id == button_send.id);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-05
    • 2013-06-03
    • 2011-08-28
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    相关资源
    最近更新 更多