You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

实现文件夹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

火山引擎 最新活动