【问题标题】:Is there a way to implement DataGridView SaveItem button without using TableAdapters?有没有办法在不使用 TableAdapters 的情况下实现 DataGridView SaveItem 按钮?
【发布时间】:2017-01-02 21:44:19
【问题描述】:

我目前正在尝试实现 DataGridView SaveItem 操作...

由于我已经编写了 CRUD 方法并且我没有使用 TableAdapters,我想知道是否有一种聪明的方法可以在不使用适配器的情况下实现 Save。

我目前的做法是在 CellEditEnd 上实现,例如:

private void djelatnikDataGrid_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            DataGridViewRow gridrow = djelatnikDataGrid.Rows[e.RowIndex];
            DataRowView rowview = (DataRowView)gridrow.DataBoundItem;
            DataRow row = rowview.Row;
            if (row.RowState != DataRowState.Unchanged || djelatnikDataGrid.IsCurrentRowDirty)
            {
                if (djelatnikDataGrid.Rows.Count == (e.RowIndex+1))
                {
                    djelatnik_ListaNovihRedaka.Add(row);
                }

                djelatnik_ListaRedakaSaPromjenama.Add(row);
            }
        }

我想检查记录是新行还是已编辑的现有行,然后我根据 RowIndex 和 SaveItemClick 将它添加到 NewRowList 或 UpdatedRowList 我去 foreach 行并调用这样的插入/更新方法:

private void btnSaveDjelatnik_Click(object sender, EventArgs e)
        {
            if (DataDirty)
            {
                foreach (DataRow row in djelatnik_ListaNovihRedaka)
                {
                    Djelatnik djelatnik = new Djelatnik();
                    djelatnik.ImePrezime = row["ImePrezime"].ToString();
                    djelatnik.Zvanje = row["Zvanje"].ToString();
                    djelatnik.RadnoMijesto = row["RadnoMjesto"].ToString();
                    r.InsertDjelatnik(djelatnik);
                }

            if (vozilo_ListaRedakaSaPromjenama.Count > 0)
            {
                foreach (DataRow row in djelatnik_ListaRedakaSaPromjenama)
                {
                    Djelatnik djelatnik = new Djelatnik();
                    djelatnik.ImePrezime = row["ImePrezime"].ToString();
                    djelatnik.Zvanje = row["Zvanje"].ToString();
                    djelatnik.RadnoMijesto = row["RadnoMjesto"].ToString();
                    r.UpdateDjelatnik(djelatnik);
                }
            }
            MessageBox.Show("Promijene su spremljene u bazu podataka!");
        }
    }

我知道这是一个模棱两可的问题,但如果有人能指出我的方向,我将不胜感激

【问题讨论】:

  • 还有另一种方法。您可以删除数据库中的所有相关记录,然后将网格中的所有数据重新插入数据库。所以你不需要知道哪个是新的/现有的。它将帮助您减少计算和步骤...
  • 是的,但这需要很长时间?这是一个真正的解决方案还是解决方法
  • 在会计流程中,我们总是这样做的。计算增加或减少的数量需要更多时间和风险。按 ID 删除,然后在网格中重新插入最新数据。加油!
  • 我要试试这个...谢谢你的时间
  • 如果没问题,请投票给我的评论:D

标签: c# datagridview save


【解决方案1】:

我决定实现添加/编辑表单来插入或编辑新记录。

双击记录打开编辑表单,添加表单有 AddItem 按钮

这将节省我很多时间和麻烦...

还是谢谢你的建议~陈驰

【讨论】:

  • 可能是最好的解决方案。大多数基于 DGV 的应用程序使用额外的表单/字段进行编辑。
  • 感谢卢克的反馈
【解决方案2】:

还有另一种方法。您可以删除数据库中的所有相关记录,然后将网格中的所有数据重新插入数据库。所以你不需要知道哪个是新的/现有的。它将帮助您减少计算和步骤...

不要忘记使用Transaction 进行删除和重新插入。

【讨论】:

  • 使用Transaction 可能会消除丢失数据的风险。如果数据库使用Autoincrement Integer 作为PrimaryKey,这将是一个问题。如果此 PK 将该行链接到数据库中的任何其他内容,则稍后将导致问题,因为该行将获得一个新的 PK。
【解决方案3】:

为您的行使用Dictionary(Of DataGridView, Boolean) oDic_RowToWasEdited。 一旦你更新你的DataGridviews DataSource,就把each Row into the Dictionary 换成Value False。每当Cell gets editedchange 行字典条目to true

只要你想save to the Database,首先检查你的dictionary contains the rowIf not 这意味着你有一个new RowIf字典contains that key check its value。如果是true,你知道你必须update it

尽管我确信使用 datatables RowState 属性有更好的方法,但我认为这应该可以帮助您。

【讨论】:

  • 我正在考虑禁用 SaveItem 按钮并添加一个用于插入/编辑行的表单
  • 这可能是没有 Tabeladapter 的最佳方式。
猜你喜欢
  • 1970-01-01
  • 2020-12-29
  • 2015-06-22
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 2016-01-19
相关资源
最近更新 更多