0

C# と .Net を使用して XML に情報を保存しようとしていますが、ボタンクリック イベントを使用して XML に書き込んで "送信" した最後の情報のみです。以前に入力した内容が上書きされます。

これはコードです:

private void lagre_Click(object sender, EventArgs e)
    {

        DataTable dt = new DataTable();

        DataColumn dc1 = new DataColumn("Fullt navn");
        DataColumn dc2 = new DataColumn("Start dato");
        DataColumn dc3 = new DataColumn("Antall dager");

        dt.Columns.Add(dc1);
        dt.Columns.Add(dc2);
        dt.Columns.Add(dc3);

        dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);

        DataSet ds = new DataSet();
        ds.Tables.Add(dt);
        ds.WriteXml("gjesteInfo.xml");


        gjesterutenrom.Items.Add(gjestenavnInput.Text);

        gjestenavnInput.Text = "";
        datoInnsjekk.Text = "";
        antallDager.Text = "";


    }

DataTable、DataColumn、および Dataset の構成をボタン イベントの外に配置しようとしましたが、XML にデータが格納されません。dt.rows.add などに問題があるのか​​もしれませんが、他に書き方がわかりません。何か案は?


これまでの努力に感謝します、RyanWH。:)私は今、あなたの提案をいじってみました。多分私は何かを誤解しましたが、これは私がしたことです:

private void InitDataTable()
    {
        dt = new DataTable();
        DataSet ds = new DataSet();
        ds.ReadXml("gjesteInfo.xml");
        dt = ds.Tables[0];


        if (dt.Columns == null){
       DataColumn dc1 = new DataColumn("Fullt navn");
       DataColumn dc2 = new DataColumn("Start dato");
       DataColumn dc3 = new DataColumn("Antall dager");

        dt.Columns.Add(dc1);
        dt.Columns.Add(dc2);
        dt.Columns.Add(dc3);
        }

        ds.WriteXml("gjesteInfo.xml");

    }



    private void lagre_Click(object sender, EventArgs e)
    {

        InitDataTable();

        dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);

        gjesterutenrom.Items.Add(gjestenavnInput.Text);

        gjestenavnInput.Text = "";
        datoInnsjekk.Text = "";
        antallDager.Text = "";


    }

これにより、同じ結果が得られます。XML ファイルの古いコンテンツを上書きします。

4

4 に答える 4

1

David Sが提案したMergingを使用して解決しました。

これが私がしたことです:

    DataTable dt;

    private void InitDataTable()
    {
        dt = new DataTable();
        DataSet ds = new DataSet();
        ds.ReadXml("gjesteInfo.xml");
        ds.Tables.Add(dt);

        DataColumn dc1 = new DataColumn("Fullt navn");
        DataColumn dc2 = new DataColumn("Start dato");
        DataColumn dc3 = new DataColumn("Antall dager");

        dt.Columns.Add(dc1);
        dt.Columns.Add(dc2);
        dt.Columns.Add(dc3);

        dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);

        ds.Merge(dt); //Merging the dataset with the table and preventing it to be overwritten

        ds.WriteXml("gjesteInfo.xml");

    }



    private void lagre_Click(object sender, EventArgs e)
    {

        InitDataTable();

        dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);

        gjesterutenrom.Items.Add(gjestenavnInput.Text);

        gjestenavnInput.Text = "";
        datoInnsjekk.Text = "";
        antallDager.Text = "";


    }
于 2013-04-19T09:26:05.697 に答える
0

私の理解が正しければ、ボタンを押したときに DataTable に情報を追加しますか? 最初の行であるテーブルの宣言は、おそらく「gjestenavnInput」変数が宣言されている場所で、クラス全体に対して定義する必要があります。

    DataTable dt;

これにより、ボタン関数がこのデータ テーブルを参照できるようになり、プログラムの実行中にテーブルを永続化することもできます。

次に、コンストラクター/初期化でこれらの行を使用して、テーブルを作成し、列を設定します。

    dt = new DataTable();

    DataColumn dc1 = new DataColumn("Fullt navn");
    DataColumn dc2 = new DataColumn("Start dato");
    DataColumn dc3 = new DataColumn("Antall dager");

    dt.Columns.Add(dc1);
    dt.Columns.Add(dc2);
    dt.Columns.Add(dc3);

現在のコードは、ボタンをクリックするたびに、0 列と 0 行の新しい DataTable を作成しています。次に、3 つの列を作成してテーブルに追加します。最後に、テーブルに行を 1 つ追加します。すべてのテーブル操作の後、テーブルを XML に書き込みます。この時点で、テーブルが認識しているのは次のことだけです。3 つの列と 1 つの行があります。次に、フィールドを空の文字列にリセットします。

関数の最後で、DataTable オブジェクトは範囲外になり、削除されます。つまり、次にボタンをクリックすると、まったく同じことが起こります。列が 0、行が 0 のテーブルが作成され、3 つの列が追加されます。 1 行が追加され、XML に書き込まれ、フィールドを空の文字列にリセットします。

2 回目の編集

以下の更新されたコードの一部を変更しました。お役に立てれば。

private void InitDataTable()
{
    dt = new DataTable();
    DataSet ds = new DataSet();
    ds.ReadXml("gjesteInfo.xml");

    DataTableCollection tables = ds.Tables;

    if (0 == tables.Count){
        DataColumn dc1 = new DataColumn("Fullt navn");
        DataColumn dc2 = new DataColumn("Start dato");
        DataColumn dc3 = new DataColumn("Antall dager");

        dt.Columns.Add(dc1);
        dt.Columns.Add(dc2);
        dt.Columns.Add(dc3);
    }
    else 
    {
        dt = tables[0];
    }
}

private void lagre_Click(object sender, EventArgs e)
{

    InitDataTable();

    dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);

    gjesterutenrom.Items.Add(gjestenavnInput.Text);

    DataSet ds = new DataSet();
    ds.Tables.Add(dt);
    ds.WriteXml("gjesteInfo.xml");

    gjestenavnInput.Text = "";
    datoInnsjekk.Text = "";
    antallDager.Text = "";


}
于 2013-04-18T17:33:22.690 に答える
0

最初に既存のデータを読み取り、追加してから書き込む必要があります。簡単に言うと:

dt.ReadXml();
dt.AddRow(...);
dt.WriteXml();

XML ファイルは単なるテキスト ファイルです。途中には書き込めません。

于 2013-04-19T14:59:03.563 に答える