C# UpdatePanel或占位符组件内的GridView分页
我是ASP.NET新手 我正在开发ASP.NET C#web表单,动态创建C# UpdatePanel或占位符组件内的GridView分页,c#,asp.net,ajax,gridview,updatepanel,C#,Asp.net,Ajax,Gridview,Updatepanel,我是ASP.NET新手 我正在开发ASP.NET C#web表单,动态创建GridView组件,并使用从我的web服务接收的数据填充它们 我正在以编程方式在服务器端(cs文件)中创建这些GridView组件-它必须是灵活的-1个GridView,有时是10个GridView组件 当我尝试添加分页时会出现问题-每当用户单击“下一页”页面时,整个页面都会因为回发而刷新,我丢失了所有数据,页面返回空白/空 我使用了占位符来保存GridView组件,在搜索解决方案时,我发现UpdatePanel是一个更
GridView
组件,并使用从我的web服务接收的数据填充它们
我正在以编程方式在服务器端(cs文件)中创建这些GridView
组件-它必须是灵活的-1个GridView,有时是10个GridView
组件
当我尝试添加分页时会出现问题-每当用户单击“下一页”页面时,整个页面都会因为回发而刷新,我丢失了所有数据,页面返回空白/空
我使用了占位符
来保存GridView
组件,在搜索解决方案时,我发现UpdatePanel是一个更好的选择—据我所知,页面可以部分刷新—这意味着只需刷新UpdatePanel
,但它不起作用
下面的代码示例是我的测试,UpdatePanel是在客户端(.aspx
页面)启动的唯一组件,其余的在.cs
中以编程方式启动
如何解决上述问题
为什么整个页面都在刷新,而我却丢失了数据?
你能推荐另一种方法吗?能给我提供任何代码样本吗
如果我没有重建网格视图
,它就无法工作
这是我的Default.aspx.cs
public partial class TestAjaxForm : System.Web.UI.Page
{
DataTable table;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
bindGridView();
}
public void bindGridView()
{
GridView gridView1 = new GridView();
gridView1.AutoGenerateColumns = true;
gridView1.PageSize = 2;
gridView1.AllowPaging = true;
gridView1.PagerSettings.Mode = PagerButtons.Numeric;
gridView1.PagerSettings.Position = PagerPosition.Bottom;
gridView1.PagerSettings.PageButtonCount = 10;
gridView1.PageIndexChanging += new GridViewPageEventHandler(this.GridView1_PageIndexChanging);
table = new DataTable();
table.Columns.Add("FirstName");
table.Columns.Add("LastName");
DataRow row = table.NewRow();
row["FirstName"] = "John";
row["LastName"] = "Johnoson";
table.Rows.Add(row);
row = table.NewRow();
row["FirstName"] = "Johnny";
row["LastName"] = "Marley";
table.Rows.Add(row);
row = table.NewRow();
row["FirstName"] = "Kate";
row["LastName"] = "Li";
table.Rows.Add(row);
panel.ContentTemplateContainer.Controls.Add(gridView1);
gridView1.DataSource = table;
gridView1.DataBind();
}
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView gridView1 = (GridView)sender;
gridView1.PageIndex = e.NewPageIndex;
gridView1.DataSource = table;
gridView1.DataBind();
}
}
多谢各位 如果希望自定义GridView方法正常工作,则必须在每次加载页面时重新创建和绑定网格。。。这就是动态网格的问题。。。动态控件不保留它们的视图状态,但是如果添加了网格并动态生成列,这对您来说会更容易(因为我认为它可能会动态地记住列,或者您可以将AutoGenerateColumns设置为true,并引入数据行列名)
HTH您应该创建GridView并将其添加到PreInit或Init事件处理程序中的控件树中,以便它们有机会正确绑定到ViewState,并且无论是否有回发都应该这样做:如果您不在回发中添加它们,它们显然不会在那里显示任何内容 数据绑定可以在页面生命周期的后期进行
仅当您还使用ObjectDataSource时,分页似乎才起作用;我从未能够让它单独使用GridView。我认为最简单的方法是在占位符中的aspx页面中声明GridView,而占位符也包含在更新面板中 就我所见,John没有做任何不能在标记本身中声明的事情,所以这不应该是一个问题。如果出于某种原因gridview不应显示在屏幕上,则将占位符的Visible属性设置为false就足够了 就分页而言,正如RickNz正确指出的那样,只有将gridview绑定到LinqDatasource、SqlDatasource或ObjectDatasource时,它才会保留状态,但如果将其绑定到自定义业务对象,则需要在会话中保存数据,并在PageIndexChanged上重新绑定 在伪代码中,应该是这样的
Page_load
{
If (!IsPostBack)
Binddata();
}
private void Binddata()
{
var data = Getdata();
Gridview1.DataSource= data;
Gridview.DataBind();
Session["data"]=data; // cache the data
}
protected void Gridview1_indexchanged(object sender, GridviewPageEventArgs e)
{
var data= Session["data"];
Gridview1. DataSource=data;
Gridview1.DataBind();
GridView1.PageIndex=e.NewPageIndex;
}
嗨,布莱恩,谢谢。但正如我在上面所写的,我正在以编程方式创建gridView。我知道有一种方法可以处理回发并只刷新updatepanel而不是整个页面。。。我认为这是UpdatePanel的主要原因之一。我想说的是,您必须在每次加载页面时重新创建网格,这就是问题所在…如果可以修改页面以使用该方法,则在带有AutoGenerateColumns的页面上静态使用GridView是另一种选择。。。但只有你知道需求。很抱歉造成混淆。谢谢,我不确定在每个页面加载中创建gridview是否正确,从逻辑上讲,我确定有另一种方法可以只刷新页面的一部分。动态创建gridview可能很棘手,这是我的第二个建议,即在页面上包含控件,但更改其值。这样,ViewState将保留部分更改,而不是所有更改,您只需担心设置细节…谢谢,但分页对我来说很重要。我不确定您的意思。我试图让您知道如何使分页工作:使用ObjectDataSource。