2009-12-25 4 views
0

ASP.NET을 처음 사용했습니다.UpdatePanel 또는 PlaceHolder 구성 요소 내의 GridView 페이징

GridView 구성 요소를 동적으로 생성하고 내 웹 서비스에서받은 데이터를 사용하여 작성하는 ASP.NET C# 웹 양식을 개발하고 있습니다.

서버 측 (CS 파일)에 이러한 GridView 구성 요소를 프로그래밍 방식으로 생성합니다. 유연해야합니다 - 1 GridView이고 때로는 10 GridView 구성 요소입니다.

페이지 매김을 추가하려고 할 때 문제가 발생합니다 - 사용자가 "다음"페이지를 클릭 할 때마다 전체 페이지가 포스트 백 때문에 새로 고쳐지고 모든 데이터가 손실되고 페이지가 비어 있음/빈. 단지 UpdatePanel 새로 고칠하는 것을 의미한다 - 내가 페이지를 부분적으로 새로 고칠 수 있습니다 이해까지로 - 해결책을 찾고, 내가 더 나은 대안으로 UpdatePanel을 발견하면서

가 나는 GridView 구성 요소를 개최 PlaceHolder을 사용했다. 하지만 작동하지 않습니다.

다음 코드 샘플은 내 테스트입니다. 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 접근 방식을 사용하려면 모든 페이지로드시 그리드를 다시 만들고 리바운드해야합니다 ... 동적 그리드의 문제입니다 ... 동적 컨트롤은 해당 viewstate를 유지하지 않지만 그리드를 추가하고 동적으로 열을 생성 했으므로 더 쉽게 작업 할 수 있습니다. 열을 동적으로 기억할 수도 있고 AutoGenerateColumns를 true로 설정할 수도 있고 데이터 행 열 이름을 가져올 수 있기 때문입니다.

HTH

+0

안녕하세요, Brian, 감사합니다. 그러나 위에서 쓴 것처럼 프로그래밍 방식으로 gridView를 만들고 있습니다. 나는 포스트 백을 처리하고 전체 페이지가 아닌 오직 updatepanel을 새로 고치는 방법이 있다는 것을 이해합니다 ... 이것이 UpdatePanel의 주된 이유 중 하나라고 생각합니다. – John

+0

제가 말하고자하는 것은 모든 페이지로드시 Grid를 다시 만들어야한다는 것입니다. 그게 바로 문제입니다 ... –

+0

AutoGenerateColumns가있는 페이지에서 GridView를 정적으로 사용하는 것은 가능한 경우 페이지를 수정할 수있는 대안입니다 접근 ...하지만 당신은 그 지식을 알 수 있습니다. 혼란을 드려 죄송합니다. –

0

당신은 당신의 GridView를 생성하고 제대로 ViewState에 결합 할 수있는 기회를 가질 수 있도록 PreInit 또는 초기화 이벤트 처리기에서 컨트롤 트리에 추가하고, 거기에 있는지 여부를 수행해야한다 다시 게시 : 포스트 백에 추가하지 않으면 분명히 아무것도 표시되지 않습니다.

데이터 바인딩은 페이지 수명주기의 나중에 발생할 수 있습니다.

페이징은 ObjectDataSource도 사용하는 경우에만 작동하는 것 같습니다. 나는 그 자체로 GridView와 함께 작업 할 수 없었다.

+0

감사합니다. 그러나 페이징은 중요합니다. – John

+0

무슨 뜻인지 모르겠습니다. 나는 페이징 작업을하는 법을 알려주기 위해 ObjectDataSource를 사용했다. – RickNZ

0

내가 할 가장 쉬운 방법은 장소 소유자가 업데이트 패널 안에 포함되어 있지만 자리 표시 자 안의 aspx 페이지에 선언 된 gridview를 사용하는 것입니다.

내가 볼 수있는 것처럼 John은 마크 업 자체에서 선언 할 수없는 작업을하지 않으므로 문제가되지 않습니다.어떤 이유로 화면에 gridview가 표시되어서는 안되면 자리 표시 자의 Visible 속성을 false로 설정하면됩니다.

RickNz가 올바르게 지적했듯이 페이징과 관련하여 LinqDatasource, SqlDatasource 또는 ObjectDatasource에 GridView를 바인딩하는 경우에만 상태가 유지되지만 사용자 지정 비즈니스 개체에 바인딩하면 필요한 작업 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; 
    } 
관련 문제