【问题标题】:How can I get the Name of current control to dynamically assign control text?如何获取当前控件的名称以动态分配控件文本?
【发布时间】:2010-07-30 01:27:50
【问题描述】:

如果不详细说明我想要实现的目标,我是否可以(如果可以的话)可以引用一个我不知道其名称的对象吗? 例如我想说的是:

someButton.Text = someButton.Name;

但在右侧我不想说明对象名称。所以我真正想做的是:

someButton.Text = currentButton.Name;
otherButton.Text = currentButton.Name;

基本上我想根据一堆其他东西在运行时动态分配控制文本。希望如果我能做到这一点,我可以将决策放在一个方法中并重用它。

更新:(我使用的是 Windows 窗体。) 我希望程序有某种方法可以知道我在谈论什么控制(当前控制),有点像this 参考。所以我不必一直传递特定的对象,如果我要这样做,我可能只需传递字符串即可。我希望每次需要时都粘贴调用该方法的同一行代码。我怀疑我只是懒惰……而我想做的事情很荒谬。

并且控件没有关联的事件。

我认为答案可能是自定义控件。 (不仅仅是按钮,还有各种 GUI 控件)。这将比我的选择需要更多的努力。

【问题讨论】:

    标签: c# controls dynamic


    【解决方案1】:

    如何确定“当前”按钮?

    它只是被点击了吗?将sender 参数用于Click 事件处理程序(并将其转换为Button)。

    你是指有焦点的那个吗?读取ActiveControl 属性(并将其转换为Button)。

    编辑:等等,current 按钮是指赋值语句左侧的那个吗?如果你想对一堆不同的按钮执行一些操作,你绝对可以避免多次命名每个按钮。这是一个例子:

    foreach(Button currentButton in new Button[] { thisButton, thatButton, otherButton, yetAnotherButton })
    {
        currentButton.Text = currentButton.Name;
    }
    

    Action<Button> copyName = (currentButton) => currentButton.Text = currentButton.Name;
    copyName(thisButton);
    copyName(thatButton);
    copyName(otherButton);
    copyName(yetAnotherButton);
    

    【讨论】:

    • 谢谢。我想这就是我所追求的。我一直在寻找与集合有关的东西,你的第一个例子看起来像我想做的。如果我需要处理各种控件(不仅仅是按钮),我什至可以将它与@Draak 的代码结合使用。谢谢。
    • 只要您不使用任何特定于 Button 的属性,您就可以将 Button 更改为 Control 并处理各种控件。当你有一个基类时,没有理由使用反射。
    【解决方案2】:

    使用反射。

    Imports System.Reflection
    
    Public Function GetName(b as Button) as String
      Dim t As Type = b.GetType()
      Dim prop As PropertyInfo = t.GetProperty("Name")
      Return prop.GetValue(b, Nothing).ToString()
    End Function
    

    在 C# 中,我相信它会是这样的:

    using System.Reflection;
    
    public string GetName(Button b)
    {
        Type t = b.GetType();
        PropertyInfo prop = t.GetProperty("Name");
        return prop.GetValue(b, null).ToString();
    }
    

    【讨论】:

    • 除非我认为 Button 没有 Name 属性,所以我猜你会使用 ID 或其他有效的东西。
    • 嗯,没有迹象表明他在谈论哪种 UI 技术,但如果是 WPF 或 Windows 窗体,它们都有 Name 属性。在这两种情况下都不需要反射 - 只需将对象转换为 Control (WinForms) 或 FrameworkElement (WPF) 类型。
    • 谢谢,我对这个答案很兴奋。然后我意识到它实际上与调用 Button.Name 属性相同。 :((它确实有;))我会更新这个问题,更详细一点。
    • 一样的好吧。除了您可以按照我的理解动态传递不同的控件而不仅仅是按钮,而且您可以在不知道类型或进行一些长案例选择的情况下做到这一点。只要控件上存在 Name 属性,此代码就可以工作。您可能希望添加一个异常处理程序,以防该属性不存在。
    • 形参的编译时类型是Button,所以除了Buttons,你不能传递任何东西。如果您确实需要处理没有在公共基础上定义属性的异构对象混合,dynamic 将是最直接的方法。
    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    相关资源
    最近更新 更多