【问题标题】:GridView paging inside an UpdatePanel or PlaceHolder componentsUpdatePanel 或 PlaceHolder 组件中的 GridView 分页
【发布时间】:2010-12-30 01:06:24
【问题描述】:

我是 ASP.NET 的新手。

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

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

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

我使用PlaceHolder 来保存GridView 组件,在寻找解决方案时,我发现UpdatePanel 是一个更好的选择——据我所知,页面可以部分刷新——这意味着只有UpdatePanel必须刷新...但它不起作用。

以下代码示例是我的测试,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();
    }
}

谢谢。

【问题讨论】:

    标签: c# asp.net ajax gridview updatepanel


    【解决方案1】:

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

    HTH

    【讨论】:

    • 嗨,布赖恩,谢谢。但正如我上面所写,我正在以编程方式创建 gridView。我知道有一种方法可以处理回发并仅刷新更新面板而不是整个页面...我认为这是更新面板的主要原因之一。
    • 我的意思是你必须在每次页面加载时重新创建网格,这就是问题所在......
    • 使用 AutoGenerateColumns 在页面上静态使用 GridView 是一种替代方法,如果可以修改页面以使用该方法......但只有您知道要求。很抱歉造成混乱。
    • 谢谢,我不确定在每个页面加载中创建网格视图是否正确,从逻辑上讲,我确定还有另一种方法可以只刷新页面的一部分。
    • 动态创建网格视图可能很棘手,这是我在页面上包含控件但更改其值的第二个建议。这样,ViewState 将保留部分更改,您只需要担心设置细节...
    【解决方案2】:

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

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

    分页似乎只在您还使用 ObjectDataSource 时才有效;我从来没有能够让它自己与 GridView 一起工作。

    【讨论】:

    • 谢谢,但分页对我很重要。
    • 我不确定你的意思。我试图让你知道如何使分页工作:使用 ObjectDataSource。
    【解决方案3】:

    我认为最简单的做法是在占位符内的 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;
      }
    

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2011-06-15
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多