GridView分页问题

时间:2011-05-12 12:25:26

标签: asp.net sorting gridview paging

我正在使用gridview控件并手动执行分页和排序。 以下是分页的方法:

protected void gdvMainList_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gdvMainList.PageIndex = e.NewPageIndex;
        gdvMainList.DataSource = dtConsentReleaseList;
        gdvMainList.DataBind();
    }

我有一个静态数据表,其列号为Id:

dtConsentReleaseList.Columns.Add("Id");
            dtConsentReleaseList.Columns.Add("StartDate");
            dtConsentReleaseList.Columns.Add("EndDate");
            dtConsentReleaseList.Columns.Add("Contact");

我在GridView中分配datakeynames“Id”。 我每行还有一个打印按钮。当我单击该按钮时,此代码将被执行:

else if (e.CommandName == "New")
        {                
            int selectedIndex = Convert.ToInt32(e.CommandArgument);
            int consentReleaseId = Convert.ToInt32(gdvMainList.DataKeys[selectedIndex].Value);
            string openReportScript = Utility.OpenReport(ResolveClientUrl("~/Reports/Consumer/ConsentReleaseReport.aspx?Id=" + consentReleaseId + "&ReportTitle=ConsentForRelease"));
            ScriptManager.RegisterClientScriptBlock(upConsentRelease, upConsentRelease.GetType(), "Pop up", openReportScript, true);
        }

但是当我更改页面并单击打印按钮时,此行发生异常:

int consentReleaseId = Convert.ToInt32(gdvMainList.DataKeys[selectedIndex].Value);

例外是:

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

我想我在Paging方法中做错了。

请帮忙吗?

3 个答案:

答案 0 :(得分:1)

您正在尝试根据任意ID而不是实际索引从数组中获取值。但你根本不需要这样做。您无需在DataKeys中存储您的ID,也无需使用项目索引访问任何内容。只需从CommandArgument

中提取您的ID
<asp:ImageButton CommandName="New" CommandArgument='<%# Eval("Id") %>' ID="ibtnPrint" runat="server" ImageUrl="~/App_Themes/Default/images/print.png" />

然后在代码隐藏中:

int consentReleaseId = int.Parse(e.CommandArgument);

答案 1 :(得分:0)

我的猜测是你在代码隐藏(可能是page_load事件)中绑定gridview并且它不会在回发时保存值。

另外,尝试将Id作为CommandArgument传递。据我所知,如果您可以访问所选记录的Id,则根本不需要网格的行索引。 (默认情况下,GridView将行的索引作为CommandArgument传递)

答案 2 :(得分:0)

在设置数据源并绑定gridview之前设置datakeyname。

此外,

string[] dk = new string[1] {"MyID"};
myGridView.DataKeyNames = dk;
myGridView.DataSource = ds;
myGridView.DataBind();