2016-04-07 12 views
0

1つのモジュールを使用してExcelファイルを読み込んで、それらのデータをDataTableに入力しました。このDataTableは、DataGridViewフォームに表示されます。DataGridViewのDataTableに変更を保存したい

これで問題はありませんが、GridViewに表示されている間にそのDataTableに加えられた変更をキャッチして保存したいということです。

つまり、更新された新しいDataTableで何かが変更されるたびに関数を呼び出す必要があります(追加のボタン(「変更を保存する」など)が必要な場合は問題ありません。

私はバインディングのソースとアダプタについて読んだことがありますが、私はかなり混乱しており、正しく動作するようにはできません。だから助けていただければ幸いです。ここにコードがあります。あなたはこれを持っている必要があります。:

public partial class MainForm : Form 
{ 

    DataTable dTable = new DataTable(); 
    BindingSource bSource = new BindingSource(); 

    public MainForm() 
    { 
     // 
     // The InitializeComponent() call is required for Windows Forms designer support. 
     // 
     InitializeComponent(); 

     // 
     // TODO: Add constructor code after the InitializeComponent() call. 
     // 
    } 
    void Button1Click(object sender, EventArgs e) 
    { 
     OpenFileDialog openFileDialog1 = new OpenFileDialog(); 

     openFileDialog1.InitialDirectory = "d:\\" ; 
     openFileDialog1.Filter = /*txt files (*.txt)|*.txt|xcel files (*.xcel*)|*.xcel*|*/ "All files (*.*)|*.*" ; 
     openFileDialog1.FilterIndex = 1; 
     openFileDialog1.RestoreDirectory = true ; 
     openFileDialog1.Title = "Choose a file to read"; 

     if(openFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      string szChosenFileNameDirectory = openFileDialog1.FileName; 
      string szChosenFileExtension = szChosenFileNameDirectory.Substring(szChosenFileNameDirectory.LastIndexOf("."), szChosenFileNameDirectory.Length - szChosenFileNameDirectory.LastIndexOf(".")); 

      SpreadsheetInfo.SetLicense("FREE-LIMITED-KEY"); 

      ExcelFile ef = ExcelFile.Load(szChosenFileNameDirectory); 

      foreach (ExcelWorksheet sheet in ef.Worksheets) 
      { 
       foreach(ExcelColumn column in sheet.Columns) 
       { 
        if(column.Index == sheet.CalculateMaxUsedColumns()) 
         break; 

        DataColumn col = new DataColumn(); 
        col.ColumnName = column.Name; 
        dTable.Columns.Add(col); 

       } 

       foreach (ExcelRow row in sheet.Rows) 
       { 
        DataRow r = dTable.NewRow(); 
        r.BeginEdit(); 
        foreach (ExcelCell cell in row.AllocatedCells) 
        { 
         r[cell.Column.Name] = cell.Value; 

        } 
        r.EndEdit(); 
        dTable.Rows.Add(r); 
       } 
      } 

      //setting the datasource, ok 
      dataGridView1.DataSource = dTable; 

      //Handlig a changed row or? 
      dTable.RowChanged += new DataRowChangeEventHandler(Row_Changed); 
     } 
    } 

    public static void Row_Changed(object sender, DataRowChangeEventArgs e) 
    { 

    } 
} 

P.S:/

using GemBox.Spreadsheet; 
+1

私はあなたが「更新された新しいDataTableになりたい」という意味を理解していませんが、ちょうどこれを得るために...あなたはソースに加えた** DataTable **適用の変更を保存したい** dataGridView **には既に行が表示されていますか? – Angelo

+0

これは非常によくある質問です。 DataGridViewの行番号は、DataTableと同じです。 Row_Changedイベントでは、送信者オブジェクトから行番号を取得します。現時点でVisual Studioを実行していないので、正確なコードを提供することはできません。あなたはそれを見ることができます。 – jdweng

+0

@Angeloそれはまさに私が言っていることです。私は最初にクラスDataTableから1つの変数を作成し、同じものに変更を保存したいからです。 –

答えて

1

は、この問題に関しては、これを行うには、いくつかの方法といくつかのトピックがあります。

「更新」ボタンに添付されたメソッドを使用して、dataSourceをdataGridViewに再バインドします。

あなたが事前に作成しなければなりませんon_clickボタンイベントに割り当てることができ、次の方法を使用します。

:また

function bool refresh() 
{ 
    dataGridView1.DataSource = null; 
    dataGridView1.DataSource = dTable; 

    return true; 
} 

、フォーラムの周りを見てみてください、異なる方法を示すいくつかの同様のトピックがあります

+0

Oh gawd ... DataTableが表示されている間にDataTableが変更されていることは決して知りませんでした。ありがとう、たくさんの時間を無駄な情報に費やしてきたと思います。< –

+0

喜び。私はこれがこれを行う最良の方法ではないかもしれないと言及するべきです。 レコードがたくさんある場合(そしてLOTを意味する)、dataGridView全体をリフレッシュするには時間がかかり、RAMをもっと消費することになるからです。 – Angelo

+0

当時は1つのファイルしかないので、問題はありません。^_ ^ありがとうございました。 –

関連する問題