0

ファイル名が必要なリストボックスがあります。ダブルクリックすると開くことができます。私の問題は、ファイルを「ファイル」( List) に取得し、それらを「 files[randomchoose].name」で listboxt に追加すると、 Process.Start(((FileInfo)listBox1.SelectedItem).FullName); で開くことができないことです。リストボックスにフルパスを追加すると機能します。しかし、リストボックスにはファイル名だけが必要です。

私が試したこと:

         List<FileInfo> filepaths= new List<FileInfo>();
                   ....
           public void GetFiles(string dir)
    {
          foreach (string ft in filetypes)
              { 
            foreach (string file in Directory.GetFiles(dir, string.Format("*.{0}", ft), SearchOption.TopDirectoryOnly))
            {
                files.Add(new FileInfo(file));
                   }

               ....                                   
      filepaths.Add(files[randomchoose]);
       .......
        listBox1.DataSource=filepaths;

          .....
              Process.Start((filepaths[listBox1.SelectedIndex]))

しかし、filepaths[] 名を listBox1.DataSource に割り当てることはできません。また、 Process.Start((filepaths[listBox1.SelectedIndex])) は機能しません。

4

2 に答える 2

0

WPF の使用を検討することをお勧めします。

WPFを使用すると、ListBoxItemにFileInfo.Nameプロパティのみを表示するように指示する独自のDataTemplateを作成できますが、「背後」には必要なFullPathプロパティが設定されており、すぐに使用できます...

さらに、SelectedItem を定義できるため、GUI での選択が完了するとすぐに、必要なオブジェクトが「自動的に」インスタンス化されます。そのため、多くのコーディング作業を行わなくてもダブルクリックを実装できます。

ここでのサンプル実装(申し訳ありませんが、すばやく、汚く、醜い...しかし...)は、必要に応じて機能します。

XAML (CAVE: ListBox.ItemTemplate で、ListBoxItem の DataTemplate として TextBlock にプロパティ名を表示すること、および選択した要素がメイン ウィンドウのプロパティにバインドされていることを伝えています):

<Window x:Class="ListBoxFiles.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <ListBox ItemsSource="{Binding FileList, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}"
             SelectedItem="{Binding CurrentFile, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}"
             MouseDoubleClick="ListBox_MouseDoubleClick">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>

    </ListBox>
    <Button Click="Button_Click" Content="browse" Grid.Row="1" Width="50" Height="30"/>
</Grid>
</Window>

C# (CAVE: INotifyPropertyChanged を使用して、FileInfos のリストと CurrentFile をプロパティとして定義し、ダブルクリック イベントを処理します)。複数選択 FileOpenDialog を表示するシンプルなボタンを追加して、リストを埋めることができるようにしました...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
using Microsoft.Win32;
using System.IO;
using System.Diagnostics;

namespace ListBoxFiles
{
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnNotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    private List<FileInfo> _fileList;


    public List<FileInfo> FileList
    {
        get
        {
            return _fileList;
        }

        set
        {
            _fileList = value;
            OnNotifyPropertyChanged("FileList");
        }

    }

    private FileInfo _currentFile;

    public FileInfo CurrentFile
    {
        get
        {
            return _currentFile;
        }

        set
        {
            _currentFile = value;
            OnNotifyPropertyChanged("CurrentFile");
        }
    }



    public MainWindow()
    {
        InitializeComponent();
    }

    private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        //ListBox caller = (ListBox)sender;
        //FileInfo fi = (FileInfo)caller.SelectedItem;
        //Process.Start(fi.FullName);
        Process.Start(this.CurrentFile.FullName);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Filter = "All files (*.*)|*.*";
        ofd.Multiselect = true;
        bool dialogResult = (bool)ofd.ShowDialog();

        if (dialogResult)
        {
            this._fileList = new List<FileInfo>();
            FileInfo fi;
            foreach (string filename in ofd.FileNames)
            {
                fi = new FileInfo(filename);
                this._fileList.Add(fi);
            }

            OnNotifyPropertyChanged("FileList");
        }
    }
}
}
于 2013-10-11T20:30:27.800 に答える