4

私はリストボックスを持っていて、このメソッドによって値が設定されています。

private void ToReadFromExcel_Load(object sender, EventArgs e)
{
    string folderpath = @"\\gibson\users";
    // Call the method to show available files
    PopulateListBox(ExcelListBox, folderpath, "*.csv");
}

// To populate list box with csv files from given path
private void PopulateListBox(ListBox lsb, string Folder, string FileType)
{
    DirectoryInfo dinfo = new DirectoryInfo(Folder);
    FileInfo[] Files = dinfo.GetFiles(FileType);
    foreach (FileInfo file in Files)
    {
        lsb.Items.Add(file.Name);
    }
}

String strItem;
foreach (Object selecteditem in ExcelListBox.SelectedItems)
{
    strItem = selecteditem as String;
    MessageBox.Show(strItem);
}
// read csv file information and insert into detail table
string filepath = @"\\gibson\users\CampManager.csv";
StreamReader sr = new StreamReader(filepath);

ファイル パスをハード コードしましたが、リスト ボックスで選択したファイル パスを渡す必要があります。変数にファイル名がありますstritem。フォルダ パス全体を渡したい場合は、どうすればよいですか?

4

1 に答える 1

1

理想的な方法があります。FileInfoオブジェクトを追加する代わりに、オブジェクト自体Nameを追加する必要があります。FileInfoしたがって、後で、ファイル名だけでなく、そのオブジェクトに関連する任意の情報(たとえば、サイズ、親フォルダーなど)を取得できるようになります。このようにしてください:

// To populate list box with csv files from given path
private void PopulateListBox(ListBox lsb, string Folder, string FileType)
{
    DirectoryInfo dinfo = new DirectoryInfo(Folder);
    FileInfo[] Files = dinfo.GetFiles(FileType);
    foreach (FileInfo file in Files)
    {
        lsb.Items.Add(file); //<-- note here
    }
}

String strItem;
foreach (FileInfo selecteditem in ExcelListBox.SelectedItems)
{
     StreamReader sr = new StreamReader(selecteditem.FullName);
     //or whatever
}

ここで注意する必要があることの1つDisplayMemberは、ListBoxのプロパティを次のように設定することです。

ExcelListBox.DisplayMember = "Name";

これは、リストボックス内のオブジェクトのどのプロパティを表示するかを設定することです。だからここであなたFileInfo.Nameはあなたが望むものを選択します。これは通常、カスタムオブジェクトがWinFormsのリストボックスに追加される方法です。通常、文字列部分だけを追加するのではありません。と同様に、各オブジェクトに値を割り当てるために使用されるプロパティDisplayMemberもありValueMemberます。おそらくIDかそこらですが、あなたの場合は何もありません。

いくつかの提案、1).NET 4を使用している場合は、EnumerateFilesの代わりにを使用してGetFilesください。前者は怠惰であり、(事前にではなく)それらを列挙し始めたときにのみ結果が得られるため、より高速になるはずです。

foreach (FileInfo file in dinfo.EnumerateFiles(FileType)) //<-- note here
{
    lsb.Items.Add(file); 
}

2)usingファイルをロックしないため、句を使用してストリームリーダーを適切に破棄します。を利用することは常に良い習慣ですusing。手動で閉じて廃棄するよりも目に良いです!このように:

foreach (FileInfo selecteditem in ExcelListBox.SelectedItems)
{
     using(StreamReader sr = new StreamReader(selecteditem.FullName))
     {
         //your code here
     }
}
于 2012-12-15T00:34:29.123 に答える