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;
私はあなたが「更新された新しいDataTableになりたい」という意味を理解していませんが、ちょうどこれを得るために...あなたはソースに加えた** DataTable **適用の変更を保存したい** dataGridView **には既に行が表示されていますか? – Angelo
これは非常によくある質問です。 DataGridViewの行番号は、DataTableと同じです。 Row_Changedイベントでは、送信者オブジェクトから行番号を取得します。現時点でVisual Studioを実行していないので、正確なコードを提供することはできません。あなたはそれを見ることができます。 – jdweng
@Angeloそれはまさに私が言っていることです。私は最初にクラスDataTableから1つの変数を作成し、同じものに変更を保存したいからです。 –