2009-12-25 45 views
0

我是ASP.NET新手。UpdatePanel或PlaceHolder组件中的GridView分页

我正在开发ASP.NET C#web表单,它动态创建GridView组件并使用从我的web服务接收的数据填充它们。

我以编程方式在服务器端(cs文件)中创建这些GridView组件 - 它必须灵活 - 1个GridView,有时需要10个GridView组件。

当我尝试添加分页时会出现问题 - 每当用户单击“下一页”页面时,整个页面因为postBack而被刷新,我将丢失所有数据并返回页面空白/空。

我用PlaceHolder举行GridView组件,而寻找解决的办法,我发现的UpdatePanel作为一个更好的选择 - 因为据我了解页面可以部分更新 - 这意味着,只有UpdatePanel已被刷新。 ..但它不起作用。

以下代码示例是我的TEST,UpdatePanel是在客户端发起的唯一组件(.aspx页面),其余的以编程方式在.cs中启动。

我该如何解决上述问题?

为什么整个页面都会刷新,并且我丢失了我的数据? 你能推荐别的方法吗?可以提供我任何代码示例?

如果我不重建GridView,这是行不通的......

这里是我的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(); 
    } 
} 

谢谢。

回答

1

如果你想要一个自定义的GridView方法来工作,你必须重新创建和重新绑定每个页面上的网格......这是动态网格的问题......动态控件不保留它们的视图状态,但是如果你添加网格并动态生成列,这对您更容易(因为我认为它可以动态记住列,或者可以将AutoGenerateColumns设置为true,并且它会引入数据行列名称)。

HTH

+0

嗨,布赖恩,谢谢。但正如我上面写的,我正在编程创建gridView。我知道有一种方法来处理回发和刷新只有更新面板,而不是整个页面...我认为这是UpdatePanel的主要原因之一。 – John 2009-12-26 02:43:36

+0

我在说的是,你必须在每一页加载时重新创建Grid,这就是问题所在...... – 2009-12-26 03:50:50

+0

如果可以修改页面以使用该页面,则可以使用AutoGenerateColumns在页面上静态地使用GridView方法...但只有你知道需求。对困惑感到抱歉。 – 2009-12-26 03:53:37

0

您应该创建GridView控件,并将其添加到控制树的PreInit或Init事件处理程序,使他们有正确绑定到ViewState的一个机会,它应该做是否有一个回发:如果你不在回发中添加它们,他们显然不会在那里显示任何内容。

DataBinding可以在页面生命周期的稍后阶段发生。

只有在您还使用ObjectDataSource的情况下,分页似乎才有效;我从来没有能够单独使用GridView。

+0

谢谢,但分页对我很重要。 – John 2009-12-27 12:38:21

+0

我不确定你的意思。我试图让你知道如何进行分页工作:使用ObjectDataSource。 – RickNZ 2009-12-27 22:03:37

0

我认为最简单的做法是在占位符内的aspx页面中声明gridview,而占位符也包含在更新面板内。

对于我所看到的,约翰没有做任何无法在标记本身中声明的事情,所以这不应该是一个问题。如果由于某种原因Gridview不应该显示在屏幕上,只需将占位符的Visible属性设置为false即可。对于分页而言,正如RickNz正确指出的那样,只有在将GridView绑定到LinqDatasource,SqlDatasource或ObjectDatasource时,它才会保留状态,但如果将其绑定到自定义业务对象,则需要do是将数据保存在Session中,然后再重新绑定到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; 
    }