我使用的是带有C#的ASP.NET 4.0 (Visual Web Developer2010Express)。
我已经成功地使用声明性ASP.NET代码实现了一个绑定到存储过程数据源的简单GridView,如下所示:
<asp:GridView
ID="grdTrades"
runat="server"
DataKeyNames="tradeId"
EnablePersistedSelection="true"
SelectedRowStyle-BackColor="Yellow"
AllowPaging="true"
AllowSorting="true"
PageSize = "20"
AutoGenerateColumns="false"
DataSourceID="sdsTrades"
>
<Columns>
<asp:CommandField ShowSelectButton="true" ButtonType="Link" SelectText="Select" />
<asp:BoundField DataField="tradeId" HeaderText="TradeId" ReadOnly="True" SortExpression="tradeId" />
< ... more columns ... >
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="sdsTrades" runat="server"
ConnectionString="<%$ ConnectionStrings:TradesDB %>"
ProviderName="<%$ ConnectionStrings:Trades.ProviderName %>"
SelectCommand="usp_GetTrades" SelectCommandType="StoredProcedure">
</asp:SqlDataSource>
它工作得很好,包括分页和排序。我想删除SqlDataSource并使用代码隐藏(我试图将数据库访问代码放在一个地方)。到目前为止,我在我的代码隐藏中有以下内容:
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
grdTrades.SelectedIndex = 0;
DBUtil DB = new DBUtil();
grdTrades.DataSource = DB.GetTrades();
grdTrades.DataKeyNames = new string[] { "tradeId" };
grdTrades.DataBind();
}
}
// this is needed otherwise I get "The GridView 'grdTrades' fired event PageIndexChanging which wasn't handled."
void grdTrades_PageIndexChanging(Object sender, GridViewPageEventArgs e)
{
grdTrades.PageIndex = e.NewPageIndex;
grdTrades.DataBind();
}
我的声明性代码现在看起来像这样:
<asp:GridView
ID="grdTrades"
runat="server"
EnablePersistedSelection="true"
SelectedRowStyle-BackColor="Yellow"
AllowPaging="true"
AllowSorting="true"
PageSize = "20"
AutoGenerateColumns="false"
OnPageIndexChanging="grdTrades_PageIndexChanging"
>
<Columns>
<asp:CommandField ShowSelectButton="true" ButtonType="Link" SelectText="Select" />
<asp:BoundField DataField="tradeId" HeaderText="TradeId" ReadOnly="True" SortExpression="tradeId" />
< ... more columns ... >
</Columns>
</asp:GridView>
问题是当我点击一个页码时,页面变成了空白。我也想实现排序,但希望首先让分页工作。请帮帮忙。
谢谢
发布于 2010-11-03 21:49:48
您需要在每次更改页面时绑定您的GridView。
例如:
void grdTrades_PageIndexChanging(Object sender, GridViewPageEventArgs e)
{
grdTrades.DataSource = DB.GetTrades();
grdTrades.PageIndex = e.NewPageIndex;
grdTrades.DataBind();
}
我的建议是将来自DB.GetTrades()
的结果存储在ViewState (或缓存)中,这样您就不必在每次更改页面时都去数据库。
不过,在执行此操作时,排序可能会变得相当困难。
您可以始终使用ObjectDataSource而不是SqlDatasource。然后,您可以指向ObjectDataSource来查看您的DB.GetTrades()
函数。排序和分页将自动工作。
希望这能有所帮助。
发布于 2013-02-18 17:23:50
您可以创建一个方法来绑定网格视图,而不是在分页中再次绑定它。通过创建绑定网格视图的方法,您可以随时调用该方法来绑定网格视图。
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
BindgrdTrades();
}
private void BindgrdTrades()
{
DBUtil DB = new DBUtil();
grdTrades.DataSource = DB.GetTrades();
grdTrades.DataKeyNames = new string[] { "tradeId" };
grdTrades.DataBind();
}
}
void grdTrades_PageIndexChanging(Object sender, GridViewPageEventArgs e)
{
grdTrades.PageIndex = e.NewPageIndex;
BindgrdTrades();
}
}
发布于 2014-02-06 05:56:08
我不得不向公众公开我的_PageIndexChanging (我是asp.net的新手,我不知道这有什么关系)。页面会通过一个错误来说明它找不到这个类。这些帖子对使用接近逐字逻辑的分页非常有帮助。感谢所有的海报花时间把它展示得如此清晰。下面是我最后使用的代码:
public partial class Requests : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
BindgrdBuilds();
}
}
private void BindgrdBuilds()
{
// Link GridView to datasource
GridView1.DataSource = BuildData.getBuilddata();
// Bind SQLDataSource to GridView after retrieving the records.
GridView1.DataBind();
}
public void GridView1_PageIndexChanging(Object sender, GridViewPageEventArgs e)
{
// increment PageIndex
GridView1.PageIndex = e.NewPageIndex;
// bind table again
BindgrdBuilds();
}
}
我坚持使用AutoGenerated列,并对cs页面上的数据进行了一些行绑定,但上面没有包含这些行,但下面是我的GridView代码:
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<asp:GridView ID="GridView1"
OnRowDataBound="GridView1_RowDataBound"
OnPageIndexChanging="GridView1_PageIndexChanging"
runat="server"
SelectedRowStyle-BackColor="Yellow"
AllowPaging="true"
AllowSorting="true"
PageSize = "20"
AutoGenerateColumns="true"
<-- table formatting code trimmed -->
</asp:GridView>
我希望其他人可以利用这个信息,这个帖子是一个很好的,简单的例子。现在分页起作用了,是时候来点真正的花样了,为GridView1想出一个新名字:D
https://stackoverflow.com/questions/4085410
复制相似问题