我所拥有的是从代码填充的组合框:
InitializeComponent();
DirectoryInfo dinfo = new DirectoryInfo(@"K:\ases");
FileInfo[] Files = dinfo.GetFiles("*.ssi", SearchOption.AllDirectories);
foreach (FileInfo file in Files)
{
comboBox1.Items.Add(file.Name);
}
然后我尝试从所选项目中读取ReadAllText。
string contents = File.ReadAllText(comboBox1.Text);
执行时,它会尝试从语言环境路径中读取文件,当然文件不在那里。我也无法设置工作目录,因为comoboBox是从大量子目录填充的。如何在没有向用户公开整个目录路径的情况下获取在组合框中选择的项目的工作目录?
随时欢迎任何帮助
我以为我看到了一些人建议私人隐藏在一个combox框中的东西的答案,这些建议被删除了。有没有办法将完整的文件信息保存在组合框中,只显示文件名?
答案 0 :(得分:2)
有几种不同的方法可以实现这一点,但绝对最简单的方法是将目录路径存储在实例变量中(我们称之为directoryPath
)并使用System.IO.Path.Combine()
重建路径:
(为简洁起见,删除了一些代码)
public class Form1 : Form
{
private string directoryPath;
public Form1()
{
InitializeComponent();
DirectoryInfo dinfo = new DirectoryInfo(@"K:\ases");
FileInfo[] Files = dinfo.GetFiles("*.ssi", SearchOption.AllDirectories);
foreach (FileInfo file in Files)
{
comboBox1.Items.Add(file.Name);
}
directoryPath = dinfo.FullName;
}
private void YourFunction()
{
string contents = File.ReadAllText(System.IO.Path.Combine(directoryPath, comboBox1.Text);
}
}
您也可以尝试将FileInfo
添加到ComboBox
而不是文件名,然后使用SelectedItem
而不是Text
:
InitializeComponent();
DirectoryInfo dinfo = new DirectoryInfo(@"K:\ases");
comboBox1.DataSource = dinfo.GetFiles("*.ssi", SearchOption.AllDirectories);
comboBox1.DisplayMember = "Name";
然后你可以这样做来检索文件:
FileInfo file = (FileInfo)comboBox1.SelectedItem;
string contents = File.ReadAllText(file.FullName);
答案 1 :(得分:0)
而不是:
comboBox1.Items.Add(file.Name);
做的:
comboBox1.Items.Add(file.FullName);
这将为您提供文件的完整路径以便阅读。
有关详细信息和其他要使用的属性,请参阅FileInfo。
答案 2 :(得分:0)
我认为最好的方法是为项目使用特殊课程:
class FileInfoItem {
public FileInfoItem(FileInfo info) {
Info = info;
}
public FileInfo Info { get; set; }
public override string ToString() {
return Info.Name;
}
}
要在组合框中添加项目,请使用以下代码:
comboBox1.Items.Add(new FileInfoItem(file));
ComboBox将显示项目的ToString()值,您也可以使用以下方法获取原始FileInfo:
((FileInfoItem)comboBox1.SelectedItem).Info;