Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UpdatePanel或占位符组件内的GridView分页_C#_Asp.net_Ajax_Gridview_Updatepanel - Fatal编程技术网

C# UpdatePanel或占位符组件内的GridView分页

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是一个更

我是ASP.NET新手

我正在开发ASP.NET C#web表单,动态创建
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。