将 GridView 从一个页面传递 ASP.Net 另一个页面
本文关键字:ASP 另一个 Net 一个 GridView | 更新日期: 2023-09-27 18:34:28
我想将所有网格视图值传递到另一个页面我在患者详细信息.aspx页面中有一个网格视图,还有一个按钮,如下所示
<asp:GridView ID="gvDoctorList" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1"
AllowPaging="True" AllowSorting="True" AutoGenerateEditButton="true" AutoGenerateSelectButton="true"
AutoGenerateDeleteButton="true" OnSelectedIndexChanged="gvDoctorList_SelectedIndexChanged" OnRowCommand="gvDoctorList_RowCommand">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox runat="server" ID="chk" OnCheckedChanged="chk_CheckedChanged" AutoPostBack="true" />
<asp:Label runat="server" ID="lblPID" Visible="false" Text='<%# Eval("PatientId") %>'></asp:Label>
<asp:Button ID="btnSelect" runat="server" Text="Select" CommandName = "Select" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="PatientId" HeaderText="PatientId" SortExpression="PatientId" />
<asp:BoundField DataField="firstname" HeaderText="firstname" SortExpression="firstname" />
<asp:BoundField DataField="lastname" HeaderText="lastname" SortExpression="lastname" />
<asp:BoundField DataField="sex" HeaderText="sex" SortExpression="sex" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MyDatabaseConnectionString %>"
SelectCommand="SELECT [PatientId],[firstname], [lastname], [sex] FROM [PatientDetails]"></asp:SqlDataSource>
<asp:Button ID="btnformatric" runat="server" Text="formatric3d" OnClick="btnformatric_Click" OnCommand="btnformatric_Command" />
在患者详细信息的代码隐藏中.aspx如下所示
protected void btnformatric_Click(object sender, EventArgs e)
{
if (gvDoctorList.SelectedRow != null)
{
Server.Transfer("Patientstaticformatrix.aspx");
}
else
{
ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Please select a row.')", true);
}
}
现在在第二页名称 Patientstaticformatrix 上.aspx后面的代码如下
protected void Page_Load(object sender, EventArgs e)
{
if (this.Page.PreviousPage != null)
{
GridView gvDoctorList = (GridView)this.Page.PreviousPage.FindControl("gvDoctorList");
GridViewRow selectedRow = gvDoctorList.SelectedRow;
Response.Write("PatientId: " + selectedRow.Cells[0].Text + "<br />");
Response.Write("firstname: " + selectedRow.Cells[1].Text + "<br />");
Response.Write("lastname: " + selectedRow.Cells[2].Text + "<br />");
}
}
我已经在第二页调试了代码....gvDoctorList 的值为 null,并且 selectedRow 显示 nullreference 的错误。
你能告诉我我错在哪里吗?
正如我也看到了你之前的问题,所以我可以向你建议一件事,而不是将你的网格视图保留在会话中(这很昂贵(,你可以使用RowCommand
事件,在这里button
之后,我认为你不需要复选框或chk_CheckedChanged
事件,你可以将PatientID
传递到下一页,在那里你可以编写查询将选定的行数据插入到你的新表中。
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox runat="server" ID="chk" OnCheckedChanged="chk_CheckedChanged"
AutoPostBack="true" />
<asp:Label runat="server" ID="lblPID" Visible="false" Text='<%# Eval("PatientId") %>'>
</asp:Label>
<asp:Button ID="btnSelect" runat="server" Text="Select" CommandArgument='<%#
Eval("PatientId") %>' CommandName = "Select" />
</ItemTemplate>
</asp:TemplateField>
protected void gvDoctorList_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "select")
{
int pID = Convert.ToInt32(e.CommandArgument);
// either put ID in session and check
Session["PatientID"] = Convert.ToString(pID);
Server.Transfer("Patientstaticformatrix.aspx");
}
}
page_Load事件
protected void Page_Load(object sender, EventArgs e)
{
string pID = Convert.ToString(Session["PatientID"]);
if(!string.IsNullOrEmpty(pID))
{
int patientID = Convert.ToInt32(pID);
//Call Stored procedure which will insert this record with this ID
// to another table
}
}
尝试使用会话变量。可以将 GridView 设置为会话变量,只要同一会话仍处于活动状态,以后就可以检索该变量。
您可以使用以下代码在第一页上设置会话变量:
Session["gvDoctorList"] = gvDoctorList;
然后从第二页上的变量中检索:
GridView gvDoctorList = (GridView)Session["gvDoctorList"];
有关会话的详细信息,请参阅 MSDN 会话状态概述。
我决定根据艾哈迈德的正确评论添加第二个答案,由于内存问题,会话变量确实不应该保存网格视图的数据量。
以下内容应该相应地适用于我假设您正在做的事情:
本质上,当您选择要转到下一页的行时,您正在尝试将该行的数据检索到新页面上。这个假设正确吗?如果是这样,那么您有许多选项供您使用。
同样,您可以使用会话变量来存储一旦在第一页上提取的行的数据:
protected void btnformatric_Click(object sender, EventArgs e) {
if (gvDoctorList.SelectedRow != null) {
GridViewRow selectedRow = gvDoctorList.SelectedRow;
Session["PatientId"] = selectedRow.Cells[0].Text;
Session["firstname"] = selectedRow.Cells[1].Text;
Session["lastname"] = selectedRow.Cells[2].Text;
Server.Transfer("Patientstaticformatrix.aspx");
} else {
ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Please select a row.')", true);
}
}
基本上,您在第一页上,并从该行中获取数据。然后,将此数据存储在会话变量中,可以使用以下命令从下一页查找数据:
protected void Page_Load(object sender, EventArgs e) {
if (this.Page.PreviousPage != null) {
//Retrieve values from Session Variables
Response.Write("PatientId: " + Session["PatientId"].ToString() + "<br />");
Response.Write("firstname: " + Session["firstname"].ToString() + "<br />");
Response.Write("lastname: " + Session["lastname"].ToString() + "<br />");
}
}
您还可以使用查询字符串传递数据的第二个选项。尽管对于这种方法,我相信您将不得不更改Server.Transfer("Patientstaticformatrix.aspx");
才能Response.Redirect("Patientstaticformatrix.aspx");
下面是使用查询字符串的示例:
protected void btnformatric_Click(object sender, EventArgs e) {
if (gvDoctorList.SelectedRow != null) {
GridViewRow selectedRow = gvDoctorList.SelectedRow;
//Create URL with Query strings to redirect to new page
Response.Redirect("Patientstaticformatrix.aspx?parentid=" + selectedRow.Cells[0].Text + "&firstname=" + selectedRow.Cells[1].Text + "&lastname=" + selectedRow.Cells[2].Text);
} else {
ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Please select a row.')", true);
}
}
并从第二页上的Request.QueryString
对象中检索值。
protected void Page_Load(object sender, EventArgs e) {
if (this.Page.PreviousPage != null) {
//Retrieve values from Query Strings
Response.Write("PatientId: " + Request.QueryString["parentid"].ToString() + "<br />");
Response.Write("firstname: " + Request.QueryString["firstname"].ToString() + "<br />");
Response.Write("lastname: " + Request.QueryString["lastname"].ToString() + "<br />");
}
}
这两种解决方案都应该满足您的要求,但它们都略有不同。Session Variable
解决方案可能是首选方法,因为它将阻止用户查看传递的所有数据(如果需要传递机密信息(,而查询字符串值将可供任何可以看到 URL 的人使用。
有关会话变量和查询字符串的详细信息,请参阅以下资源:
ASP.NET 会话状态概述
请求.查询字符串集合
@Nunners答案是自己的,但也可以尝试以下方法:
在Anothoer页面的PageLoad事件获取网格上,如下所示:
GridView GridView1 = (GridView)this.Page.PreviousPage.FindControl("GridView1");
所有技术如下:
http://www.aspsnippets.com/Articles/Pass-Selected-Row-of-ASPNet-GridView-control-to-another-Page.aspx
请参阅上面的文档。
真正的答案是您应该在另一个页面上创建相同的网格视图。这就是 99% ASP.NET 网站的工作方式,因为该页面在某个时候会写入/更新/删除数据。或者只是使用相同的页面 - 为什么要重定向以显示相同的数据?
我找到了一些解决方案:
在网格数据绑定后的源 aspx 中:
Session["gridtoexcel"] = yourgrid;
在目标 aspx 中
var grid = ((GridView)Session["gridtoexcel"]);
gridToExcel.Columns.Clear();
foreach (DataControlField col in grid.Columns)
gridToExcel.Columns.Add(col);
gridToExcel.DataSource = grid.DataSource;
gridToExcel.DataBind();
这样,我可以将确切的网格"克隆"到另一个页面。 如果您需要一些CSS样式,请不要忘记将它们添加到目标页面中
PS:网格到Excel是你的目标网格