2

我有一个由服务填充的 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);
}
4

2 回答 2

4

要使用btnAssignclick 事件处理程序来获取行,那么您需要获取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;
        }
    }
}
于 2013-10-10T18:02:11.470 回答
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"];
}

它的代码少了很多,而且很容易阅读。

第三种选择是使用数据键

在 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”方法只查找直系后代,可能并不总是有效。

于 2013-10-10T19:05:51.580 回答