1

Visual Studio で作成した dataGridView があります。

ここに画像の説明を入力

次に、テーブルを DataSet にコピーしてから XML に保存する save メソッドがあります。

if (savefile.ShowDialog() == DialogResult.OK)
        {

            DataSet ds = new DataSet();
            DataTable dt = new DataTable("whereClause");
            ds.Tables.Add(dt);

            for (int i = 1; i < dataGridView1.Columns.Count + 1; i++)
            {
                DataColumn column = new DataColumn(dataGridView1.Columns[i - 1].Name);

                dt.Columns.Add(column);
            }
            int ColumnCount = dataGridView1.Columns.Count;
            foreach (DataGridViewRow dr in dataGridView1.Rows)
            {
                DataRow dataRow = dt.NewRow();
                for (int i = 0; i < ColumnCount; i++)
                {
                    dataRow[i] = dr.Cells[i].Value;
                }
                dt.Rows.Add(dataRow);
            }

            XmlTextWriter newXml = new XmlTextWriter(savefile.FileName, Encoding.UTF8);
            ds.WriteXml(newXml);
            newXml.Close();
        }

次に、一致するロード メソッドがあります。

 if (openfile.ShowDialog() == DialogResult.OK)
        {

            //Create xml reader
            XmlReader xmlFile = XmlReader.Create(openfile.FileName, new XmlReaderSettings());
            DataSet dataSet = new DataSet();
            //Read xml to dataset
            dataSet.ReadXml(xmlFile);

            dataGridView1.DataSource = dataSet.Tables["whereClause"];

            //Close xml reader
            xmlFile.Close();

        }

私の問題は、このデータが再度読み込まれると、テーブルの横に新しい列が作成され、既存のテーブル構造にデータが読み込まれないことです。DataSet.Merge を調べましたが、これを必要に応じて機能させるのに苦労しました。XML を読み込んで、テーブル構造の既存の列にマップするにはどうすればよいですか? 必要に応じて、ロード時にテーブル全体をクリアできます。

4

1 に答える 1

1

DataGridView AutoGenerateColumns のプロパティを false に設定します。

ただし、各列がバインドされるフィールドを手動で設定する必要があります。例えば:

<asp:GridView ID="gridView1" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="Forename" HeaderText="Column 1" /> <!-- state each column -->
    </Columns>
</asp:GridView>

コードビハインドの例:

        List<Customer> cu = new List<Customer>();
        cu.Add(new Customer() {  Forename = "Onam" });
        gridView1.DataSource = cu;
        gridView1.DataBind();

public class Customer
{
    public string Forename { get; set; }
}

または、次のようにすることもできます (AutoGenerateColumns = true を設定して):

gridView1.DataSource = null;
gridView1.DataBind();
gridView1.Columns.Clear();
gridView1.DataSource = dataSet.Tables["whereClause"];
gridView1.DataBind();
于 2013-07-16T13:39:34.953 に答える