我正在使用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方法中做错了。
请帮忙吗?
答案 0 :(得分:1)
您正在尝试根据任意ID而不是实际索引从数组中获取值。但你根本不需要这样做。您无需在DataKeys
中存储您的ID,也无需使用项目索引访问任何内容。只需从CommandArgument
。
<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();