2012-10-08 25 views
0

我有一個包含500多條記錄的網格。在第一頁,當我隨機選擇任何項目,點擊編輯,將工作,但呼叫到任何頁面後,它給了我異常索引超出了gridview及其綁定的範圍問題

> Index was out of range. Must be non-negative and less than the size of 
> the collection. Parameter name: index 

我有交叉檢查:視圖狀態已啓用,電網是否正確綁定。

下面是我的代碼:

/// <summary> 
/// Returns a comman separated value of the id selected in the grid. 
/// </summary> 
/// <param name="gv"></param> 
/// <param name="checkbox"></param> 
/// <returns></returns> 
public static string GetGridViewsSelectedRowValues(GridView gv, string checkbox) 
{ 
    var sb = new StringBuilder(); 
    if(gv.Rows.Count>0) 
    { 
     foreach (GridViewRow row in gv.Rows) 
     { 
      var cbx = (CheckBox) row.FindControl(checkbox); 
      if(cbx!=null && cbx.Checked) 
      { 
       var dataKey = gv.DataKeys[row.RowIndex]; 
       if (dataKey != null) sb.Append(string.Format("{0},", dataKey.Value)); 
      } 
     } 
    } 
    return sb.ToString().Remove(sb.ToString().LastIndexOf(',')); 
} 

我的編輯按鈕點擊事件:

protected void btnEdit_Click(object sender, EventArgs e) 
{ 
    int count = Common.GridSelectedRows(gvCityMaster, "chkBxSelect"); 
    if (count > 1) 
    { 
     Common.ShowMessage("Only one item can be edited at once."); 
    } 
    else 
    { 
     int id = Common.ParseInt(Common.GetGridViewsSelectedRowValues(gvCityMaster, "chkBxSelect")); 
     if (id > 0) 
     { 
      DisplayForm(); 
      DisplayUserDetails(id); 
     } 
    } 
} 

我甚看着DataKeys集合,它的每個集合,這是很好的在未來18。

+0

使用分頁'GridView.Rows'只返回當前頁面,不是所有頁面。 –

回答

1

GridView.Rows只返回當前頁面的所有行。您可以使用ViewState將ID的逗號分隔值存儲在GridView中。

private string SelectedIDs{ 
    get { 
     if (ViewState("SelectedIDs") == null { 
      ViewState("SelectedIDs") = ""; 
     } 
     return (String)ViewState("SelectedIDs"); 
    } 
    set { ViewState("SelectedIDs") = value; } 
} 

您需要更新PageIndexChanging中的字符串。

+0

對不起,延遲迴復。 AFAICU上面的一段代碼是用於在分頁時保持所選複選框的狀態..但是我需要的是,在分頁到某個頁面後,當我選中一個複選框並單擊刪除時,上面提到的代碼會給出錯誤。 –

+0

或者乾脆我可以在分頁後說if(cbx!= null && cbx.Checked) var dataKey = gv.DataKeys [row.RowIndex]; (dataKey!= null)sb.Append(string.Format(「{0},」,dataKey.Value)); }'停止工作 –

0

上述解決方案在分頁時不適用於我(使用C#.Net 4.5),所以我想出了另一種解決方案。

注:我在選擇而不是按鈕(第一個函數)上進行了編輯。

protected override void Render(System.Web.UI.HtmlTextWriter writer) 
{ 
    foreach (GridViewRow row in gridView.Rows) 
    { 
     if (row.RowType == DataControlRowType.DataRow) 
     { 
      row.Attributes["onclick"] = ClientScript.GetPostBackClientHyperlink(gridView, "Select$" + row.DataItemIndex, true); 
     } 
    } 
    base.Render(writer); 
} 

protected void trackingDataGV_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    gridView.PageIndex = e.NewPageIndex; 
    getGridViewData(); 
} 

protected void gridView_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    if (e.CommandName == "Select") 
    { 
     int pageSize = gridView.PageSize; 
     int pageIndex = gridView.PageIndex; 
     int rowIndex = Convert.ToInt32(e.CommandArgument); 
     int newRowIndex = 0; 

     if (pageIndex > 0) 
     { 
      newRowIndex = pageIndex * pageSize; 
      rowIndex = rowIndex - newRowIndex; 
     } 

    string valueXYZ = ((HiddenField)gridView.Rows[rowIndex].FindControl("valueXYZ")).Value; 
    } 
} 
0

如果你有一個模板領域內的複選框:

<asp:GridView ID="EditListGridView" runat="server" AutoGenerateColumns="false" AllowPaging="true" AllowSorting="true" PageSize="3" > 
    <Columns> 
     <asp:TemplateField> 
     <ItemTemplate> 
      <asp:CheckBox ID="Include" runat="server" OnCheckedChanged="Checkbox_Click" AutoPostBack="true" /> 
     </ItemTemplate> 
     </asp:TemplateField> 

得到總的指標,使用方法:

int i = ((GridViewRow)((Control)sender).Parent.Parent).DataItemIndex; 

爲了得到當前頁面上的索引,使用:

int i = ((GridViewRow)((Control)sender).Parent.Parent).RowIndex; 

要獲得分頁中的複選框g ridview(使用當前頁面的索引):

CheckBox cb = (CheckBox)EditListGridView.Rows[i].FindControl("Include");