实现文件夹txt/lua文件列表展示及双击读取内容至RichTextBox
没问题,我来帮你搞定这个ListBox双击读取文件内容到RichTextBox的功能,下面是具体的实现方案和优化建议:
实现ListBox双击读取文件内容的完整方案
第一步:先优化文件夹选择的代码(关键!)
你原来的代码只把文件名添加到ListBox,但双击时需要知道文件的完整路径才能读取内容。我给你调整一下,让ListBox存储文件的完整路径,但显示文件名,这样既不影响视觉效果,又能在双击时拿到正确的文件路径:
1.1 给ListBox添加格式处理
在窗体的构造函数或者Load事件里添加这段代码(或者直接在设计器里开启FormattingEnabled属性,然后绑定Format事件):
public YourFormName() { InitializeComponent(); // 开启ListBox的格式化功能 listBox1.FormattingEnabled = true; // 绑定格式事件,把完整路径转换成文件名显示 listBox1.Format += ListBox1_Format; } // 实现格式事件,只显示文件名 private void ListBox1_Format(object sender, ListControlConvertEventArgs e) { e.Value = Path.GetFileName(e.Value.ToString()); }
1.2 修改文件夹选择时的添加项逻辑
把你原来的selectFolderToolStripMenuItem_Click方法里添加文件的部分改成这样(顺便删掉没用的for循环):
private void selectFolderToolStripMenuItem_Click(object sender, EventArgs e) { using (var fbd = new FolderBrowserDialog()) { DialogResult result = fbd.ShowDialog(); if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath)) { // 一次性获取所有txt和lua文件(包含子目录),忽略大小写匹配扩展名 var targetFiles = Directory.EnumerateFiles(fbd.SelectedPath, "*.*", SearchOption.AllDirectories) .Where(s => s.EndsWith(".txt", StringComparison.OrdinalIgnoreCase) || s.EndsWith(".lua", StringComparison.OrdinalIgnoreCase)); // 清空ListBox再添加新文件 listBox1.Items.Clear(); foreach (var file in targetFiles) { listBox1.Items.Add(file); // 添加完整路径,格式事件会自动显示文件名 } // 提示找到的文件数量 MessageBox.Show($"已找到可用文件:{listBox1.Items.Count} 个", "完成", MessageBoxButtons.OK, MessageBoxIcon.Information); } } }
第二步:添加ListBox双击事件
有两种方式添加双击事件:
- 可视化操作:选中ListBox,在右侧属性窗口的「事件」标签里找到
DoubleClick,双击它自动生成事件处理方法。 - 代码绑定:在窗体构造函数里加上这句:
listBox1.DoubleClick += ListBox1_DoubleClick;
第三步:实现双击读取文件的逻辑
在生成的ListBox1_DoubleClick方法里写读取文件并显示的代码:
private void ListBox1_DoubleClick(object sender, EventArgs e) { // 先判断有没有选中项 if (listBox1.SelectedItem == null) { MessageBox.Show("请先选中一个文件", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } try { // 获取文件的完整路径 string filePath = listBox1.SelectedItem.ToString(); // 读取文件内容(这里用UTF-8编码,你可以根据实际情况调整) string fileContent = File.ReadAllText(filePath, Encoding.UTF8); // 把内容显示到RichTextBox richTextBox1.Text = fileContent; } catch (Exception ex) { // 处理可能的异常(比如文件被占用、权限不足等) MessageBox.Show($"读取文件失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
额外的小优化
- 我把原来两次调用
Directory.GetFiles的逻辑改成了一次EnumerateFiles,效率更高,还支持忽略大小写匹配扩展名。 - 删掉了你原来代码里那个多余的
for循环(就是末尾带分号的那个,它会导致后面的代码逻辑出错)。
内容的提问来源于stack exchange,提问作者Devansh Tayal




