我是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();
}
}
谢谢。
答案 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;
}