有没有办法在不使用TableAdapters的情况下实现DataGridView SaveItem按钮?

时间:2016-08-26 09:09:06

标签: c# datagridview save

我目前正在尝试实现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的NewRowList或UpdatedRowList,并在SaveItemClick上我去foreach行并调用这样的Insert / Update方法:

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!");
        }
    }

我知道这是一个含糊不清的问题,但如果有人能指出我的方向,我会很感激

3 个答案:

答案 0 :(得分:1)

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

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

这将为我节省大量时间和麻烦......

无论如何,谢谢你的建议~ChenChi

答案 1 :(得分:0)

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

请勿忘记使用Transaction删除并重新插入。

答案 2 :(得分:0)

为您的行使用Dictionary(Of DataGridView, Boolean) oDic_RowToWasEdited。 只要您使用DataGridviews DataSource更新each Row into the Dictionary放置Value False即可。只要Cell gets edited change行词典条目to true

如果您save to the Database,请先dictionary contains the row先检查。If notnew Row这意味着您拥有Ifcontains that key check its value字典true。如果是update it,您知道必须 int d = c1.size() < (a1.size()< b1.size() ? a1.size() : b1.size()) ? c1.size() : ((a1.size() < b1.size()) ? a1.size() : b1.size());

通过我确信有更好的方法可以使用datatables RowState属性,我认为这应该让你去。