C# 将文本框中的数据保存到文本文件中

C# 将文本框中的数据保存到文本文件中,c#,wpf,winforms,C#,Wpf,Winforms,我正在尝试将文本框中的数据保存到文本文件中。我有一些文本框,所以我想知道是否有其他方法可以做到这一点,而不是必须命名所有的文本框 以下是我所拥有内容的简化版本: string slog = @"StockLog.txt"; StreamWriter raw_data = new StreamWriter(slog, true); raw_data.WriteLine( txt_count.Text + "," + date_log.Text + "," + txt_ke

我正在尝试将文本框中的数据保存到文本文件中。我有一些文本框,所以我想知道是否有其他方法可以做到这一点,而不是必须命名所有的文本框

以下是我所拥有内容的简化版本:

string slog = @"StockLog.txt";

StreamWriter raw_data = new StreamWriter(slog, true);
raw_data.WriteLine(
    txt_count.Text + ","
    + date_log.Text + ","
    + txt_key.Text + ","
    + txt_pn.Text + ","
    + txt_desc.Text);

raw_data.Close();

我正在考虑为它创建一个类,因为它可以被多个页面使用。在wpf和winforms中都尝试此功能。如有任何意见,将不胜感激。提前谢谢

首先在要保存文本框值的每个窗口中为主网格指定一个名称,并使用此方法帮助您

        string getValuesFromAllTextBox(Grid someGrid)
        {
          string WindowValues="";
          foreach (var item in someGrid.Children)
          {
              if (item is TextBox)
              {
                WindowValues +=((TextBox)item).Text+",";
              }
          }
          if(WindowValues !="")
          WindowValues = WindowValues.TrimEnd(',');

          return WindowValues;
        }
对于Winforms:

  • 创建StringBuilder对象
  • 执行Foreach(Form.Controls中的var ctrl)
  • 如果ctrl为TextBox-将文本属性附加到stringbuilder对象
  • 如果是容器控件(即GroupBox或Panel)-对ctrl.控件重复步骤2-4(而不是步骤2中的表单)
  • 最后,您将在字符串生成器中拥有所有文本框文本。随心所欲地使用它。
    您可以创建一个单独的类来重用此代码。只需将类/窗体对象传递给方法。

    应考虑用递归迭代控件。

    public string Parse(Control MainControl)
    {
       string Result = "";
       foreach (var Ctrl in MainControl.Controls)
       { 
          if (Ctrl.GetType() == TypeOf(TextBox))
          {
              Result += (TextBox)Ctrl.Text + ",";
          }
          if (Ctrl.Controls.Count > 0)
          {
              Result += Parse(Ctrl);
          }
       }
       return Result;
    }
    

    可以使用递归获取窗体上的所有控件,包括容器中的控件。您可以对其使用扩展方法:

    public static class ControlExtension
    {
      public static IEnumerable<Control> GetControls<Control>(this IEnumerable<Control> parent,
            Func<Control, IEnumerable<Control>> childrenSelector)
       {              
            foreach (Control item in parent)
            {
              // Yield parent items
              yield return item;
    
              // Yield all of the children.
              foreach (Control child in childrenSelector(item).GetControls(childrenSelector))
              {                  
                  yield return child;
              }
            }
       }
    }
    
    公共静态类ControlExtension
    {
    公共静态IEnumerable GetControls(此IEnumerable父级,
    Func儿童选择器)
    {              
    foreach(父项中的控制项)
    {
    //生成父项
    收益回报项目;
    //让出所有的孩子。
    foreach(childrenSelector(项)中的控件子项.GetControls(childrenSelector))
    {                  
    退换子女;
    }
    }
    }
    }
    
    然后可以使用extension方法递归获取所有控件,然后按所需类型进行筛选:

    var allControls = this.Controls.Cast<Control>().GetControls(x => x.Controls.Cast<Control>());
    var onlyTextBoxes = allControls.OfType<TextBox>();
    
    var allControls=this.Controls.Cast().GetControls(x=>x.Controls.Cast());
    var onlytextboxs=allControls.OfType();
    

    然后,您可以使用它来编写输出。

    确定这会保存它-但是在读回它时-如果任何值中有逗号怎么办?无论你做什么,你都必须给这些文本框命名——否则你如何从它们那里获取数据,即使它们是a、b、c、d、e、f等。CI确保任何文本框中都有逗号,你想保存表单上的所有文本框还是只保存指定的文本框?@Riv表单中的所有文本框:)我有一堆文本框,所以我决定不在上面的示例代码中包含所有你知道这是网格的地方?WPF中的每个窗口都有网格如果文本框不在网格中,请替换用你正在使用的容器项进行网格,如果容器有具有控件的容器怎么办?@Riv他应该使用递归,而不是在第4页检查类型。@Michal-是的,我相信nik会考虑清楚的。p.S。不确定相同的解决方案是否适用于WPF和WinForms。