2010-07-30 88 views
0

没有详细讨论我想要达到的目标,是否可以(以及如何)可以引用一个我不知道名称的对象? 例如,我要像saything:如何获取当前控件的名称以动态分配控件文本?

someButton.Text = someButton.Name; 

但右侧我不想陈述对象的名字。所以我真的很想做的是一样的东西:

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

基本上我想这取决于一堆其他的东西在运行时动态分配控制文本。希望如果我能做到这一点,我可以只用一种方法做出决策并重新使用它。 (我正在使用Windows窗体) 我希望有一些方法可以让程序知道我在说什么控件(当前控件)有点像this参考。所以我不需要继续传递特定的对象,如果我要这样做,我可能只是传递字符串。我希望每次都需要粘贴调用该方法的相同代码行。我怀疑我只是懒惰......而我想做的事很荒谬。

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

我认为答案可能是自定义控件。 (不只是按钮,各种GUI控件)。哪一个会比我的选择花费更多的努力。

回答

1

你如何确定“当前”按钮?

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

你的意思是焦点?阅读ActiveControl属性(并将其转换为Button)。

编辑︰等待,由目前按钮你的意思是在左边的一个赋值语句?如果你想执行一堆不同按钮的操作,你可以避免多次命名每个按钮。这里有一个例子:

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); 
+0

感谢。我认为这是我所追求的。我刚刚在寻找与收藏有关的东西,而你的第一个例子看起来就像我想要做的。 如果我需要处理各种控件(而不仅仅是按钮),我甚至可以将它与@ Draak的代码结合起来。 谢谢。 – DougF 2010-08-01 23:11:35

+0

只要你没有使用任何按钮特定的属性,你可以将'Button'改为'Control'并且处理各种控件。当你有一个基类时没有理由使用反射。 – 2010-08-01 23:23:39

0

使用反射。

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(); 
} 
+0

除了我不认为Button有一个Name属性,所以我猜你会使用ID或其他工作。 – Antony 2010-07-30 01:42:18

+0

嗯,没有迹象表明他在谈论什么样的UI技术,但如果它是WPF或Windows窗体,它们都有一个Name属性。在这两种情况下都不需要反射 - 只需将对象转换为Control(WinForms)或FrameworkElement(WPF)类型即可。 – Josh 2010-07-30 02:28:00

+0

谢谢,我对这个答案感到兴奋。然后我意识到它实际上和调用Button.Name属性是一样的。 :(:(它确实有;))我会更新这个问题,并提供更多的细节。 – DougF 2010-07-30 02:35:59

相关问题