1

PathItem のセットを含むリスト ボックスがあります。ユーザーの好みに応じて、いくつかの異なるケースで ToString メソッドをオーバーライドしました。

これは基本的に、カスタム オブジェクトに含まれるファイル名のリストです。

class PathItem
{
    public static bool show_ext { get; set; }
    public static bool use_full_path { get; set; }
    public string filepath { get; set; }

    public override string ToString()
    {
        if (use_full_path)
            return filepath;
        else if (show_ext)
            return Path.GetFileName(filepath);
        else
            return Path.GetFileNameWithoutExtension(filepath);
    }
}

GUI には 2 つのチェックボックスがあります。1 つのチェックボックスにはファイル拡張子が表示され、別のチェックボックスにはファイルの絶対パスが表示されます。これらのいずれかをチェックすると、上記で定義された静的変数が更新されます。

チェックボックスを選択するたびに、ユーザーの選択を反映するようにリストボックスを更新したいと思います。

解決策は、ToString メソッドを再度呼び出して各項目の新しい値を取得することにより、リストボックスのすべての項目を更新することだと思いますが、これがどのように行われるかはわかりません。

また、これが本当かどうかはわかりませんが、

PathItem.show_ext = true;

PathItemこれはすべての既存のオブジェクトに適用されますか?

アップデート:

提案された方法を試した後Refresh、チェックボックスがチェックされていてもリストボックス内の文字列は更新されませんでした (ClickChanged で Refresh 呼び出しを開始します)。メソッド内に print ステートメントを書きましたToStringが、更新時にメッセージが出力されませんでした。

リスト ボックスでカスタム オブジェクトを使用しているためかどうかはわかりません。

これは、リストボックスにアイテムを追加する方法です

foreach (string filename in files)
    listBox1.Items.Add(new PathItem { filepath = filename });
4

2 に答える 2

4

興味深いことに、呼び出し

myListBox.Refresh()

含まれているオブジェクトで ListBox が ToString() を再評価することはありません。おそらく、値はどこかにキャッシュされています。

次のメソッドを使用して、ListBox に強制的に ToString() を再評価させることができます。ListBox (高速コンピューター) で 100 個を超えるアイテムでテストしたところ、視覚的なアーティファクトや遅延は見られませんでした。

    private void UpdateToString(ListBox listBox)
    {
        int count = listBox.Items.Count;
        listBox.SuspendLayout();
        for (int i = 0; i < count; i++)
        {
            listBox.Items[i] = listBox.Items[i];
        }
        listBox.ResumeLayout();
    }

また、

PathItem.show_ext = true;

*show_ext* は静的変数であるため、*show_ext* を参照するすべての PathItem インスタンスにすぐに影響します。そのクラスのすべてのインスタンス間で共有される値は、常に 1 つだけです。

于 2012-08-09T04:30:22.977 に答える