2016-08-04 1 views
0

데이터베이스의 제품 목록을 표시하는 데 Listview를 사용하고 있습니다. OnPage로드 제품이 올바르게로드되지만 데이터 페이지 페이지 매김을 사용하여 페이지를 전환하려고하면이 오류가 발생합니다.Listview Datapager - 인덱스가 범위를 벗어났습니다. 음수가 아니어야하고 컬렉션 크기보다 작아야합니다.

인덱스가 범위를 벗어났습니다. 음수가 아니어야하며 콜렉션의 크기보다 작아야합니다. 매개 변수 이름 :

것 같은 경우입니다 shop.products_ItemDataBound (개체 보낸 사람, ListViewItemEventArgs 전자)에서 System.Web.UI.WebControls.DataKeyArray.get_Item (INT32 지수)에서 System.Collections.ArrayList.get_Item (INT32 지수)의 인덱스 ItemDataBound를 사용하면이 오류 만 발생합니다. 다른 페이지 매김은 정상적으로 작동합니다.

<asp:ListView ID="products" runat="server" DataKeyNames="ID" OnPagePropertiesChanging="OnPagePropertiesChanging"> 
          <ItemTemplate> 
           content 
          </ItemTemplate> 

          <LayoutTemplate> 
           <div id="itemPlaceholderContainer" runat="server" style=""> 
            <div runat="server" id="itemPlaceholder" /> 
           </div> 

           <div class="datapager"> 
            <asp:DataPager ID="DataPager1" ClientIDMode="Static" runat="server" PageSize="12" PagedControlID="products" ViewStateMode="Enabled"> 
             <Fields> 
              <asp:NextPreviousPagerField ButtonType="Link" ShowFirstPageButton="false" ShowPreviousPageButton="False" ShowNextPageButton="false" ButtonCssClass="nextPre" /> 
              <asp:NumericPagerField ButtonType="Link" ButtonCount="10" /> 

              <asp:NextPreviousPagerField ButtonType="Link" ShowNextPageButton="true" ShowLastPageButton="false" ShowPreviousPageButton="false" ButtonCssClass="nextPre" /> 
             </Fields> 
            </asp:DataPager> 
            <div class="clear"></div> 
           </div> 
          </LayoutTemplate> 

          <EmptyDataTemplate> 
           <strong>No Items Found....</strong> 
          </EmptyDataTemplate> 
         </asp:ListView> 

항목 바인딩

private void products_ItemDataBound(object sender, ListViewItemEventArgs e) 
    { 
     try { 
      if (e.Item.ItemType == ListViewItemType.DataItem) { 
       ListViewDataItem itm = (ListViewDataItem)e.Item; 
       string productID = products.DataKeys(itm.DataItemIndex)("ID"); 
       query = "SELECT stock_status FROM products WHERE ID = '" + productID + "'"; 
       DataTable dt = this.GetData(query); 
       if (dt.Rows.Count > 0) { 
        ((Label)e.Item.FindControl("checkReadyStock")).Text = dt.Rows(0)("stock_status").ToString; 

        if (((Label)e.Item.FindControl("checkReadyStock")).Text == "Ready Stock") { 
         ((Image)e.Item.FindControl("readyStock")).Visible = true; 
        } 
       } 
      } 
     } catch (Exception ex) { 
      Response.Write(ex); 
     } 
    } 

있는 DataPager 당신이

protected void OnPagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e) 
{ 
    (products.FindControl("DataPager1") as DataPager).SetPageProperties(e.StartRowIndex, e.MaximumRows, false); 
    products.DataSource = ViewState("Data"); 
    products.DataBind(); 
} 
+0

products_ItemDataBound에 오류가 여러 개 있습니다. 먼저 수정해야합니다. – VDWWD

+0

@VDWWD 어떤 오류가 있습니까? – SUN

+0

코드를 products_ItemDataBound에서 VS 2015로 복사하면 5 개의 오류가 발생합니다. – VDWWD

답변

0

을 시도 할 수 있습니다. 'ColumnNameWithID'를 올바른 이름으로 변경하면됩니다.

protected void products_ItemDataBound1(object sender, ListViewItemEventArgs e) 
{ 
    try 
    { 
     if (e.Item.ItemType == ListViewItemType.DataItem) 
     { 
      string productID = DataBinder.Eval(e.Item.DataItem, "ColumnNameWithID").ToString(); 
      string query = "SELECT stock_status FROM products WHERE ID = '" + productID + "'"; 
      DataTable dt = this.GetData(query); 
      if (dt.Rows.Count > 0) 
      { 
       ((Label)e.Item.FindControl("checkReadyStock")).Text = dt.Rows[0][2].ToString(); 
       if (((Label)e.Item.FindControl("checkReadyStock")).Text == "Ready Stock") 
       { 
        ((Image)e.Item.FindControl("readyStock")).Visible = true; 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     Response.Write(ex); 
    } 
} 
+0

만약 내가 primarykey 인 컬럼의 이름을 넣어야한다는 것을 의미한다면, ID는 내가 이미했던 컬럼의 이름입니다. – SUN

+0

맞습니다. 예를 들어 좀 더 읽기 쉬운 컬럼 이름을 사용했습니다. – VDWWD

관련 문제