2012-05-18 4 views
0

C# asp.net listview에서 이상한 문제가 발생하여 정확한 원인과 문제점을 지적 할 수 없습니다. 시나리오는 다음과 같습니다DataSource가 채워지면 listview는 바인딩하지만 EmptyDataTemplate을 표시합니다.

AutoCompleteExtender를 사용하는 검색 텍스트 상자가 있습니다. PageLoad()에서 DataTable에서 추출 된 데이터 묶음이 목록보기에 채워집니다. 누군가가 텍스트 상자에 뭔가를 입력하면 webservice에서 결과를 가져 와서 DataTable에 결과를 채우면 listview가 DataTable에 바인딩됩니다.

모든 것이 정상적으로 작동합니다. listview는 처음에 제대로 작동하는 DataPager로 바인딩합니다. listview의 첫 번째 페이지에서 사용자가 검색을 입력하면 listview가 바인딩되어 새 결과를 표시합니다.

그러나 두 번째 페이지 이상인 경우 listview는 바인딩되지만 EmptyDataTemplate을 표시합니다. DataTable을 검사하여 listview.DataBind 전에 새 데이터로 채워지는지 확인합니다. 문제는 목록 뷰의 1 페이지에서 벗어날 때만 발생합니다.

ASPX

<asp:ListView ID="productList" runat="server" onitemcommand="productList_ItemCommand" DataKeyNames="PrimaryID"> 

      <LayoutTemplate> 
      <table> 
      <tr runat="server"> 
       <th runat="server">Actions</th> 
       <th runat="server">PrimaryID</th> 
       <th runat="server">Product</th> 
      <th runat="server">Description</th> 
      </tr> 
      <tr runat="server" id="itemPlaceholder" /> 
      </table> 
     <asp:DataPager runat="server" ID="productDataPager" PageSize="20" PagedControlID="productList" QueryStringField="pageNumber"> 
      <Fields> 
       <asp:NextPreviousPagerField ButtonType="Image" ShowFirstPageButton="true" ShowNextPageButton="false" ShowPreviousPageButton="false" FirstPageText="|&lt;&lt; " /> 
       <asp:NumericPagerField ButtonCount="10" /> 
       <asp:NextPreviousPagerField ButtonType="Image" ShowLastPageButton="true" ShowNextPageButton="false" ShowPreviousPageButton="false" LastPageText=" &gt;&gt;|" /> 

      </Fields> 
      </asp:DataPager>  
     </LayoutTemplate> 

     <ItemTemplate> 
      <tr id="Tr1" class="even" runat="server"> 
      <td> 
       <asp:LinkButton ID="EditButton" runat="Server" Text="Edit" CommandName="Edit_product"/> 
      </td> 

      <td"> 
       <asp:Label ID="primarylbl" runat="Server" Text='<%#Bind("PrimaryID") %>' /> 
      </td> 
      <td> 
       <asp:Label ID="productlbl" runat="Server" Text='<%#Bind("Product") %>' /> 
      </td> 
      <td> 
       <asp:Label ID="descriptionlbl" runat="Server" Text='<%#Bind("Description") %>' />   </td> 
      </tr> 
     </ItemTemplate> 
     <AlternatingItemTemplate> 
     <tr id="Tr1" class="odd" runat="server"> 
      <td> 
       <asp:LinkButton ID="EditButton" runat="Server" Text="Edit" CommandName="Edit_product"/> 
      </td> 

      <td> 
       <asp:Label ID="primarylbl" runat="Server" Text='<%#Bind("PrimaryID") %>' /> 
      </td> 
      <td> 
       <asp:Label ID="productlbl" runat="Server" Text='<%#Bind("Product") %>' /> 
      </td> 
      <td> 
       <asp:Label ID="descriptionlbl" runat="Server" Text='<%#Bind("Description") %>' /> 
      </td> 
      </tr> 

     </AlternatingItemTemplate> 

     <EmptyDataTemplate> 
     No Records Found 
     </EmptyDataTemplate> 
      </asp:ListView> 

코드 숨김

protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       string productkey = "0"; 
       getWeb(productkey); //call WebService to get all Products 

      } 

     } 

    private void createTable(Products[] product) 
     { 


      DataTable productTable = new DataTable(); 
      productTable.Columns.Add(new DataColumn("PrimaryID", typeof(string))); 
      prouctTable.Columns.Add(new DataColumn("Product", typeof(string))); 
      productTable.Columns.Add(new DataColumn("Description", typeof(string))); 

      for (int i = 0; i < product.Length; i++) 
      { 

       DataRow dr = productTable.NewRow(); 
       dr["PrimaryID"] = product[i].PrimaryID.ToString(); 
       dr["Product"] = product[i].Product.ToString(); 
       dr["Description"] product[i].Description.ToString(); 


       productTable.Rows.Add(dr); 
       productTable.AcceptChanges(); 
      } 


      bindtoList(productTable); 

protected void bindtoList(DataTable prodTab) 
     { 
      if (productList.DataSource == null) 
      { 
       productList.DataSource = prodTab; 
       productList.DataBind(); 

       Updatepanel1.Update(); 
      } 
      else 
      { 
       productList.DataSource = null; 
       productList.DataSource = proTab; 
       productList.DataBind(); 
      } 


      if (prodTab.Rows.Count > 20) 
      { 
       ((DataPager)productList.FindControl("productDataPager")).Visible = true; 
      } 
      else 
      { 

       if (((DataPager)productList.FindControl("productDataPager")) != null && ((DataPager)productList.FindControl("productDataPager")).Visible == true) 
       { 
        ((DataPager)productList.FindControl("productDataPager")).Visible = false; 
       } 
      } 

     } 
+0

HTML 마크 업과 코드를 게시 할 수 있습니까 ?? –

+0

코드가 추가되었습니다. 문제가있는 곳에서 당신의 intial take는 무엇입니까? – Dee

+0

이'createTable'이 불려질 때? –

답변

0

난 당신이 DataPager에서 QueryStringField="pageNumber"을 제거 할 필요가 있다고 생각합니다.

페이지 번호에서 아무 것도 검색하지 않는 것이 문제입니다. x 결과가 x 페이지보다 작 으면 목록보기에 빈 데이터 템플리트가 표시됩니다.

결과가 x 개 이상이면 페이지 목록보기에 페이지 번호가 포함 된 결과가 표시됩니다. 엑스.

그리고 검색 결과가 x 개 이상이면 listview가 포함 된 새 결과에서 페이지를 변경하면 listview의 데이터 소스가 처음으로 변경됩니다.

QueryStringField="pageNumber" 부분을 제거하면 문제가 해결됩니다. 당신의 <LayoutTemplate>

<LayoutTemplate> 
      <table> 
      <tr runat="server"> 
       <th runat="server">Actions</th> 
       <th runat="server">PrimaryID</th> 
       <th runat="server">Product</th> 
      <th runat="server">Description</th> 
      </tr> 
           <tr ID="itemPlaceholder" runat="server"> 
           </tr> 
          </table> 
         </td> 
        </tr> 
        <tr runat="server"> 
         <td runat="server"> 
          <asp:DataPager ID="DataPager1" runat="server" pagesize="20"> 
           <Fields> 
       <asp:NextPreviousPagerField ButtonType="Image" ShowFirstPageButton="true" ShowNextPageButton="false" ShowPreviousPageButton="false" FirstPageText="|&lt;&lt; " /> 
       <asp:NumericPagerField ButtonCount="10" /> 
       <asp:NextPreviousPagerField ButtonType="Image" ShowLastPageButton="true" ShowNextPageButton="false" ShowPreviousPageButton="false" LastPageText=" &gt;&gt;|" /> 

      </Fields> 
          </asp:DataPager> 
         </td> 
        </tr> 
       </table> 
      </LayoutTemplate> 
+0

QueryStringField가 제거되면 다른 페이지로 이동할 수 없습니다. DataPager가 없으면 작동하지 않는 것 같습니다. 내가 놓친 게 있니? – Dee

0

편집
사용이 내가 생각하는 그 getWeb (의 Productkey); 페이지를 변경하면 포스트 백 (신선한 Get이 아닌)이 만들어 지므로 테이블이 null이됩니다 (또는 적어도 그리드에서 작동하는 방식이기 때문에) "if (! PostBack)"외부에서 호출해야합니다.

+0

그러나'getWeb (productkey);'가'if (! PostBack)'외부에서 호출되면'productkey'는 ** 할당되지 않은 변수 **가됩니다. –

+0

솔직히 말해서 bindtoList 함수에서 테이블이 null이 되길 바랍니다. 적어도 나는 무엇을 찾을지를 안다. 그러나 전달 된 DataTable이 null이 아니라는 점에서 문제가 있습니다. bindtoList 함수에서 DataTable prodTab에서 데이터를 추출 할 수있었습니다. – Dee

0

해결 방법을 찾았습니다. 문제의 실제 원인을 실제로 해결하지 못했기 때문에 어리석은 방법 일 수 있습니다.

여기 해결책이다 :

기존리스트 PagerNumber = 1 일 때리스트 뷰에서만 표시 결과를 검색 할 것이므로, I가있는 DataPager는 DataPager.SetPageProperties (0, DataPager.PageSize, TRUE)을 사용 resetted. 그게 효과가 있었어! 난

아직도 내가

이 어쨌든, 당신의 도움에 대해 감사합니다 ...로 시작하는이 문제에 봉착 이유를 의아해.

관련 문제