DataSet取出来的数据,使用DataGrid进行显示,然后需要在用户选择当前行后进行一个操作,现在发现的情况是,使用DataSet.Tables[TableName].DefaultView进行过滤之后,再使用DataGrid.CurrentRowIndex来取当前行将得到错误的结果,比如:
DataRow row = dataSet1.Tables[TableName].Rows[dataGrid1.CurrentRowIndex];
这样返回的行是不正确的,大家试试就知道了,我试出一种解决办法:
DataRow row = dataSet1.Tables[TableName].DefaultView.ToTable().Rows[dataGrid1.CurrentRowIndex];
这个办法由于是使用了ToTable()这个方法,有可能浪费一些资源,因为它是对数据的一个拷贝,但找不到Pocket PC上的相应说明,虽然问题解决了,但是我觉得这么浪费资源的方法还是不可取的,因为毕竟如果数据量大的时候肯定出大问题!!所以下定决心要解决这个问题,我估计是由于Pocket PC上Compact Framework的问题引起的,在Google上断的找,发现有一篇文章http://www.chinaaspx.com/archive/dotnet/11391.htm是这样写的:
而DataGrid中显示的数据可能经过DataView的DataView.RowFilter属性、 DataView.RowStateFilter属性的过滤,还可能经过DataGrid本身根据各个列的正向和反向排序,所以DataGrid的 CurrentRowIndex属性所指示的行索引跟其对应的DataTable的行索引有很大的机会是不一样的,不能够根据DataGrid的 CurrentRowIndex去获取其对应的DataTable的行。
这时BindingManagerBase又将发挥作用了,我们可以先建立一个对应此DataGrid绑定的数据源的BindingManagerBase,这样这个BindingManagerBase就可以管理这个数据源。
//设置DataGrid的数据源
dataGrid1.DataSource = myDataSet;
dataGrid1.DataMember = "customers";
//建立同DataGrid同样数据源的BindingManagerBase
BindingManagerBase myBindingManagerBaseParent = this.BindingContext[myDataSet,"customers"];
一旦建立了这个BindingManagerBase,就可以通过BindingManagerBase的当前行的属性来获取当前数据源的记录:
//BindingManagerBase的Current返回数据源的对象,对于绑定到DataView的数据源,需要将此对象显式
//的转换为 DataRowView类型
DataRowView myDataRowView =(DataRowView) myBindingManagerBaseParent.Current
这段程序中使用到this.BindingContex让我浪费了不少时间,然后从http://www.dotnet247.com/247reference/msgs/11/56108.aspx中了解到,实际this应该改为DataGrid实例的名称,也就是:
DataRow row = ((DataRowView)myBindingManagerBaseParent.Current).Row;
然后再看,有一段代码是这样写的
总结:网上虽然有很多帮助,但如果想真正解决问题还是得花比较多的时间对问题进行分析与总结才行哦!这个问题花了大概四个小时才解决的,正应了软件开发过程中10%比90%的说法。
DataRow row = dataSet1.Tables[TableName].Rows[dataGrid1.CurrentRowIndex];
这样返回的行是不正确的,大家试试就知道了,我试出一种解决办法:
DataRow row = dataSet1.Tables[TableName].DefaultView.ToTable().Rows[dataGrid1.CurrentRowIndex];
这个办法由于是使用了ToTable()这个方法,有可能浪费一些资源,因为它是对数据的一个拷贝,但找不到Pocket PC上的相应说明,虽然问题解决了,但是我觉得这么浪费资源的方法还是不可取的,因为毕竟如果数据量大的时候肯定出大问题!!所以下定决心要解决这个问题,我估计是由于Pocket PC上Compact Framework的问题引起的,在Google上断的找,发现有一篇文章http://www.chinaaspx.com/archive/dotnet/11391.htm是这样写的:
而DataGrid中显示的数据可能经过DataView的DataView.RowFilter属性、 DataView.RowStateFilter属性的过滤,还可能经过DataGrid本身根据各个列的正向和反向排序,所以DataGrid的 CurrentRowIndex属性所指示的行索引跟其对应的DataTable的行索引有很大的机会是不一样的,不能够根据DataGrid的 CurrentRowIndex去获取其对应的DataTable的行。
这时BindingManagerBase又将发挥作用了,我们可以先建立一个对应此DataGrid绑定的数据源的BindingManagerBase,这样这个BindingManagerBase就可以管理这个数据源。
//设置DataGrid的数据源
dataGrid1.DataSource = myDataSet;
dataGrid1.DataMember = "customers";
//建立同DataGrid同样数据源的BindingManagerBase
BindingManagerBase myBindingManagerBaseParent = this.BindingContext[myDataSet,"customers"];
一旦建立了这个BindingManagerBase,就可以通过BindingManagerBase的当前行的属性来获取当前数据源的记录:
//BindingManagerBase的Current返回数据源的对象,对于绑定到DataView的数据源,需要将此对象显式
//的转换为 DataRowView类型
DataRowView myDataRowView =(DataRowView) myBindingManagerBaseParent.Current
这段程序中使用到this.BindingContex让我浪费了不少时间,然后从http://www.dotnet247.com/247reference/msgs/11/56108.aspx中了解到,实际this应该改为DataGrid实例的名称,也就是:
BindingManagerBase myBindingManagerBaseParent = dataGrid1.BindingContext[myDataSet,TableName];
但是测试的结果还是不正确,通过如下语句还是不能取出正确的记录中的数据:DataRow row = ((DataRowView)myBindingManagerBaseParent.Current).Row;
然后再看,有一段代码是这样写的
dataGrid1.DataSource = myDataSet;
dataGrid1.DataMember = "customers";
,最后测试的时候,我发现Pocket PC上只能dataGrid1.DataMember = "customers";
dataGrid1.DataSource=myDataSet;
而不能进行如下操作
dataGrid1.DataMember = "customers";
那我是否可以让dataGrid1.DataSource=myDataSet.Tables[TableName],然后
myBindingManagerBaseParent=dataGrid1.BindingContext[myDataSet.Tables[TableName]];
呢?最后的测试居然是成功的,他奶奶的,问题终于解决了!!
总结:网上虽然有很多帮助,但如果想真正解决问题还是得花比较多的时间对问题进行分析与总结才行哦!这个问题花了大概四个小时才解决的,正应了软件开发过程中10%比90%的说法。