我有一个由服务填充的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);
}
答案 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”方法仅查找直接后代,并且可能并不总是有效。