关于datagrid的分页与排序共存的问题???
通过datagrid的自有属性可以方便的实现分页以及排序,但却有个问题,当datagird分成了多页时,并我处于第五页时,当单击排序按钮(即标题的link)时,由于每次排序需要重新帮定数据源,所以他又自动跳至第一页,有没有办法实现只对单页排序? 问题点数:100、回复次数:16Top
1 楼redcaff_l(热的咖啡)回复于 2002-05-22 13:53:51 得分 10
给你个建议,你在点击排序按钮的时候,能不能将当前的页码CurrentPageIndex作为一个参数传回来,然后就可以指定了。Top
2 楼icyer()回复于 2002-05-22 13:59:07 得分 40
放在ViewState里面。Top
3 楼icefireren()回复于 2002-05-22 15:14:13 得分 0
icyer,把什么放在ViewState里?DataSource?能否告诉我具体该怎么作?谢谢了Top
4 楼icyer()回复于 2002-05-22 15:29:26 得分 0
把当前页的Index放在ViewState里面,每次邦定的时候都从这个ViewState里面读取Page Index,然后再邦定。Top
5 楼icefireren()回复于 2002-05-22 16:28:54 得分 0
再次谢谢icyer() ,但你还是没有实现我所说的功能,可能是我没说清楚吧!
按照你的方法我可以实现在换页后排序时不变成首页,但却无法只对当页数据排序,而是每次排序时均对整个datasource排序了,有没有办法只对本页数据排序?
另外还有一个问题想问你,如何得到一个datagrid的columns中的boundcolumn的headertext等相关属性,并如何在程序中动态更新他们?谢谢帮忙。Top
6 楼icyer()回复于 2002-05-22 16:58:42 得分 0
"对当页数据排序"?
我想这可能会很麻烦。直接对DataSource排序是不可能的了,那只能一行一行的修改,对每一个Cell重新赋值。
对于第二个问题,你可以直接通过Columns来获取每一列的属性:
DataGrid1.Columns[0].HeaderText = "...";
DataGrid1.DataBind(); //记得在修改之后要重新邦定Top
7 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2002-05-22 17:17:59 得分 40
我的处理方法,datasource不要使用dataset,而是自己做一个数据类(纯粹数据,没有方法等),然后分页要在存储过程中直接分页(而不是用datagrid自己的分页),取到的结果作为datasource。也就是说,看起来你的datagrid有100页,其实你的datasource中只有10条纪录,就是一页。(假设每页10条)
哎,说的啰嗦,就是你的datagrid的数据是分好页后的数据,这样,排序就没有问题了。偶的程序就是这样的。
呵呵,给分吧!Top
8 楼icefireren()回复于 2002-05-22 17:19:55 得分 0
:)高手就是高手!!!
第一个问题:有没有其他更好的方法,如果那样的话那.net数据帮定的优势就体现不直接了,有没有可能通过对datasource分页,每次取其数据页来实现呢?
第二个问题:
由于我的指定列是动态的,也就是说需要和用户交互后才知道到底是哪列被选中了,我该如何获得columns的索引呢?Top
9 楼icefireren()回复于 2002-05-22 17:28:05 得分 0
juqiang(鞠强) ,看来我的想法和你异曲同工啊(见上文),^_^
对于DataView有没有办法分页?有没有可能给我个实例程序?如果使用了你自己的数据类,也最好发给我看看,有商业秘密就算了!
等你回答完这问题后,分一定给!Top
10 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2002-05-22 17:39:16 得分 0
我的分页是通过存储过程实现的,下面是我的代码片段(纯粹的数据实体类),其实,这个想法是看到petshop的代码才有的,建议你看一看!
我的代码片段:
public static Zwwldw[] GetZwwldwList(int currentPage, int pageSize,ref int numResults){
numResults = 0;
int i,j;
Zwwldw[] tmp = new Zwwldw[pageSize];
object[][] list = GetInstanceList(currentPage,pageSize);
for(i=0;i<list.Length;i++){
if(list[i]==null)break;
tmp[i] = new Zwwldw();
tmp[i].ZWWLDW_DWBH = Convert.ToString(list[i][1]);
tmp[i].ZWWLDW_DWMC = Convert.ToString(list[i][2]);
tmp[i].ZWWLDW_EML = Convert.ToString(list[i][3]);
}
Zwwldw[] dw = new Zwwldw[i];
for(j=0;j<i;j++){
dw[j] = tmp[j];
}
return dw;
}
public class Zwwldw{
private string m_ZWWLDW_DWBH;//客户编号
private string m_ZWWLDW_DWMC;//客户名称
private string m_ZWWLDW_EML;//电子邮件地址
/// <summary>客户编号</summary>
public string ZWWLDW_DWBH{
get{return m_ZWWLDW_DWBH;}set{m_ZWWLDW_DWBH = value;}
}
/// <summary>客户名称</summary>
public string ZWWLDW_DWMC{
get{return m_ZWWLDW_DWMC;}set{m_ZWWLDW_DWMC = value;}
}
/// <summary>电子邮件地址</summary>
public string ZWWLDW_EML{
get{return m_ZWWLDW_EML;}set{m_ZWWLDW_EML = value;}
}
}
Top
11 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2002-05-22 17:44:50 得分 0
补充一句,把如上的Zwwldw[]这个数组,直接作为数据源就可以了。
例子:(在webpage上调用)
void BindData(){
//...
Zwwldw[] list = ZwwldwManager.GetZwwldwList(page,size,ref count);
dataGrid1.DataSource = list;
dataGrid1.DataBind();
//...
}
就是这样,OK?!Top
12 楼icefireren()回复于 2002-05-22 17:59:37 得分 0
:)贪心了!!!
解释一下:
1。Zwwldw[] tmp = new Zwwldw[pageSize];
在Zwwldw class的构造器里传入pageSize参数,作用是否通过该参数调用存储过程,然后初始化相关属性值?
2。object[][] list = GetInstanceList(currentPage,pageSize);
GetInstanceList作用是什么?具体解释解释吧,别小气,老兄!^_^Top
13 楼yxrj()回复于 2002-05-22 18:40:37 得分 10
只对单页排序的话
处理当前页的那些item,排完序后
把datascoure里的相关数据替换为排序后的数据
然后再绑定。
Top
14 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2002-05-22 21:16:06 得分 0
GetInstanceList是我作的一個BaseClass,之所以返回一個Object[][],就是因爲不知道每一個子類的類型。比如説,可能是Zwwldw的類型,也可能是LSWLZD的類型。
pagesize也是存儲過程中使用的,但這裡主要是爲了控制Zwwldw[]這個數組的大小,否則,我在BaseClass裏面怎麽new這個數組呢?Top
15 楼icefireren()回复于 2002-05-23 09:17:33 得分 0
谢谢各位,给分了Top
16 楼follcat(笨笨猫)回复于 2002-07-28 17:30:40 得分 0
我自己做的分页处理,比较乱,呵呵
首先定义变量
然后写了一个GetData和displaypage
然后调用
Shared MyConn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\inetpub\wwwroot\guestbook\gbook.mdb;")
Shared PageSize As Integer = 5 '定义每页显示的记录条数
Shared TotalPage As Integer = 0 '定义总页数
Shared CurrentPage As Integer = 1 '定义当前页
Shared TotalRecords As Integer = 0 '定义总页数
Shared DS As DataSet
Shared CmdStr As String = ""
Shared aa As String = ""
Shared Currentind As Integer = 0
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not IsPostBack Then
DisplayPage()
End If
End Sub
Sub DisplayPage()
MyConn.Close()
If Not IsPostBack Then
GetData("default")
MyDataList.DataSource = DS.Tables("gbook").DefaultView
MyDataList.DataBind()
End If
butPrv.Enabled = False
If TotalPage = 1 Then
butNext.Enabled = False
End If
End Sub
Public Shared Sub GetData(ByVal direction As String)
Dim TotalCmd As OleDbCommand = New OleDbCommand("select count(*) from gbook", MyConn)
MyConn.Open()
TotalRecords = CInt(TotalCmd.ExecuteScalar)
MyConn.Close()
TotalPage = CInt(Math.Ceiling(TotalRecords / PageSize))
CmdStr = "select * from gbook order by id desc"
Dim MyCommand As OleDbDataAdapter = New OleDbDataAdapter(CmdStr, MyConn)
Select Case direction
Case "Next"
CurrentPage = CurrentPage + 1
Currentind = Currentind + PageSize
Case "Prv"
CurrentPage = CurrentPage - 1
Currentind = Currentind - PageSize
Case Else
CurrentPage = 1
Currentind = 0
End Select
DS = New DataSet()
MyCommand.Fill(DS, Currentind, PageSize, "gbook")
End Sub
Sub butPrv_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butPrv.Click
GetData("Prv")
MyDataList.DataSource = DS.Tables("gbook").DefaultView
MyDataList.DataBind()
If CurrentPage = 1 Then
butPrv.Enabled = False
Else
butPrv.Enabled = True
End If
butNext.Enabled = True
End Sub
Sub butNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butNext.Click
GetData("Next")
MyDataList.DataSource = DS.Tables("gbook").DefaultView
MyDataList.DataBind()
butPrv.Enabled = True
If CurrentPage = TotalPage Then
butNext.Enabled = False
Else
butNext.Enabled = True
End If
End SubTop




