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对象。因此,稍后您将能够检索与该对象相关的任何信息,在您的情况下说大小、父文件夹等,而不仅仅是文件名。像这样做:NameFileInfo

// 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
}

您应该在这里注意的一件事是DisplayMember像这样设置 ListBox 的属性:

ExcelListBox.DisplayMember = "Name";

这样做是为了设置应该显示列表框中对象的什么属性。所以在这里你选择FileInfo.Name你想要的。这就是通常将自定义对象添加到 WinForms 中的 ListBoxes 的方式。您通常不会只添加它的字符串部分。类似于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 回答