如何使用StreamWriter将所有TextBox内容批量写入TXT文本文件
实现方案
方案1:递归遍历窗体所有TextBox控件自动导出
该方案无需手动罗列任何控件名,会自动抓取当前窗体/指定容器内所有TextBox的内容:
首先新增递归获取TextBox的辅助方法:
// 递归获取指定容器内的所有TextBox控件 private List<TextBox> GetAllTextBoxes(Control container) { List<TextBox> textBoxes = new List<TextBox>(); foreach (Control control in container.Controls) { if (control is TextBox tb) { textBoxes.Add(tb); } // 若当前控件是Panel、GroupBox等容器,递归查找子控件 else if (control.HasChildren) { textBoxes.AddRange(GetAllTextBoxes(control)); } } return textBoxes; }
再修改你原有的写入逻辑即可:
SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Title = "Save Project Files"; saveFileDialog1.DefaultExt = "txt"; saveFileDialog1.FileName = "1"; saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; saveFileDialog1.FilterIndex = 2; saveFileDialog1.RestoreDirectory = true; string pdfPath = ""; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { // 传入this代表获取当前窗体所有TextBox,仅需要某个容器内的控件就传入对应容器的名称 List<TextBox> allTbs = GetAllTextBoxes(this); using(StreamWriter writer = new StreamWriter(saveFileDialog1.FileName)) { foreach (TextBox tb in allTbs) { writer.WriteLine(tb.Text); } } pdfPath = saveFileDialog1.FileName; }
方案2:自定义导出顺序+过滤无需导出的控件
如果需要避免导出无关输入框、或固定导出顺序,可以给需要导出的TextBox的Tag属性设置序号,比如项目名输入框Tag设为1、客户名输入框Tag设为2,遍历的时候按Tag排序即可,修改遍历逻辑如下:
List<TextBox> allTbs = GetAllTextBoxes(this) // 仅保留Tag为数字的TextBox,过滤不需要导出的控件 .Where(tb => int.TryParse(tb.Tag?.ToString(), out _)) // 按Tag的数值排序,保证导出顺序符合需求 .OrderBy(tb => int.Parse(tb.Tag.ToString())) .ToList();
方案3:极简列表预定义(适合不想修改控件属性的场景)
如果不想调整控件属性,只需提前定义一次待导出的控件列表,不需要单独给每个控件写写入逻辑:
// 仅需要在这里定义一次要导出的控件,后续新增控件只要往列表里加一行即可 List<TextBox> exportTbs = new List<TextBox> { Tb_ProjectName, tb_ClientName, tb_ProjectPic, tb_AgencyName, tb_AgencyLogo, tb_ContractorName, tb_ContractorLogo }; // 写入时直接循环即可 using(StreamWriter writer = new StreamWriter(saveFileDialog1.FileName)) { foreach (var tb in exportTbs) { writer.WriteLine(tb.Text); } }
内容的提问来源于stack exchange,提问作者Usama Khan
相关产品推荐
相关产品推荐

