0

表示したい文字列とそのアイテムのIDを保持するクラスがあります。

ref class ListBoxItem {
private:
   int id;
   String ^ name;

public:
   ListBoxItem(int id, const char * name) { this->id = id; this->name = gcnew System::String(name); }
   virtual String ^ ToString() new { return name; }
};

そして、次のように各項目を ListBox に追加します。

for(list<string>::iterator i = listItems.begin(); i != listItems.end(); i++)
   listBoxItems->Items->Add(gcnew ListBoxItem(2, (*i).c_str()));

これListBoxにより、正しい数のアイテムが生成されますが、すべてのアイテムは「ListBoxItem」と呼ばれます。

代わりに、でメソッドが呼び出されListBoxたときに生成される文字列を表示する必要があります。ToStringListBoxItem

4

1 に答える 1

2

WinForms と WPF のどちらを使用しているかはわかりませんでしたが、この回答はどちらにも有効だと思います。

(注:フレームワークにはListBoxItemという名前のクラスがあります。別のクラス名を選択することもできます。)

問題はここにあると思います:

virtual String ^ ToString() new { return name; }
                            ^^^

これは、Object.ToString メソッドとは何の関係もない、まったく新しい ToString メソッドを作成していることを意味します。ListBox が ToString を呼び出すとき、クラス定義がないため、変更していない Object.ToString() を呼び出すだけです。

これに切り替えると、うまくいくはずです:

virtual String ^ ToString() override { return name; }
                            ^^^^^^^^
于 2013-03-27T21:58:38.950 に答える