gridview 与 detailsview 联动 共用一个数据源 完美解决 排序分页

对于共用数据源方面,网上多是sqldatasource

这个办法最好的是再gridview_selected事件中添加下面代码

DetailsView1.PageIndex = GridView1_SelectedRow.DataItemIndex。

这个代码意思就是让DetailsView的对应的数据视图的数据行号等于GridView对应数据视图的数据行的行号。

因为两个数据控件的数据源是一致的,理论上两个数据控件上得数据视图是一样。所以上面的代码可以完美解决关联问题,那片有分页。

(PS:我理解的数据控件绑定的数据源原理是这样的:数据源控件在被绑定时候会生成的DataView数据视图对象,然后再让这个对象绑定到数据控件上,这就解释了GridView为什么能够排序。)

 

默认情况下,同一个数据源控件绑定到不同数据控件时,生成的数据视图对象应该都是一致的。但是如果有人改变了其中一个数据控件对应的数据视图,问题就糟糕了。改变的情况往往发生在GridView的排序功能上,启用排序后,并使用了排序,那么绑定在GridView上DataView对象的数据顺序就也就改变了。可糟糕的是绑定在DataView上的饿DataView还是原来的数据顺序。所以这时候,再用DataItemIndex去指向DataView的索引,也就不对了。

 

那这个问题怎么解决呢,最好的办法就是通过GridView获取选中行的主键,通过主键定位GridView1的索引。sqldatasource是没办法解决的。因为咱们根本不可能获取到sqldatasource绑定是产生的DataView对象或dataTabel对象。它被完全封装了。

如果是objectDataSource还可以解决,objectDataSource.select()提供了产生DataView的方法。因为DetailsView是没有排序功能的,它的被绑定的Dataview是不会改变的。我可以通过GridView1.SelectValue获取到主键,在根据sqldatasource.select()的DataView找到这个主键对应的行号。

 

DataTable table=((DataView)objectDataSource.select()).Table;

DetailsView1.PageIndex=table.Rows.IndexOf(table.Rows.Find(GridView1.SelectValue));

你可能感兴趣的:(GridView)