0

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

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

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

4

3 回答 3

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">

控件是它的孩子。希望这对您有所帮助。

于 2013-04-16T13:10:27.967 回答
0

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

于 2013-04-16T12:50:01.733 回答
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);
}
于 2013-04-16T12:45:25.660 回答