0

DataGridViewと[OK/キャンセル]ボタンのある設定ダイアログがあります。ダイアログを開くと、存在する場合と存在しない場合があるXMLファイルが提供され、内容が表示されます。ファイルが存在するかどうかに関係なく、ユーザーは、行を追加または削除できるだけでなく、DataGridViewの各セルのデータを変更できる必要があります。[OK]ボタンをクリックすると、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 に答える