UpdatePanel或PlaceHolder组件内的GridView分页

时间:2009-12-25 22:39:51

标签: c# asp.net ajax gridview updatepanel

我是ASP.NET的新手。

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

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

当我尝试添加分页时出现问题 - 每当用户单击“下一页”时,由于postBack整个页面都会刷新,我将丢失所有数据,页面返回Blank / Empty

我使用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();
    }
}

谢谢。

3 个答案:

答案 0 :(得分:1)

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

HTH

答案 1 :(得分:0)

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

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

如果您还使用ObjectDataSource,则只能使用分页;我从来没有能够使用GridView本身。

答案 2 :(得分:0)

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

对于我所看到的,John没有做任何无法在标记中声明的内容,因此不应该成为问题。如果由于某种原因不应在屏幕上显示gridview,则将占位符的Visible属性设置为false就足够了。

就分页问题而言,正如RickNz正确指出的那样,如果将gridview绑定到LinqDatasource,SqlDatasource或ObjectDatasource,它只会保留状态,但如果将它绑定到自定义业务对象,则需要执行的操作将数据保存在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;
  }