You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从TextBox修改TXT文件内容并保存至原文件或新文件

需求与解决方案

已实现功能

  • 将TXT文件每行的第二个元素(如100)加载到ComboBox控件中
  • 选择ComboBox中的选项时,TextBox显示所有对应行的第一个元素(如firstName)

需要新增功能

修改TextBox中的内容后,将原文件对应行的第一个元素替换为用户输入内容,支持保存到原文件或新文件,且保留文件原有格式。


TXT文件示例内容

firstName;;;100;;;0;

firstName;;;100;;;1;

firstName;;;100;;;2;

firstName;;;100;;;3;

firstName;;;0100;;;4;

firstName;;;0100;;;5;

firstName;;;0100;;;6;

firstName;;;0100;;;7;

lastName;;;0100;;;0;

lastName;;;0100;;;1;

lastName;;;0100;;;2;

lastName;;;0100;;;3;

lastName;;;0100;;;4;

lastName;;;0100;;;5;

lastName;;;0100;;;6;

lastName;;;0100;;;7;

预期输出示例

john;;;100;;;0;

Patrick;;;100;;;1;

firstName;;;100;;;2;

现有C# WinForms代码

namespace WindowsFormsApp8
{
    public partial class Form1 : Form
    {
        public string[] lines;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog openFileDialog = new OpenFileDialog())
            {
                openFileDialog.InitialDirectory = "c:\\";
                openFileDialog.Filter = "txt file (*.txt)|*.txt|All files (*.*)|*.*";
                openFileDialog.FilterIndex = 2;
                openFileDialog.RestoreDirectory = true;

                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    lines = File.ReadAllLines(openFileDialog.FileName);
                    List<string> result = new List<string>();
                    string[] par = new string[1];
                    par[0] = ";;;";
                    for (int i = 0; i < lines.Length; i++)
                    {
                        string[] row = lines[i].Split(par, StringSplitOptions.None);
                        if (row.Length > 2)
                        {
                            if (!result.Contains(row[1]))
                                result.Add(row[1]);
                        }
                    }
                    foreach (string line in result)
                    {
                        comboBox1.Items.Add(line);
                    }
                }
            }
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            var d = lines;
            var t = d.Where(g => g.Contains(comboBox1.Text));

            string allItems = "";
            foreach (string item in t)
            {
                string[] r = item.Split(new string[] { ";;;" }, StringSplitOptions.None);
                allItems += r[0] + Environment.NewLine;
            }
            textBox1.Text = allItems;
        }
    }
}

解决方案实现

步骤1:添加保存按钮

在WinForms设计界面中添加一个Button控件,命名为btnSave,设置其Text属性为"保存"。

步骤2:更新代码实现替换与保存功能

以下是完整的修改后代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApp8
{
    public partial class Form1 : Form
    {
        public string[] lines;
        private string currentFilePath; // 记录当前打开的文件路径

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog openFileDialog = new OpenFileDialog())
            {
                openFileDialog.InitialDirectory = "c:\\";
                openFileDialog.Filter = "txt file (*.txt)|*.txt|All files (*.*)|*.*";
                openFileDialog.FilterIndex = 2;
                openFileDialog.RestoreDirectory = true;

                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    currentFilePath = openFileDialog.FileName;
                    lines = File.ReadAllLines(currentFilePath);
                    List<string> result = new List<string>();
                    string[] par = new string[1];
                    par[0] = ";;;";
                    for (int i = 0; i < lines.Length; i++)
                    {
                        string[] row = lines[i].Split(par, StringSplitOptions.None);
                        if (row.Length > 2)
                        {
                            if (!result.Contains(row[1]))
                                result.Add(row[1]);
                        }
                    }
                    comboBox1.Items.Clear(); // 清空旧选项避免重复
                    foreach (string line in result)
                    {
                        comboBox1.Items.Add(line);
                    }
                }
            }
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(comboBox1.Text) || lines == null)
                return;

            var targetLines = lines.Where(g => g.Contains(comboBox1.Text)).ToList();
            string allItems = "";
            foreach (string item in targetLines)
            {
                string[] r = item.Split(new[] { ";;;" }, StringSplitOptions.None);
                allItems += r[0] + Environment.NewLine;
            }
            // 移除末尾多余的换行符
            textBox1.Text = allItems.TrimEnd(Environment.NewLine.ToCharArray());
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            // 校验前置条件
            if (lines == null || string.IsNullOrEmpty(comboBox1.Text))
            {
                MessageBox.Show("请先打开文件并选择ComboBox选项");
                return;
            }

            // 拆分TextBox中的输入为单行数组
            string[] newFirstElements = textBox1.Text.Split(
                new[] { Environment.NewLine }, 
                StringSplitOptions.RemoveEmptyEntries
            );
            // 获取当前选中ComboBox对应的所有行索引
            var targetLineIndices = lines
                .Select((line, index) => new { Line = line, Index = index })
                .Where(x => x.Line.Contains(comboBox1.Text))
                .Select(x => x.Index)
                .ToList();

            // 检查输入行数与目标行数是否匹配
            if (newFirstElements.Length != targetLineIndices.Count)
            {
                MessageBox.Show("输入的行数与目标行数不匹配,请检查");
                return;
            }

            // 克隆原数组避免直接修改
            string[] newLines = (string[])lines.Clone();
            const string splitSeparator = ";;;";

            // 遍历替换对应行的第一个元素
            for (int i = 0; i < targetLineIndices.Count; i++)
            {
                int lineIndex = targetLineIndices[i];
                string originalLine = newLines[lineIndex];
                string[] parts = originalLine.Split(new[] { splitSeparator }, StringSplitOptions.None);
                
                if (parts.Length > 0)
                {
                    parts[0] = newFirstElements[i].Trim(); // 去除输入前后空格
                    newLines[lineIndex] = string.Join(splitSeparator, parts);
                }
            }

            // 弹出保存对话框让用户选择保存路径
            using (SaveFileDialog saveFileDialog = new SaveFileDialog())
            {
                saveFileDialog.InitialDirectory = Path.GetDirectoryName(currentFilePath) ?? "c:\\";
                saveFileDialog.Filter = "txt file (*.txt)|*.txt|All files (*.*)|*.*";
                saveFileDialog.FilterIndex = 1;
                saveFileDialog.FileName = Path.GetFileName(currentFilePath); // 默认原文件名

                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    File.WriteAllLines(saveFileDialog.FileName, newLines);
                    MessageBox.Show("保存成功");

                    // 如果保存到原文件,更新lines数组
                    if (saveFileDialog.FileName.Equals(currentFilePath, StringComparison.OrdinalIgnoreCase))
                    {
                        lines = newLines;
                    }
                }
            }
        }
    }
}

核心功能说明

  • 文件路径记录:新增currentFilePath字段,记录当前打开的文件路径,方便保存时定位默认目录。
  • 输入校验:保存前检查必要条件,避免空操作或错误输入导致的异常。
  • 格式保留:通过拆分-替换-拼接的方式修改行内容,完全保留原文件的分隔符和行格式。
  • 灵活保存:支持覆盖原文件或保存为新文件,满足不同需求。

内容的提问来源于stack exchange,提问作者Denzar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:27:41