如何将表单数据保存为 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);
【讨论】:
无需强制转换为TextBox
或 ComboBox
.. 都继承自 Control
并且 Text
和 Name
属性都在该类上。
嘿乔伊!我们似乎无法让“控件”工作。它说找不到扩展方法(您是否缺少 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?