【问题标题】:How do you add a string to a Windows Form Label?如何将字符串添加到 Windows 窗体标签?
【发布时间】:2013-07-06 01:29:19
【问题描述】:

我试过这样做:

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

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

编译器给了我一个错误:

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

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

    return Blah[id];
}

【问题讨论】:

  • 你能显示 GetSomething 代码吗?
  • 你#include 了吗?
  • @RanEldan 我刚刚这样做了,但出现了另一个错误:错误 C2664: 'System::Windows::Forms::ToolStripItem::Text::set' : cannot convert parameter 1 from 'std: :basic_string<_elem>' 到 'System::String ^'
  • @billz 我要编辑我的帖子。
  • 你使用命名空间标准了吗?

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


【解决方案1】:

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

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&lt;_Elem,_Traits,_Ax&gt; 转换为 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;

【讨论】:

  • @Jan 您还应该知道您正在混合字符集和编码。 .NET 在大多数类(特别是 System::String)中使用 Unicode/UTF-16,在某些类中使用 Unicode/UTF-8(例如 System.IO::Stream::StreamWriter(System::String ^)) .您的 C++ 代码正在使用 ANSI 代码页。当您“向上转换”为 Unicode 时,您必须知道源 ANSI 代码页将被正确确定。当您从 Unicode 进行“下转换”时,您必须知道您需要哪个 ANSI 代码页,并了解可能存在数据丢失。您可以选择在 C++ 中尽可能使用 Unicode。
【解决方案2】:

免责声明:我不是 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多