如何从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
相关产品推荐
相关产品推荐

