2009-07-27 31 views
0

DataGridViewとOK/Cancelボタンを使用した設定ダイアログがあります。ダイアログが開かれると、存在していてもいなくてもよいXMLファイルが提供され、内容が表示されます。ファイルが存在するかどうかにかかわらず、ユーザーはDataGridView内の各セルのデータを変更し、行の追加または削除ができる必要があります。 [OK]ボタンをクリックすると、DataGridViewの内容を最初に提供されたXMLファイルにエクスポートする必要があります。XMLを編集可能なDataGridViewにバインドしてロードと保存を可能にする

私はこれを数時間にわたって欺いています。これらの要件をすべて一度に処理することはできません。

私が使用したクラスには、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

は、ここで私はそれを行うだろう方法は次のとおりです。

  1. は、クラススコープでのDataTableを作成します。
  2. 特定の列をフォームコンストラクタに追加します。 DataGridView.DataSourceをこのDataTableと同じに設定します。
  3. 開いているダイアログのイベントハンドラを追加します。
  4. XmlDocument、XmlDocumentまたはXmlReaderを使用して、指定されたxmlファイルからデータを読み取ります。 DataTable.NewRow()を呼び出し、フィールドを設定します。このDataRowをDataTable.Rows.AddRowに渡します。
  5. 保存ダイアログのイベントハンドラを追加します。
  6. DataTableの行を繰り返し、XDocumentを使用してXMLファイルに書き込みます(linqからxmlドキュメントを参照)。

また、DataTableはWriteXml/ReadXml呼び出しをサポートしていますが、xmlファイルをMS DataTableスキーマに強制します。この投稿にはxmlのスキーマは含まれていません。

また、DGVで[追加、編集、および削除]が有効になっていることを確認してください。

関連する問題