0

500 以上のレコードを持つグリッドがあります。最初のページで、アイテムをランダムに選択して編集をクリックすると機能しますが、任意のページにページングした後、例外が発生します

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

クロスチェックしました: Viewstate が有効で、グリッドが適切にバインドされています。

以下は私のコードです:

/// <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 個ありますが、これで問題ありません。

4

3 に答える 3

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;
    }
}
于 2013-03-14T08:27:26.633 に答える
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;

ページングされたグリッドビューでチェックボックスを取得するには (現在のページでインデックスを使用):

CheckBox cb = (CheckBox)EditListGridView.Rows[i].FindControl("Include");
于 2015-07-21T14:58:58.843 に答える
0

GridView.Rows only returns all rows of the current page. You can use ViewState to store your comma separated values of ID's in the GridView.

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

You need to update the string in PageIndexChanging.

于 2012-10-08T10:13:51.567 に答える