点击按钮后按条件删除RadGridView中B列空值行的实现方法
问题说明
GridView包含A、B两列,需要实现B列无值时删除对应整行的功能。目前已经写好了遍历所有行、判断B列空值的逻辑,需要补充对应的行删除代码。
现有待调整的代码:
private void Button1_Click(object sender, EventArgs e) { foreach (GridViewRowInfo row in DGV1.Rows) { if (row.Cells[1].Value == null || Convert.ToString(row.Cells[1].Value) == string.Empty) { MessageBox.Show("Null value"); } } }
实现方法
注意:直接在正向遍历行集合的循环里删除行会触发集合索引偏移,导致漏删、运行报错,不能直接把删除代码塞进现有foreach循环里。
有两种稳定的实现方式:
- 倒序遍历行集合删除
从最后一行往第一行遍历,删除当前行不会影响还未遍历到的行的索引,逻辑简单性能好:private void Button1_Click(object sender, EventArgs e) { // 从最后一行开始倒序遍历 for (int i = DGV1.Rows.Count - 1; i >= 0; i--) { GridViewRowInfo currentRow = DGV1.Rows[i]; // 判断B列是否为空,用IsNullOrWhiteSpace可以同时识别null、空串、全空格的无效值 if (currentRow.Cells[1].Value == null || string.IsNullOrWhiteSpace(Convert.ToString(currentRow.Cells[1].Value))) { DGV1.Rows.Remove(currentRow); // 也可以用索引删除写法:DGV1.Rows.RemoveAt(i); } } } - 先收集待删除行再统一删除
遍历的时候先把所有符合删除条件的行存到临时列表,遍历完原行集合之后再批量删除,也能避开遍历中修改原集合的问题:private void Button1_Click(object sender, EventArgs e) { List<GridViewRowInfo> waitDeleteRows = new List<GridViewRowInfo>(); foreach (GridViewRowInfo row in DGV1.Rows) { if (row.Cells[1].Value == null || string.IsNullOrWhiteSpace(Convert.ToString(row.Cells[1].Value))) { waitDeleteRows.Add(row); } } // 批量移除所有符合条件的行 foreach (var row in waitDeleteRows) { DGV1.Rows.Remove(row); } }
补充提示:如果你的DGV是绑定了数据源(比如DataTable、实体集合)的状态,不要直接操作DGV的Rows集合删行,要去操作对应的数据源执行删除,否则会出现控件和数据源状态不同步的异常。
内容的提问来源于stack exchange,提问作者Philipe
相关产品推荐
相关产品推荐

