我是ASP.NET的新手。我有一个学期项目;我面临的问题描述如下:
User
的ArrayList,它被绑定为Gridview的数据源
Contacts
。 我想要做的是,当我点击gridview中的联系人时,我想要打开一个新页面,该页面将提供所选联系人的详细信息。为此,我需要Session
变量中的联系人。
我的问题是我不知道如何从GridView中“提取”所选对象。我尝试了事件SelectedIndexChanged
,但这不起作用,因为响应未重定向到新页面。
我考虑过将GV的一个列设置为超链接字段,但这会将响应重定向到新页面。它不会将所选联系人存储在会话变量中。
编辑:(代码)
HTML
<asp:GridView ID="GVV2" runat="server" AutoGenerateColumns="False"
Height="25px"style="margin-right: 4px" Width="616px"
onselectedindexchanged="GVV2_SelectedIndexChanged" >
<Columns>
<asp:TemplateField>
<HeaderStyle CssClass="checkBoxCell" />
<ItemStyle CssClass="checkBoxCell" />
<ItemTemplate>
<asp:CheckBox ID="chk" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="FullName_" HeaderText="Name">
<HeaderStyle CssClass="SenderCell" />
<ItemStyle CssClass="SenderCell" />
</asp:BoundField>
<asp:HyperLinkField DataTextField="EmailID_" HeaderText="Email ID"
NavigateUrl="~/ViewContact1.aspx" >
<HeaderStyle CssClass="emailCell" />
<ItemStyle CssClass="emailCell a.decor" />
</asp:HyperLinkField>
</Columns>
</asp:GridView>
代码背后
public partial class Contacts1 : System.Web.UI.Page
{
Storage1 STO;
String currentUser;
Users1 selectedUser;
protected void Page_Load(object sender, EventArgs e)
{
Initiation();
GVV2.DataSource = Contact.getContactList(currentUser, STO);
GVV2.DataBind();
}
private void Initiation()
{
if (Session["SignInUser"] == null)
Session["SignInUser"] = currentUser;
else currentUser= (String)Session["SignInUser"];`
if (Session["Storage"] == null)
Session["Storage"] = STO;
else
{
STO= new Storage1();
STO = (Storage1)Session["Storage"];
}
}
protected void GVV2_SelectedIndexChanged(object sender, EventArgs e)
{
Session["SelectedContact"]=GVV2.SelectedRow;
Response.Redirect("ViewContact1.aspx");
}
}
答案 0 :(得分:1)
1º方式:
使用您在重定向页面上所需的值传递QueryString参数,在这种情况下,它可以是用户代码。显然,您无法在此案例中传递User
对象,但您可以在目标页面上获取User
详细信息。
<asp:TemplateField>
<ItemTemplate>
<asp:Hyperlink ID="hplViewDetails" runat="server" NavigateUrl='<%# Eval("userCode", "~ViewContact1.aspx?userCode={0}")%>' Text="Details" />
</ItemTemplate>
</asp:TemplateField>
要检索重定向页面上的值:
int userCode = Convert.ToInt32(Request["userCode"]);
2º方式:在您的网页上实施IPostBackEventHandler
界面。
放置指向javascript函数的HyperLink:
<asp:TemplateField>
<ItemTemplate>
<asp:Hyperlink ID="hplViewDetails" runat="server" NavigateUrl='<%# Eval("userCode", "javascript:redirectToUserDetails({0})")%>' />
</ItemTemplate>
</asp:TemplateField>
此功能将触发回发到您的页面:
<script>
function redirectToUserDetails(userCode)
{
__doPostBack('<%= ClientID %>', userCode);
}
<script>
Postback方法将执行正确的重定向(RaisePostBackEvent
方法):
public void RaisePostBackEvent(string eventArgument)
{
int userCode = Convert.ToInt32(eventArgument);
User user = GetUserFromSession(userCode);
string userObjectKey = Guid.NewGuid().ToString();
Session[userObjectKey] = user;
Response.Redirect(string.Format("~/ViewContact1.aspx?userObjectKey={0}", userObjectKey);
}
在ViewContact1.aspx上,检索对象:
User user = (User)Session["userObjectKey"];
也可以使用页面上的虚拟按钮进行回发,以便回发到服务器。
答案 1 :(得分:1)
使用链接按钮
另一种方法是使用gridview OnRowCommand而不是onselectedindexchanged。
使用linkbutton将您重定向到所需的页面。作为命令参数,您必须传递用户ID。
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="linkBtnDetails" runat="server" Text="Details" CommandName="Details"
CommandArgument='<%#Eval("ID")%>' />
</ItemTemplate>
</asp:TemplateField>
此外,您还必须为gridview定义onrowcommand:
<asp:GridView ID="GVV2" runat="server" AutoGenerateColumns="False"
Height="25px"style="margin-right: 4px" Width="616px"
onrowcommand="UserDetails_RowCommand" >
最后代码在你将获得用户ID的位置,将其设置为会话变量并重定向到页面。
void UserDetails_RowCommand(Object sender, GridViewCommandEventArgs e)
{
if(e.CommandName=="Details")
{
Session["SelectedContact"]=e.CommandArgument;
Response.Redirect("ViewContact1.aspx");
}
}
使用超链接字段
在查询字符串中发送ID。
<asp:HyperLinkField DataTextField="EmailID_" HeaderText="Email ID"
NavigateUrl="~/ViewContact1.aspx?id="+"<%#Eval('ID')%>" >
在页面加载后面的代码中获取如下ID:
string getUserID = Request.QueryString["id"];
int userID = Convert.ToInt32(getUserID);