0

我有一个带有 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;
    }
}
4

1 回答 1

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 上选中启用添加、编辑和删除。

于 2009-07-27T21:46:25.577 回答