使用Boundfield的Gridview点击事件

3
我是一个GridView,我希望能够点击每一行以便显示我正在展示的对象中的另一个字段。感觉这个问题很容易解决,但是可能因为我无法在任何地方找到答案,所以显得有些愚蠢...
ASP代码:
<asp:GridView ID="gvMessages" runat="server" AutoGenerateColumns = "false" 
    CaptionAlign="NotSet" CellPadding="5">
    <Columns>
        <asp:BoundField HeaderText="Avsändare" DataField="Sender" />
        <asp:BoundField HeaderText="Ämne" DataField="Head" />
    </Columns>
</asp:GridView>

代码后台:

protected void Page_Load(object sender, EventArgs e)
    {
        gvMessages.DataSource = con.GetMails(con.GetId(Membership.GetUser().UserName));
        gvMessages.DataBind();
    }

我不确定所有这些对问题都是必要的,但是这里是我的wcf项目中填充复合类与对象信息的方法

public List<MailInfo> GetMails(int id)
    {
        using (var client = new datingEntities())
        {
            var result = client.Mail.Where(x => x.SentTo == id).Select(x => new MailInfo
            {
                Message = x.Mail1,
                Reciever = x.SentTo,
                Read = (bool)x.IsRead,
                Sender = (int)x.SentFrom,
                Head = x.Subject
            }).ToList();
            return result;
        }
    }

复合类:

[DataContract]
public class MailInfo : Mail
{
    [DataMember]
    public string Message { get; set; }
    [DataMember]
    public int Reciever { get; set; }
    [DataMember]
    public bool Read { get; set; }
    [DataMember]
    public int Sender { get; set; }
    [DataMember]
    public string Head { get; set; }
}

你找不到什么?请注意,只有在 if(!Page.IsPostBack) 的情况下才应该数据绑定 GridView - Tim Schmelter
你在选择行事件中重新绑定了吗? - briskovich
2个回答

4

只有在Page.IsPostBackfalse时才应该进行GridView的数据绑定。

protected void Page_Load(object sender, EventArgs e)
{
    if(!Page.IsPostBack)
    {
        gvMessages.DataSource = con.GetMails(con.GetId(Membership.GetUser().UserName));
        gvMessages.DataBind();
    }
}

如果你想在点击时选择一行,可以使用JavaScript:

protected void gvMessages_RowCreated(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow) {
        e.Row.Attributes["onmouseover"] = "this.style.cursor='pointer';this.style.textDecoration='underline';";
        e.Row.Attributes["onmouseout"] = "this.style.textDecoration='none';";
        e.Row.ToolTip = "Click to select row";
        e.Row.Attributes["onclick"] = this.Page.ClientScript.GetPostBackClientHyperlink(this.GridView1, "Select$" + e.Row.RowIndex);
    }
}

现在,当用户在行中点击某处时,您可以处理 SelectedIndexChangedEvent
protected void gvMessages_SelectedIndexChanged(Object sender, EventArgs e)
{
    // Get the currently selected row using the SelectedRow property.
    GridViewRow row = CustomersGridView.SelectedRow;
}

1

您应该使用 OnSelectedIndexChanged 事件。

<asp:GridView ID="gvMessages" runat="server" AutoGenerateColumns = "false" 
    OnSelectedIndexChanged="gvMessages_SelectedIndexChanged"  
    CaptionAlign="NotSet" CellPadding="5">
    <Columns>
        <asp:BoundField HeaderText="Avsändare" DataField="Sender" />
        <asp:BoundField HeaderText="Ämne" DataField="Head" />
    </Columns>
</asp:GridView> 

然后在事件的定义中,您可以检索所选项目并从那里执行任何需要的操作。

protected void gvMessages_SelectedIndexChanged(object sender, EventArgs e)
{
    if (ContactsGridView.SelectedIndex >= 0)
       ViewState["SelectedKey"] = gvMessages.SelectedValue;
    else
       ViewState["SelectedKey"] = null;
}

来自MSDN官方文档的示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接