【问题标题】:Bind XML to editable DataGridView, allowing load and save将 XML 绑定到可编辑的 DataGridView,允许加载和保存
【发布时间】:2010-11-14 11:22:35
【问题描述】:

我有一个带有 DataGridView 的设置对话框和一个确定/取消按钮。打开对话框时,会提供一个可能存在也可能不存在的 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;
    }
}

【问题讨论】:

    标签: c# xml datagridview datasource


    【解决方案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 文档)。

    或者可能,DataTable 确实支持 WriteXml/ReadXml 调用,但这会强制 xml 文件位于 MS DataTable 架构中。这篇文章没有提到 xml 的架构。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 2016-06-11
      相关资源
      最近更新 更多