如何将字符串添加到Windows窗体标签?

时间:2013-07-06 01:29:19

标签: .net string winforms c++-cli stdstring

我尝试这样做:

this->Label1->Text = "blah blah: " + GetSomething();

其中GetSomething()是一个返回字符串的函数。

编译器给了我一个错误:

  

“错误C2679:二进制'+':找不到哪个运算符采用'std :: string'类型的右手操作数(或者没有可接受的转换)”

string GetSomething()
{
    int id = 0;
    string Blah[] = {"test", "fasf", "hhcb"};

    return Blah[id];
}

2 个答案:

答案 0 :(得分:4)

问题是你在这里至少有两个不同的字符串类。

WinForms(您显然用于GUI)在任何地方使用.NET System::String class。因此Label.Text属性正在获取/设置.NET System::String对象。

您在问题中说GetSomething()方法返回std::string个对象。 std::string类基本上是C ++的内置字符串类型,作为标准库的一部分提供。

这两个课程都很好,很好地服务于各自的目的,但它们并不直接兼容。这就是(第二次尝试的)编译器消息试图告诉你的事情:

  

错误C2664:void System::Windows::Forms::Control::Text::set(System::String ^):无法将参数1从std::basic_string<_Elem,_Traits,_Ax>转换为System::String ^

用简单的英语重写:

  

错误C2664:无法将作为参数1传递的本机std::string对象转换为System::String属性所需的托管Control::Text对象

事实是,你真的不应该混合两种字符串类型。由于WinForms基本上强制它的字符串类型,这是我要标准化的,至少对于与GUI交互的任何代码。因此,如果可能,重写GetSomething()方法以返回System::String对象;例如:

using namespace System;

...

String^ GetSomething()
{
    int id = 0;
    array <String^>^ Blah = gcnew array<String^>{"test", "fasf", "hhcb"};
    return Blah[id];
}

...

// use the return value of GetSomething() directly because the types match
this->Label1->Text = "blah blah: " + GetSomething();

如果那是不可能的(例如,如果这是与您的GUI很少或没有任何关系的库代码),那么您需要explicitly convert one string type to the other

#include <string>  // required to use std::string

...

std::string GetSomething()
{
    int id = 0;
    std::string Blah[] = {"test", "fasf", "hhcb"};
    return Blah[id];
}

...

// first convert the return value of GetSomething() to a matching type...
String^ something = gcnew String(GetSomething().c_str());

// ...then use it
this->label1->Text = "blah blah: " + something;

答案 1 :(得分:0)

免责声明:我不是 C ++ / CLI向导。

我相信你正在寻找这样的东西:

String^ GetSomething()
{
    Int32 id = 0;
    array <String^>^ Blah = gcnew array<String^>{"test", "fasf", "hhcb"};
    return Blah[id];
}

您正在尝试混合使用CLI和非CLI代码。 Windows窗体使用CLI。不要使用std::string。而是使用System::String(我的代码假设您的代码顶部有using namespace System。您还会注意到我已将int替换为System::Int32,等效。

你的其余代码很好。我已将GetSomething()的呼叫置于回调按钮中:

private:
System::Void Button1_Click(System::Object^  sender, System::EventArgs^  e) 
{
    this->Label1->Text = "blah blah: " + GetSomething();
}