C# Table.Rows[index].Delete()

本文介绍在使用DataTable时如何正确地删除DataRow,并解释了Delete()方法的运作机制及其与AccepteChanges()方法的关系。同时,文章还讲解了如何访问已标记为删除的行的原始数据。
如果DataRow.Delete()方法被调用,相应行的RowState属性就会被设置成DataRowState.Deleted。当一个行的状态是DataRowState.Deleted的时候,正常情况下我们无法访问这一行。如果你需要检索已删除的原始数据,可以使用其条目属性的重载方法来传递DataRowVersion.Original参数。
代码像这样:
if (typedDataRow.RowState == DataRowState.Deleted)
id = (string)typedDataRow["CustomerID", DataRowVersion.Original];
采用datatable.Rows[i].Delete()删除行或在DataGrid上按Del键删除行后再访问该表时出现出现“不能通过已删除的行访问该行的信息”的错误。原因如下:
Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态标志为删除,还可以通过datatable.RejectChanges()回滚,使该行取消删除。
所以 如果要彻底删除datarow,需要Delete()和AccepteChanges()方法同时使用,或者 采用datatable.Rows.RemoveAt(i)方法直接删除,其中i表示行索引,还有一个就是datatable.Rows.Remove(DataRow dr)删除指定行。
不过使用datatable.Rows.RemoveAt(i)要注意,如果连续使用datatable.Rows.RemoveAt(0);datatable.Rows.RemoveAt(1);这时并不是删除了原表中的0,1行,而是删除0行后,原来的1行就变成了0行,所以datatable.Rows.RemoveAt(1)实际删除的是原表的2行。

所以还是要慎用datatable.Rows.RemoveAt(i)

小注:

行版本(DataRowVersion)
行(DataRow)对象有四种不同的行版本,分别是Current,Original,proposed和default。下面对这些行版本进行简要的说明。
Current:表示行的当前值。处于deleted状态的行不存在该行版本。
Original:表示行的原始值。处于Added状态的行不存在该行版本
Proposed:表示行的建议值。不属于表的行,即处于Detached状态的行存在该行版本;对于正在进行编辑的行,也存在该行版本。
Default:表示行的默认版本。处于Added,Modified或则Unchanged状态的行的默认行版本是current;处于deleted状态的行的默认行版本是original。处于Detached状态的行的默认版本是proposed。

private void SaveData() { try { System.Collections.Hashtable Para = new System.Collections.Hashtable(); DataTable tb1 = dgvGrid1.GetCommitTable().Copy(); // 添加 is_delete 列用于标识删除行(如果尚未存在) if (!tb1.Columns.Contains("is_delete")) { tb1.Columns.Add("is_delete", typeof(bool), "false"); } dgvGrid1.DataSource = tb1; DataTable changes = tb1.GetChanges(); if (changes != null && changes.Rows.Count > 0) { // 提取删除行 DataRow[] deleteRows = changes.Select("is_delete = true"); DataTable tbDelete = deleteRows.Length > 0 ? deleteRows.CopyToDataTable() : new DataTable(); MessageBox.Show("tbDelete 中将删除记录数:" + tbDelete.Rows.Count); // 提取非删除行 DataRow[] updateRows = changes.Select("is_delete = false OR is_delete IS NULL"); DataTable tbUpdate = updateRows.Length > 0 ? updateRows.CopyToDataTable() : new DataTable(); // 传入参数时确保不是 null Para.Add("@user_name1", PettyCashBasic.Classes.PettyCashLogin.UserName); Para.Add("@tb1", PettyCashBasic.Classes.PettyCashConnection.GetTable101(tbUpdate)); Para.Add("@tbDelete", PettyCashBasic.Classes.PettyCashConnection.GetTable101(tbDelete)); if (PettyCashBasic.Classes.PettyCashConnection.DataUpdate("p_user_mapping_sav", Para)) { tb1.AcceptChanges(); GetGridData(); MessageBox.Show("保存结束。"); } } else { MessageBox.Show("没有需要保存的变更。"); return; } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void DeleteSelectedRows() { if (dgvGrid1.DataSource is DataTable tb1) { foreach (DataGridViewRow row in dgvGrid1.SelectedRows) { if (!row.IsNewRow) { // 设置 is_delete 为 true tb1.Rows[row.Index]["is_delete"] = true; } } } }
最新发布
08-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值