这个问题我第三次问了。
首先,我的DataGridView是不绑定数据的,是用来输入数据以保存的,所以我设定它的属性是可以添加行,删除行。
现在添加行可以实现了。DataGridView.Rows.Add()方法就能在末尾添加一新行。
但是却无法删除。刚开始时用DataGridView.Rows[i].Remove()方法竞然还出错“无法删除未提交的新行”,后来参考了一位大哥的,在前面加一行DataGridView.EndEdit();不出错了,但还是无法删除。
看我的代码:
private void button1_Click(object sender, EventArgs e)
{
dgvList.EndEdit();
dgvList.DataSource = null;
for (int i = 0; i < dgvList.Rows.Count-1; i++)
{
dgvList.Rows.Remove(dgvList.Rows[i]); }
}
这是个清空的按钮,只是测试一下,不想用DataGridView.Rows.Clear(),因为不是每行都要删除的,我要的功能就是符合条件的留下来,不符合的才删除。
现在又出个新问题,就是用循环竞然不能一次性删除,非要运行好几次,才删除完。
我郁闷死了,哪位大侠帮帮我,为这问题我苦恼了好几天了。
请认真看完后再做回答,如果你的回答就是一句DataGridView.Rows[i].Remove(),我服了你了。
首先,我的DataGridView是不绑定数据的,是用来输入数据以保存的,所以我设定它的属性是可以添加行,删除行。
现在添加行可以实现了。DataGridView.Rows.Add()方法就能在末尾添加一新行。
但是却无法删除。刚开始时用DataGridView.Rows[i].Remove()方法竞然还出错“无法删除未提交的新行”,后来参考了一位大哥的,在前面加一行DataGridView.EndEdit();不出错了,但还是无法删除。
看我的代码:
private void button1_Click(object sender, EventArgs e)
{
dgvList.EndEdit();
dgvList.DataSource = null;
for (int i = 0; i < dgvList.Rows.Count-1; i++)
{
dgvList.Rows.Remove(dgvList.Rows[i]); }
}
这是个清空的按钮,只是测试一下,不想用DataGridView.Rows.Clear(),因为不是每行都要删除的,我要的功能就是符合条件的留下来,不符合的才删除。
现在又出个新问题,就是用循环竞然不能一次性删除,非要运行好几次,才删除完。
我郁闷死了,哪位大侠帮帮我,为这问题我苦恼了好几天了。
请认真看完后再做回答,如果你的回答就是一句DataGridView.Rows[i].Remove(),我服了你了。
{
while(dgvList.Rows.Count-1>0)
{
dgvList.Rows.Remove(dgvList.Rows[i]);
}
}}
{
while(dataGridView1.Rows.Count-1>0)
{
dataGridView1.Rows.Remove(dataGridView1.Rows[0]);
}
}
#region 保存前验证
private bool AllowSave()
{ int icountErr;
icountErr = 0;
dgvList.EndEdit();
foreach (DataGridViewRow row in dgvList.Rows)
{
if (row.IsNewRow) continue;
if (row.Cells[0].Value == null || row.Cells[0].Value.ToString() == "")
{
dgvList.Rows.Remove(row);
continue;
}
foreach (DataGridViewCell cell in row.Cells)
{
//单价或数量,进行验证
if (cell.ColumnIndex == 5 || cell.ColumnIndex == 6|| cell.ColumnIndex == 8)
{
if (!ValidaCell(cell)) ++icountErr;
}
//检察库存
}
}
dgvList.Refresh();
return icountErr == 0;
}
private bool ValidaCell(DataGridViewCell cell)
{
if (dgvList.Rows[cell.RowIndex].Cells[0].Value == null || dgvList.Rows[cell.RowIndex].Cells[0].Value.ToString() == "")
return true;
if (cell.Value == null || cell.Value.ToString() == "")
{
cell.ErrorText = " 该项不允计留空!";
return false;
}
System.Text.RegularExpressions.Regex regul = new System.Text.RegularExpressions.Regex(@"^[-]?\d*[.]?\d*$");
if (!regul.IsMatch(cell.Value.ToString()))
{
cell.ErrorText = " 该项只允许输入数字!";
return false;
}
else
{
cell.ErrorText = "";
}
if (cell.ColumnIndex == 6 && cell.ErrorText == "")
{
int stockamout = int.Parse(dgvList.Rows[cell.RowIndex].Cells["库存"].Value.ToString());
if (int.Parse(cell.Value.ToString()) > stockamout)
{
cell.ErrorText = " 输入值已超出库存量,最大为[" + stockamout + "]";
return false;
}
}
return true;
}
#endregion
{
dgvList.Rows.Remove(dgvList.Rows[0]);
}可以清除所有行。提示:属性是可以添加行时,行的总数包含最后的空行。
我是要做个判断,将符合条件的行留下来做保存用,不符合的删除.那个按钮的循环代码只是用来显示为什么有的行能删除有的行不能删除.
谢谢各位的支持,但问题依旧存在,会不会是.Net2.0 的Bug?要不要装个.net 3.0?
按钮代码:
dgvList.EndEdit();
dgvList.DataSource = null;
for (int i = 0; i < dgvList.Rows.Count-1; i++)
{
dgvList.Rows.Remove(dgvList.Rows[i]); }
应该没什么逻辑性错误吧.一看就知道要删除所有行,可你运行就怪了,要点几次才能删除所有行,一次只能删除几行.如果跟踪查看dgvList.Rows.Count是正确的.
唉.发现怪事了.
{
if (dgvList.Rows[i].Cells[0].Value == null || dgvList.Rows[i].Cells[0].Value.ToString() == "")
{
dgvList.Rows.RemoveAt(i--);
continue;
} //下面是其他不删除的行的代码
······
}您先试试,如果不行,明天再来看,先回去吃饭了,实在饿得不行了~~~
今天第一次来csdn,学习了不少东西,希望能与各位一起进步!!
dgvList.EndEdit();
dgvList.DataSource = null;
int icount=dgvList.Rows.Count-1;
for (int i = 0; i < icount; i++)
{
dgvList.Rows.Remove(dgvList.Rows[i]);
}这个在删除一行后,原来的dgvList.Rows.Count就少1了.所以每次只能删除一半.
哦.哈哈
非常感谢bingpingzhi() 和各位朋友.
以下是代码:(两种)
dgvList.EndEdit();
dgvList.DataSource = null;
//DataGridViewRow[] rows= new DataGridViewRow[dgvList.Rows.Count];
//dgvList.Rows.CopyTo(rows, 0);
//foreach (DataGridViewRow row in rows)
//{
// if (row.IsNewRow) break;
// dgvList.Rows.Remove(row);
//}
for (int i = 0; i < dgvList.Rows.Count-1; i++)
{
if (dgvList.Rows[i].IsNewRow) break;
dgvList.Rows.RemoveAt(i--);
}
这是获取DGV控件选中当前行的ID值!
{
this.dataGridView2.EndEdit();
/*
for (int i = 0; i <= dataGridView2.Rows.Count - 1; i++) // 方法1,顺着删,但要i--,修正逻辑指针i的位置
{
if (dataGridView2.Rows[i].Cells[2].Value.ToString().Trim() == "ok")
{
dataGridView2.Rows.RemoveAt(i);
i--;
// 不用 i-- 只能删除一半,可用 dataGridView2.Rows.RemoveAt(i--) ; 代替这两句
// 这是因为,Rows[i]表示第 i 行,他是动态的,比如,datagridview 一共有 5行,第一次,没有删除,dataGridView2.Rows.Count - 1=4
// 当运行 i=3时,Rows[i],RemoveAt(i) 可以操作,因第 4 存在了,当删除了3行,此时,datagridview 一共只有有5-3=2行, dataGridView2.Rows.Count - 1还是=4
// 此时,当当运行 i=3时,Rows[i],RemoveAt(i) 不可以操作,因该表一共只有2行,第 4不存在了,Rows[3],RemoveAt(3)造成移除错误
}
}
*/
for (int i=dataGridView2.Rows.Count - 1;i>=0;i--) // 方法2:倒着删除,不用i--
{
if (dataGridView2.Rows[i].Cells[2].Value.ToString().Trim() == "ok")
{
dataGridView2.Rows.RemoveAt(i);
//i--;
}
}
}