我目前正在尝试实现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!");
}
}
我知道这是一个含糊不清的问题,但如果有人能指出我的方向,我会很感激
答案 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 not
。 new Row
这意味着您拥有If
。 contains 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属性,我认为这应该让你去。