加载dataGridView XML会向网格添加新列

时间:2013-07-16 13:37:00

标签: c# datagridview

我有一个通过Visual Studio创建的dataGridView。

enter image description here

然后我有一个save方法,它将表复制到DataSet,然后将其保存到XML:

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加载回来并将其映射到表结构中的现有列?如果需要,可以在加载整个表时将其清除。

1 个答案:

答案 0 :(得分: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();