我有一段通过DataGrid(Windows)删除DataRow的代码,删除后发现再次点击已删除那行的时候(比如我删除第二行,然后再点击第二行)会出现一个"Deleted row information cannot be accessed through the row"的错误. 不知道是什么原因,下面是相关的代码,请帮我分析一下原因,谢谢了:这段代码是在继承的DataGrid类里重写ProcessCmdKey
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if(Keys.Delete == keyData)
{
CurrencyManager cm = (CurrencyManager)this.BindingContext[this.DataSource, this.DataMember];
ArrayList list = new ArrayList();
for(int i = cm.Count - 1; i >= 0; i--)
if(this.IsSelected(i))
list.Add(i);
if(0 == list.Count)
return base.ProcessCmdKey (ref msg, keyData);
if(DialogResult.No == MessageBox.Show("确定要删除记录吗?", "删除", MessageBoxButtons.YesNo,MessageBoxIcon.Warning,MessageBoxDefaultButton .Button2))
return true;
else
{
DataRowView rv = null;
foreach(int x in list)
{
cm.Position = x;
rv = (DataRowView)cm.Current;
rv.Row.Delete(); }
return true;
}
}
else
return base.ProcessCmdKey (ref msg, keyData);
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if(Keys.Delete == keyData)
{
CurrencyManager cm = (CurrencyManager)this.BindingContext[this.DataSource, this.DataMember];
ArrayList list = new ArrayList();
for(int i = cm.Count - 1; i >= 0; i--)
if(this.IsSelected(i))
list.Add(i);
if(0 == list.Count)
return base.ProcessCmdKey (ref msg, keyData);
if(DialogResult.No == MessageBox.Show("确定要删除记录吗?", "删除", MessageBoxButtons.YesNo,MessageBoxIcon.Warning,MessageBoxDefaultButton .Button2))
return true;
else
{
DataRowView rv = null;
foreach(int x in list)
{
cm.Position = x;
rv = (DataRowView)cm.Current;
rv.Row.Delete(); }
return true;
}
}
else
return base.ProcessCmdKey (ref msg, keyData);
}
return base.ProcessCmdKey (ref msg, keyData);
else return false;
应该就可以了吧
就是说,不能访问已经删除了的行的信息。
DataRow dr;
一般访问这个行的某个字段
通过dr["COLUMNNAME"]来访问
但是当这个dr的RowState是DataRowState.Delete的话
则需要通过
dr["COLUMNNAME",DataRowVersion.Original]这样的方式来访问改行的数据。
如:
if (…….RowState <> DataRowState.Deleted)
比如说删除了第二行,这时候第三行串到了第二行,然后再点击第二行的位置(也就是点击原来的第三行),DataGrid会报错