【发布时间】:2017-01-04 19:59:18
【问题描述】:
我正在使用包含 4 列的 gridview,如下所示,我正在使用页面大小为 5 的 OnSelectedIndexChanged 和 OnPageIndexChanging 属性。
<asp:GridView ID="grid_data" PageSize="5" OnPageIndexChanging="grid_data_PageIndexChanging" OnSelectedIndexChanged="grid_data_SelectedIndexChanged" ShowFooter="true" AllowSorting="True" AllowPaging="true" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="ID" HeaderText="Data ID" SortExpression="ID" />
<asp:BoundField DataField="Name" HeaderText="Person Name" SortExpression="Name" />
<asp:BoundField DataField="Age" HeaderText="Age" SortExpression="Age" />
<asp:BoundField DataField="Address" HeaderText="Address" SortExpression="Address" />
<asp:CommandField ShowSelectButton="true" SelectText="View" CausesValidation="false" />
</Columns>
</asp:GridView>
每当我从命令字段单击View 时,应该会打开一个新窗口,我必须在其中仅显示此人的姓名和年龄,为此我已完成以下代码。
protected void grid_data_SelectedIndexChanged(object sender, EventArgs e)
{
Session["NAME"] = grid_data.Rows[grid_data.SelectedRow.DataItemIndex].Cells[1].Text.ToString();
Session["AGE"] = grid_data.Rows[grid_data.SelectedRow.DataItemIndex].Cells[2].Text.ToString();
ScriptManager.RegisterStartupScript(this, typeof(string), "OPEN_WINDOW", "window.open( 'Details.aspx', null, 'height=768,width=1024,status=yes,toolbar=no,scrollbars=yes,menubar=no,location=no,top=0,left=0,resizable=yes' );", true);
}
我从第 1 列和第 2 列中获取姓名和年龄并将它们存储在会话中,然后打开一个新窗口,在那里我将显示存储在会话中的这些值。
最初我的页面上有一个按钮,当我单击该按钮时,将执行查询并获取数据并填充到网格视图中,如下所示。
protected void button_getdata_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["String"].ConnectionString);
con.Open();
SqlCommand get = new SqlCommand("select * from PersonTable", con);
SqlDataAdapter data = new SqlDataAdapter(get);
DataTable dataTable = new DataTable();
data.Fill(dataTable);
ViewState["DATA"] = dataTable;
grid_data.DataSource = dataTable;
grid_data.DataBind();
con.Close();
}
然后我还通过将数据表存储在视图状态来完成如下页面处理。
protected void grid_data_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
grid_data.PageIndex = e.NewPageIndex;
grid_data.DataSource = ViewState["DATA"];
grid_data.DataBind();
}
现在,当我从 gridview 的第一页单击 View 获取数据后,它可以工作,我可以看到具有所需值的新窗口。但是当我转到下一页时,由于页面处理,页面正在完美加载,但在除第一页之外的任何其他页面中,如果我点击 View,我会收到以下错误。
Error: Sys.WebForms.PageRequestManagerServerErrorException: Index was out of range. Must be non-negative and less than the size of the collection.
参数名称:索引
当我尝试在线查看时,我才知道这是因为我们同时使用页面大小和分页,我们必须使用其他方法来识别所选行,而不是使用 grid_data.Rows[grid_data.SelectedRow.DataItemIndex].Cells[1].Text.ToString();。但我不确定该做什么以及如何去做。有没有其他方法可以正确访问所有页面中的行?还是我做错了什么?
此外,每当我尝试对列进行排序时,我都会收到以下错误。
Error: Sys.WebForms.PageRequestManagerServerErrorException: The GridView 'grid_data' fired event Sorting which wasn't handled.
我该如何处理排序的事情?
编辑
我找到了这个用于排序的链接,这确实有效。
【问题讨论】:
标签: javascript c# jquery asp.net gridview