从GridView获取选定的对象

时间:2013-12-25 18:48:06

标签: c# asp.net gridview

我是ASP.NET的新手。我有一个学期项目;我面临的问题描述如下:

  • 我有一个名为Contacts的页面。
  • 我有一个叫做User的课程。
  • 我有一个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");
    }
}

2 个答案:

答案 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);