3

C#のcheckedListBoxに追加できるオブジェクトをいくつか用意し、オブジェクトがリストに表示される独自の文字列を生成できるようにしたいと考えています。Visual Basic でやりたいことの例を見つけました。

しかし、C# でそれを行う方法がわかりません。私は自分のクラスを実装しようとしました:

public class Device  {
    String s;

    public Device() {
        s = new String("test".ToCharArray());

    }

    public String toString() {
        return s;
    }
}

しかし、実行すると、テストではなく、リストに「WindowsFormsApplication2.Device」が表示されます。

任意の提案をいただければ幸いです。

ありがとう、レザ

ps チェックリストボックスの各エントリのテキストと進行状況バーを表示することは可能でしょうか?

4

4 に答える 4

5

Object.ToString()仮想メソッドを正しくオーバーライドしていません:

  1. method-name のスペルが間違っています (C# では大文字と小文字が区別されます)。
  2. メソッドのoverride修飾子がありません。これは、仮想メソッドをオーバーライドするときに必要です。

このようにしてください:

public override string ToString()
{
    return s;
}
于 2011-09-04T11:13:44.963 に答える
1

toString メソッドを次のようにします。

public override string ToString(){
    return s;
}
于 2011-09-04T11:15:03.147 に答える
1

toStringthe_ajp は、実際の問題はPascalCase である必要があるのにcamelCase であることを正しく指摘しましたToString

public override String ToString() {
    return s;
}

また、C# をコーディングするときに Java の例を見ないでs = new String("test".ToCharArray());くださいs = "test";

于 2011-09-04T11:15:09.257 に答える
0

あなたはすでに答えを持っていますが、ここで私が使うのが好きなトリックがあります. モデルで ToString() メソッドを使用するのが気に入らないのは、ビジネスとビュー ロジックが混在していることです。

代わりに、モデル オブジェクトへの参照を保持し、独自の ToString メソッドを提供するラッパー クラス (Adapter デザイン パターン) を作成します。これを無名関数と組み合わせて、表示される文字列を正確に取得する方法を指定できます (異なるリスト ボックスにわずかに異なる文字列を表示したい場合があります)。

ラッパー クラスは次のようになります。

class ListBoxWrapper<T>
{
    private T obj;
    private Func<T, string> stringFunction;

    public ListBoxWrapper(T obj, Func<T, string> stringFunction)
    {
        this.obj = obj;
        this.stringFunction = stringFunction;
    }

    public override string ToString()
    {
        return stringFunction(obj);
    }
}

モデルの ToString() を単純に使用するには、次のようにします。

ListBox.Items.Add(new ListBoxWrapper<Device>(device, dev => dev.ToString()));

ただし、次のこともできます(たとえば):

ListBox.Items.Add(new ListBoxWrapper<Device>(device, dev => dev.SerialNumber.ToString()));

これをより便利にするために、オブジェクトを自動的にラップする ListBox または CheckedListBox から派生した独自のクラスを作成できます。そうすれば、文字列関数を個々の項目ではなく ListBox に格納することもできます。

于 2011-09-04T12:44:40.510 に答える