0

現在、テキスト ボックスとコンボ ボックスの両方を使用するアプリケーションを構築しています。

作成済みのユーザー コントロール ライブラリに保存ボタンを作成し、現在入力されているすべてのデータを XML または CSV に保存します。2 つのうち簡単な方が好まれますが、難易度は同じである可能性が高いと思います。

私はWPFを使用しています!データがファイルに保存されるようにしたいと思います。ファイルに特別なことを行う必要はありません。さまざまなテキスト ボックスやコンボ ボックスからデータを保存し、それらをドキュメント内に保存するだけです。

4

3 に答える 3

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 に答える
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 に答える