如何将表单数据保存为 XML 或 CSV?

Posted

技术标签:

【中文标题】如何将表单数据保存为 XML 或 CSV?【英文标题】:How to save form data to XML or CSV? 【发布时间】:2013-04-16 12:35:31 【问题描述】:

我们目前已经构建了一个同时使用文本框和组合框的应用程序。

我们想在我们已经构建的用户控件库中创建一个保存按钮,并让它将当前输入的所有数据保存到 XML 或 CSV 中。两者中较容易的一个会是首选,但我觉得它们很可能是相同的困难。

我正在使用 WPF!我想这样做,以便将数据存储到文件中。文件不需要发生任何惊人的事情,这只是保存来自不同文本框和组合框的数据,然后将它们存储在文档中的情况。

【问题讨论】:

它们都很简单。这是用于 WinForms 还是 Web 应用程序?我通过“表单”猜测您指的是 html 表单,然后这是一个网络应用程序,对吧? 我们正在使用 WPF 很抱歉造成混乱。 【参考方案1】:

好的,这里有一些东西可以尝试。首先,因为您使用的是 WPF,所以您需要一种方法来获取特定类型的控件。这是一个适合你的扩展方法:

public static class DependencyObjectExtensions

    public static IEnumerable<T> GetChildren<T>(this DependencyObject parent) where T : DependencyObject
    
        List<T> childControls = new List<T>();
        int count = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < count; i++)
        
            DependencyObject childControl = VisualTreeHelper.GetChild(parent, i);
            if (childControl is T)
            
                childControls.Add((T)childControl);
            
        
        return childControls;
    

接下来,您需要一种创建 CSV 的方法:

public string ToCsv(params IEnumerable<Control>[] controls)

    return ToCsv(true, controls);


public string ToCsv(bool outputColumnNames, params IEnumerable<Control>[] controls)

    var sb = new StringBuilder();

    if (outputColumnNames)
    
        foreach (var textBox in controls.OfType<TextBox>())
        
            sb.Append(textBox.Name);
            sb.Append(",");
        

        foreach (var comboBox in controls.OfType<ComboBox>())
        
            sb.Append(comboBox.Name);
            sb.Append(",");
        
        sb.Remove(sb.Length - 1, 1);
    

    sb.AppendLine();

    foreach (var textBox in controls.OfType<TextBox>())
    
        sb.Append(textBox.Text);
        sb.Append(",");
    

    foreach (var comboBox in controls.OfType<ComboBox>())
    
        sb.Append(comboBox.Text);
        sb.Append(",");
    
    sb.Remove(sb.Length - 1, 1);

    return sb.ToString();

最后......像这样使用它:

var textBoxes = grid.GetChildren<TextBox>();
var comboBoxes = grid.GetChildren<ComboBox>();
string csv = ToCsv(textBoxes, comboBoxes);

在上面,grid 在我的测试表单上定义如下:

<Grid Name="grid">

控件是它的子元素。希望对您有所帮助。

【讨论】:

【参考方案2】:

这是一个相当宽泛的问题,但总体而言,您必须将数据序列化为最终使用的任何格式(这取决于您以后打算如何处理数据:您将其发送到另一个需要以一种格式或另一种格式的客户?您只是保存数据以将其记录在案吗?)另外,请记住 CSV 是一个平面文件,即文件的每一行都是一行,每个逗号-分隔值在列中,而 XML 是分层格式,即树,如 HTML。这使得 CSV 更适合存储数据库行之类的东西,并使 XML 更适合存储分层的东西,比如对象图、文档布局等。所以它真的取决于你想要做什么(你可能想要添加更多详细说明您的问题,以获得更好的答案)。

【讨论】:

谢谢丹!从现在开始将尝试更好地表达问题。还是个 C# 新手 :)【参考方案3】:
private void btnSave_Click(object sender, EventArgs e)

    var lines = new List<string>();
    foreach (Control c in this.Controls)
    
        if (c is TextBox)
            lines.Add(string.Format("0,1", ((TextBox)c).Name, ((TextBox)c).Text));
        if (c is ComboBox)
            lines.Add(string.Format("0,1", ((ComboBox)c).Name, ((ComboBox)c).Text));
    
    System.IO.File.WriteAllLines(@"data.csv", lines);

对于 WPF:

助手:

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject

    if (depObj != null)
    
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        
            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
            if (child != null && child is T)
            
                yield return (T)child;
            

            foreach (T childOfChild in FindVisualChildren<T>(child))
            
                yield return childOfChild;
            
        
    

代码:

private void Button_Click_1(object sender, RoutedEventArgs e)

    var lines = new List<string>();
    foreach (TextBox tb in WindowHelper.FindVisualChildren<TextBox>(this))
        lines.Add(string.Format("0,1", tb.Name, tb.Text));
    foreach (ComboBox cb in WindowHelper.FindVisualChildren<ComboBox>(this))
        lines.Add(string.Format("0,1", cb.Name, cb.Text));
    System.IO.File.WriteAllLines(@"data.csv", lines);

【讨论】:

无需强制转换为 TextBoxComboBox.. 都继承自 Control 并且 TextName 属性都在该类上。 嘿乔伊!我们似乎无法让“控件”工作。它说找不到扩展方法(您是否缺少 using 指令或程序集引用)我们已经在使用“Using.System.Windows.Controls”命名空间。任何建议 Joey 用于 WinForms,而不是 WPF。 啊,好吧,有没有类似的方法可以在 WPF 中实现?

以上是关于如何将表单数据保存为 XML 或 CSV?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JSON/XML 将数据传递到使用 Selenium WebDriver 的表单

在javascript中将表单数据保存为xml时防止跨站点(XSS)

使用 Python 或 XSLT 将复杂的 XML 转换为 CSV

如何使用 PHP 在 MySQL 数据库中将纯文本 CSV 字段保存为 HTML?

如何将 Thingsboard 中的时间序列数据作为 CSV 或 JSON 文件保存到外部文件系统? [关闭]

如何将本地 csv 文件的内容保存到“硬编码”Pandas DataFrame 中?