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

时间:2013-04-16 12:35:32

标签: c# xml csv wpf-controls save

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

我们希望在我们已经构建的用户控件库中创建一个保存按钮,并将当前输入的所有数据保存为XML或CSV。这两个中较容易的人会更喜欢,但我觉得他们很可能是同样的困难。

我正在使用WPF!我想这样做,以便将数据存储到文件中。没有什么惊人的需要发生在文件,它只是从不同的文本框和组合框保存数据,然后只是将它们存储在文档中。

3 个答案:

答案 0 :(得分:0)

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);
}

答案 1 :(得分:0)

这是一个非常广泛的问题,但总的概述是你必须将数据序列化为你最终使用的格式(这取决于你打算稍后对数据做什么:你是是以一种格式还是另一种格式将其发送给需要它的其他客户?您只是保存数据以将其记录在案吗?)另外,请记住CSV是一个平面文件,即文件的每一行都是一行,每个逗号分隔的值都在一列中,而XML是一种分层格式,即树,如HTML。这使得CSV更适合存储数据库行等内容,并使XML更好地存储分层内容,如对象图,文档布局等。所以它实际上取决于您尝试做什么(并且您可能希望在问题中添加更多细节以获得更好的答案。)

答案 2 :(得分:0)

好的,这是尝试的东西。首先,因为您正在使用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">

并且控件是其中的子项。希望这会对你有所帮助。