问题1:DataGridView绑定DataTable之后,在界面排序,选择若干行,此时选中的行的index与DataTable中的index不一致,这样若想要对其对应的行进行修改操作,将会造成错误。
Sol: 首先将选中的DataGridView行的DataBoundItem属性转换为DataRowView, 然后通过对应的DataTable中的取出索引。
1 DataRowView drv = dataGridView.SelectedRows[0].DataBoundItem as DataRowView; 2 int index = dataTable.Rows.IndexOf(drv.Row);
这是因为DataRowView对象中,有一个Row属性,获取正被查看的 DataRow,那么就可以在DataRow所在的表中找到它的索引啦。
问题2:为什么foreach遍历DataTable或者DataGridView对行进行增删修改的操作,会造成索引错误的问题?
Sol: 这是因为foreach循环是从第一位开始遍历,如果对某一行进行删除操作,那么该行后面的DataRow(DataGridViewRow)的索引会提前一位,也即是说,DataRow(DataGridViewRow)的index是会实时变化的,因此会出错。比如索引为3被删除,那么删除后4的索引就变成3了,又一次循环时原先索引为4的就被跳过不操作了(因为此时操作索引为4的,也即原先索引为5)。
如果需要对行进行删除,那么要从表尾开始操作起,这样删除任一行,对前面的DataRow(DataGridViewRow)的索引就没有影响了。
问题3:DataTable添加列之后,如何确定是否为Null或者空字符串?
Sol: 在作判断的时候经常需要对其判断是否为Null 或者 string.Empty,如果Null和 String.Empty的处理结果是一样的,那么可以在添加列的时候,设置其DefaultValue。
dt.Columns["a"].DefaultValue = string.Empty;