1

テキスト ファイルを参照する一連のファイル名を表示するリスト ボックスがあります。フルパスを表示するのは見栄えが悪いと思うのでPath.GetFileName、ディレクトリの部分を切り取っていました。

しかし、ユーザーが特定のファイル名を選択して開くと、パスが失われました。ファイルはローカル コンピューターのどこにでも配置できます (現時点では)。

素敵なファイル名を表示するだけでなく、実際のファイルへの参照もできるように、リスト ボックスを使用するにはどうすればよいですか?

編集: リスト ボックス項目ごとにカスタム ラッパー クラスを用意するというアイデアが気に入っています。

4

4 に答える 4

2

過去に行ったことは、ListBox に表示するオブジェクトのラッパー クラスを作成することです。このクラスToStringでは、ListBox に表示する文字列にオーバーライドします。

選択した項目の詳細を取得する必要がある場合は、それをラッパー クラスにキャストし、必要なデータを取得します。

これは醜い例です:

class FileListBoxItem
{
    public string FileFullname { get; set; }
    public override string ToString() {
        return Path.GetFileName(FileFullname);
    }
}

ListBox に FileListBoxItems を入力します。

listBox1.Items.Add(new FileListBoxItem { FileFullname = @"c:\TestFolder\file1.txt" })

次のように、選択したファイルの完全な名前を取得します。

var fileFullname = ((FileListBoxItem)listBox1.SelectedItem).FileFullname;

Edit
@ user1154664 は、元の質問に対するコメントで良い点を挙げています: 表示されたファイル名が同じ場合、ユーザーは 2 つの ListBox アイテムをどのように区別しますか?

次の 2 つのオプションがあります。

各 FileListBoxItem の親ディレクトリも表示する

これを行うには、ToStringオーバーライドを次のように変更します。

public override string ToString() {
    var di = new DirectoryInfo(FileFullname);
    return string.Format(@"...\{0}\{1}", di.Parent.Name, di.Name);
} 

ツールチップに FileListBoxItem のフル パスを表示する

これを行うには、ToolTip コンポーネントをフォームにドロップMouseMoveし、ListBox のイベント ハンドラーを追加して、ユーザーがマウスを重ねているFileFullnameプロパティ値を取得します。FileLIstBoxItem

private void listBox1_MouseMove(object sender, MouseEventArgs e) {
    string caption = "";

    int index = listBox1.IndexFromPoint(e.Location);
    if ((index >= 0) && (index < listBox1.Items.Count)) {
        caption = ((FileListBoxItem)listBox1.Items[index]).FileFullname;
    }
    toolTip1.SetToolTip(listBox1, caption);
}

もちろん、この 2 番目のオプションを最初のオプションと共に使用することもできます。

ListBox 内の ToolTip のソース(受け入れられた回答、私が好むフレーバーに再フォーマットされたコード)。

于 2012-08-08T22:17:23.577 に答える
1

ListBoxItem.TagWPFを使用している場合は、各アイテムのフルパスを格納するために使用します。または、WinFormsを使用している場合は、フルパスを格納するカスタムクラスを作成できますが、ファイル名のみが表示されるようにobject.ToString()をオーバーライドします。

class MyPathItem
{
    public string Path { get; set; }
    public override string ToString() 
    {
        return System.IO.Path.GetFileName(Path);
    }
}

...

foreach (var fullPath in GetFullPaths())
{
    myListBox.Add(new MyPathItem { Path = fullPath });
}
于 2012-08-08T22:10:14.947 に答える
1

個人的には、これがユーザーにとって醜いというあなたの意見には同意しません。フル パスを表示することで、明示的な詳細がユーザーに提供され、選択内容や実行内容に自信を持つことができます。

アイテム インデックスをキーとして使用Dictionaryし、このリスト アイテムのフル パスを値として使用します。

Dictionary<int, string> pathDict = new Dictionary<int, string>();
pathDict.Add(0, "C:\SomePath\SomeFileName.txt");
...

上記は、item.Tagプロパティを使用してここに移動するためのおそらく最良の方法です...

これが役立つことを願っています。

于 2012-08-08T22:15:15.870 に答える
1

私はこれをします

public class ListOption
{
   public ListOption(string text, string value)
   {
      Value = value;
      Text = text;
   }

   public string Value { get; set; }
   public string Text { get; set; }
}

次に、マイリストを作成します

List<ListOption> options = new List<ListOption>()
For each item in files
   options.Add(new ListOption(item.Name, item.Value));
Next

私のリストをバインドする

myListBox.ItemSource = options;

次に、値またはテキストを取得します

protected void List_SelectionChanged(...)
{
   ListOption option = (ListOption) myListBox.SelectedItem;
   doSomethingWith(option.Value);
}

ここでのアイデアだけが主なものです

于 2012-08-08T22:18:45.853 に答える