【问题标题】:I want to save any changes to a DataTable in a DataGridView我想在 DataGridView 中保存对 DataTable 的任何更改
【发布时间】: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;

【问题讨论】:

  • 我不确定你所说的“我想成为更新的新数据表”是什么意思,只是为了弄清楚这一点......你想保存你在源代码中所做的更改DataTabledataGridView 中应用,而它已经显示 Rows?
  • 这是一个很常见的问题。 DataGridView 的行号与DataTable 相同。所以在 Row_Changed 事件中从发送者对象中获取行号。我目前没有运行 Visual Studio,所以我不能给你确切的代码。你可以查一下。
  • @Angelo 这正是我的意思。因为我一开始就从 DataTable 类中创建了一个变量,并且我希望将更改保存在同一个变量中。
  • @jdweng 我不明白这对我有什么帮助。考虑一下我是一个新手,但是在我得到行的编号(或索引,例如'id'?)之后,我是否能够将对其所做的更改应用于同一个数据表?
  • 对同一个数据表是。 dataGridView 不会自动更新。因此,您必须像 Angelo 发布的那样将 DataSource 设置为 null。设置为 null 会导致表单绘制事件识别更改的数据,然后刷新表单窗口。

标签: c# datagridview datatable


【解决方案1】:

有几种方法可以做到这一点,并且有几个与此问题相关的主题。

快速解决方法是通过附加到“刷新”按钮的方法将您的数据源重新绑定到 dataGridView。

使用以下方法,可以将其分配给必须事先创建的 on_click 按钮事件:

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

    return true;
}

或者,试试看论坛,有几个类似的主题显示不同的方法:

【讨论】:

  • 天哪...从来不知道 DataTable 在显示期间会在整个期间发生变化...所以像这样的简单刷新就可以了。非常感谢,我想我花了太多时间在无用的信息上>.
  • 很高兴。我应该提到,这可能不是最好的方法。仅仅是因为如果您有很多记录(我的意思是很多),刷新整个 dataGridView 可能需要时间并消耗更多 RAM。
  • 当时只有一个文件,应该没有问题。 ^_^ 非常感谢。
猜你喜欢
  • 2011-05-19
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多