从GridView获取值

时间:2013-10-10 17:54:46

标签: asp.net .net gridview

我有一个由服务填充的GridView,我在此网格的每一行上添加了一个链接,以便我可以在单击该特定行时执行操作。我想获取所选行中的一些项目,但即使我添加了onSelectedRowChanged事件,我也没有触发该事件,只是我的链接。

<asp:GridView ID="gvTransactionHistory" runat="server" 
    AutoGenerateColumns="false"  
    onselectedindexchanging="gvTransactionHistory_SelectedIndexChanging">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Label ID="lblAmount" runat="server" Text='<%# Eval("preAuthAmount") %>'></asp:Label>
                <asp:LinkButton runat="server" Text="Assign+" OnClick="btnAssign"></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

这是我的btnAssign点击事件,效果很好......

protected void btnAssign(object sender, EventArgs e)
{
    Response.Write("Works!");
}

我添加了这个以查看是否可以触发此事件,但我并没有真正改变索引,所以我需要帮助的是理解我可以绑定的事件,这将允许我单击我的链接按钮,并从中获取值那排。

protected void gvTransactionHistory_SelectedIndexChanging(object sender, System.Web.UI.WebControls.GridViewSelectEventArgs e)
{
    var amount = gvTransactionHistory.SelectedRow.Cells[3].Text;
    Response.Write(amount);
}

2 个答案:

答案 0 :(得分:4)

要使用btnAssign点击事件处理程序来获取该行,您需要获取所单击按钮的NamingContainer(读取:父级),如下所示:

protected void btnAssign(object sender, EventArgs e)
{
    GridViewRow theClickedRow = ((LinkButton)sender).NamingContainer as GridViewRow;

    // Check to make sure the clicked row could be found before using it
    if(theClickedRow != null)
    {
        // Find the amount label control
        Label theAmountLabel = theClickedRow.FindControl("lblAmount") as Label;

        // Again, make sure we actually have something before using it
        if(theAmountLabel != null)
        {
            // Get the actual label's text here
            string theAmountLabelText = theAmountLabel.Text;
        }
    }
}

答案 1 :(得分:1)

我知道这个问题已经得到解答,但我想我会给出一个替代选项。

您始终可以向服务器控件添加属性,稍后再将其拉出。

例如,我可以将preAuthAmount作为名为“preAuthAmount”的属性添加到链接按钮。

<asp:Label ID="lblAmount" runat="server" Text='<%# Eval("preAuthAmount") %>'></asp:Label>
<asp:LinkButton runat="server" Text="Assign+" preAuthAmount='<%# Eval("preAuthAmount") %>' itemID='<%# Eval("itemID") %>' OnClick="btnAssign"></asp:LinkButton>

然后只需在点击事件中提取属性

protected void btnAssign(object sender, EventArgs e)
{
    string preAuthAmount= ((LinkButton)sender).Attributes["preAuthAmount"];
    string itemID= ((LinkButton)sender).Attributes["itemID"];
}

代码少得多,而且很容易阅读。

第三种选择是使用datakeys

在gridview的标记中,添加您希望能够访问gridview的所有字段。

<asp:GridView ID="gvTransactionHistory" runat="server" 
    AutoGenerateColumns="false"  
    onselectedindexchanging="gvTransactionHistory_SelectedIndexChanging" 
    DataKeyNames="ID, preAuthAmount, AnyField">

可以使用行索引

在后面的代码中访问这些数据键
protected void btnAssign(object sender, EventArgs e)
{

    var rowIndex = (((LinkButton)sender).NamingContainer as GridViewRow).RowIndex;
    var id = gvTransactionHistory.DataKeys[rowIndwx].Values["ID"];
    var preAuthAmount = gvTransactionHistory.DataKeys[rowIndwx].Values["preAuthAmount"];
}

另一个答案的问题是它有点不稳定。 “findcontrol”方法仅查找直接后代,并且可能并不总是有效。