2013-04-21 66 views
0
String ^% text = button->Text ; 
text = "something" ; 

应该更改按钮的文本,但它不。如何通过引用传递按钮或其他控件的文本

+1

[?为什么字符串是不可变的,什么是它的意义(http://www.codeproject.com/Articles/406046/Why-strings-are -immutable-what-the-implica) – I4V 2013-04-21 14:17:23

回答

3

这不能工作,代码只会更新对象。它没有达到这个目标,并且还更新了TextBox :: Text属性。这不仅仅是因为这是一个字符串,正如在重复链接中所暗示的那样,它也不适用于简单的值类型属性。

这是因为属性不是值,您不能创建对它们的引用。当你使用它们时,它们看起来像语法中的值。但是当你声明它们时肯定不是,注意你如何编写get和set方法。所以要更新文本框中显示的文本,你必须调用属性的set方法。这不仅仅是一个简单的变量赋值,它是一个方法调用。直观上可能很明显,注意如何分配Text属性有很多副作用。你可以在屏幕上看到它。

要间接调用方法,您需要另一辆车,您需要代表。非常类似于C中的函数指针。任何关于.NET编程的介绍性书籍都会解释它们。您可以声明自己的委托类型,但更喜欢内置.NET框架的通用类型。添加对System.Core的引用,以便可以使用通用动作<>委托类型。你需要先写来分配Text属性的方法:

private: 
    void updateTextBox(String^ text) { 
     textBox1->Text = text; 
    } 

这将有这样的样品的方法进行更新:

void Test(Action<String^>^ updater) { 
     updater("foo"); 
    } 

,并注意有这种方法可以更新任何文本框中,您通过的委托对象决定哪个。您的代码创建委托变量是这样的:

Test(gcnew Action<String^>(this, &Form1::updateTextBox)); 
+0

好的,我明白了。非常感谢你 ! – Jozekban 2013-04-21 18:55:45