将XML绑定到可编辑的DataGridView,允许加载和保存

时间:2009-07-27 19:18:49

标签: c# xml datagridview datasource

我有一个带有DataGridView的设置对话框和一个OK / Cancel按钮。打开对话框时,会提供一个可能存在或不存在的XML文件,并显示内容。无论文件是否存在,用户都必须能够修改DataGridView中每个单元格中的数据,同时还能够添加或删除行。单击“确定”按钮时,必须将DataGridView的内容导出到最初提供的XML文件中。

我现在已经搞错了好几个小时了,我似乎无法立刻解决所有这些要求。

我使用的一些类包括XmlDataDocument,List,DataSet,DataTable和BindingSource。

这是我当前的实现(失败)。需要注意的一点:我手动将所有列设置为ReadOnly = false。我可以添加新列,但我无法弄清楚如何允许删除列。

public partial class DefineAuctionRulesetDialog : Form
{
    private string _rulesetFile;
    private DataSet _dataSet;

    public DefineAuctionRulesetDialog(string rulesetFile)
    {
        this.Text = "Define Auction Ruleset: " + rulesetFile;
        _rulesetFile = "auctions\\" + rulesetFile + ".xml";
        InitializeComponent();

        _dataSet = new DataSet("AuctionRuleset");
        LoadRulesFromFile();
    }


    private void LoadRulesFromFile()
    {
        List<AuctionRules> rules = new List<AuctionRules>();

        if (System.IO.File.Exists(_rulesetFile))
        {
            _dataSet.ReadXml(_rulesetFile);
        }

        dgvRules.DataSource = _dataSet;
        //dgvRules.DataMember = "AuctionRule"; can't do this unless the file exists (the dataset needs data)

    }

    private void SaveRulesToFile()
    {
        if (dgvRules.DataSource != null)
        {
            _dataSet = (DataSet)(dgvRules.DataSource); //setting it to itself?
            _dataSet.WriteXml(_rulesetFile);
        }
    }

    private void btnOK_Click(object sender, EventArgs e)
    {
        SaveRulesToFile();
        DialogResult = DialogResult.OK;
    }

    private void btnCancel_Click(object sender, EventArgs e)
    {
        DialogResult = DialogResult.Cancel;
    }
}

1 个答案:

答案 0 :(得分:1)

我将如何做到这一点:

  1. 创建具有类范围的DataTable。
  2. 在表单构造函数中添加特定列。将DataGridView.DataSource设置为等于此DataTable。
  3. 为打开的对话框添加事件处理程序。
  4. 使用Xdocument,XmlDocument或XmlReader从给定的xml文件中读取数据。 调用DataTable.NewRow()并设置字段。将此DataRow传递给DataTable.Rows.AddRow
  5. 为保存对话框添加事件处理程序。
  6. 迭代DataTable的行并使用XDocument将它们写入xml文件(请参阅linq to xml docs)。
  7. 或者,DataTable可能支持WriteXml / ReadXml调用,但这会强制xml文件位于MS DataTable架构中。该帖子没有提到xml的架构。

    此外,请确保在DGV上选中启用添加,编辑和删除。