我们目前已经构建了一个同时使用文本框和组合框的应用程序。
我们希望在我们已经构建的用户控件库中创建一个保存按钮,并将当前输入的所有数据保存为XML或CSV。这两个中较容易的人会更喜欢,但我觉得他们很可能是同样的困难。
我正在使用WPF!我想这样做,以便将数据存储到文件中。没有什么惊人的需要发生在文件,它只是从不同的文本框和组合框保存数据,然后只是将它们存储在文档中。
答案 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">
并且控件是其中的子项。希望这会对你有所帮助。