【发布时间】:2016-07-28 04:21:42
【问题描述】:
我使用了一个模块来读取 excel 文件并将其中的数据填充到 DataTable 中。然后,此 DataTable 会显示到 DataGridView 表单中。
这样我没有问题,但问题是我想捕捉在 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 在 dataGridView 中应用,而它已经显示 Rows?
-
这是一个很常见的问题。 DataGridView 的行号与DataTable 相同。所以在 Row_Changed 事件中从发送者对象中获取行号。我目前没有运行 Visual Studio,所以我不能给你确切的代码。你可以查一下。
-
@Angelo 这正是我的意思。因为我一开始就从 DataTable 类中创建了一个变量,并且我希望将更改保存在同一个变量中。
-
@jdweng 我不明白这对我有什么帮助。考虑一下我是一个新手,但是在我得到行的编号(或索引,例如'id'?)之后,我是否能够将对其所做的更改应用于同一个数据表?
-
对同一个数据表是。 dataGridView 不会自动更新。因此,您必须像 Angelo 发布的那样将 DataSource 设置为 null。设置为 null 会导致表单绘制事件识别更改的数据,然后刷新表单窗口。
标签: c# datagridview datatable