【问题标题】:Pass name of button to click event将按钮的名称传递给单击事件
【发布时间】:2013-08-05 15:06:15
【问题描述】:

我正在生成许多具有相似或相同内容的按钮,并希望使用它们的名称来区分它们。由于程序正在动态创建按钮,因此我无法为所有按钮创建单独的事件,而是需要能够获取名称才能知道哪个按钮触发了事件。

有没有办法将按钮的名称传递给它启动的点击事件? sender 对象似乎包含内容但不包含名称。

这是为了这样的事件:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        //getname of button
        Canvas.Children.Remove(//name of button\\)
    }

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    据我所知,WPF 甚至不会自动为Name 属性分配任何东西——这只是供开发人员分配,以便我们可以引用控件。

    但是,您应该能够只将 sender 传递给 remove 方法,因为它接受 Button 派生自的 UIElement 参数。

    Canvas.Children.Remove((Button)sender);
    

    【讨论】:

    • 程序在创建每个按钮时为其分配一个唯一的名称。也在尝试 Canvas.Children.Remove(sender);返回错误:“'System.Windows.Controls.UIElementCollection.Remove(System.Windows.UIElement)'的最佳重载方法匹配有一些无效参数”
    • 这个错误是因为“sender”是一个“object”。将其转换为“按钮”,然后它将成为 UIElement。这个答案是正确的。
    • 啊,是的,一旦我这样做,它确实有效。这个名字本身就是我需要抓住的,因为它不仅仅用于删除自身的情况。我从未见过 (Button) 使用来定义某些东西。我想知道我还可以使用类似的方法在我的代码中简化什么。
    • 是的,您的帖子没有提到您自己为控件分配名称,因此 Win 的方法确实有效。但是,为了遵守强类型约束,强制转换为 (Type) 非常常见。请注意,它实际上并没有改变类型,它更像是在假定的别名下揭示一个人的真实姓名。在这种情况下,Object 的假定别名。
    【解决方案2】:

    我不熟悉 WPF。如果这个答案看起来是垃圾,我会删除它。

    在 ASP.Net 中,我们可以强制转换为一个按钮来获取发送者的信息。像这样的 -

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var button = sender as Button;
        button.Name
    }
    

    【讨论】:

    • 这实际上不起作用,因为默认情况下,WPF 中的按钮和其他元素没有任何分配给名称。它们只是一个空字符串。
    • 这实际上似乎奏效了。我需要对其进行更多测试,以确保它在所有情况下都能正常工作,但您可能刚刚为我省去了很多麻烦!
    • 这让我可以抓取并保存按钮的名称以及按钮本身,以便在进一步的事件中使用。谢谢你正是我需要的。
    【解决方案3】:

    也许获取控件的名称对你有用

    private void button1_Click(object sender, RoutedEventArgs e)
    {
      Control control = (Control)sender;
      Canvas.Children.Remove(control.Name);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 2012-02-19
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多