我有一个列表框,其填充方法为
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
中有文件名。如果我想传递整个文件夹路径,我该怎么做?
答案 0 :(得分: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
}
您应该注意的一件事是设置ListBox的DisplayMember
属性,如下所示:
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
}
}