[英]Unable to create ButtonField event handler nested in gridview
问题:我得到了一个gridview,其中填充了来自数据库的产品数据。 如果用户单击ButtonField( 添加到购物车 ),则在该gridview内嵌套一个“ ButtonField”(在最后一列中),以便能够将整个行内容作为对象添加到List。 在“设计视图”中,双击该按钮时,我总是会遇到以下问题:
protected void gview_SelectedIndexChanged(object sender, EventArgs e)
{
//Response.Write("This WORKS!");
}
...而不是为按钮生成了正确的事件处理程序(我认为它看起来像这样)。
protected void gview_RowCommand(Object sender, GridViewCommandEventArgs e)
{
List<GridViewRow> gvrowobjlist = new List<GridViewRow>();
if (e.CommandName == "Add to cart")
{
GridViewRow gvrow = gview.SelectedRow;
gvrowobjlist.Add(gvrow);
//Response.Write("This WORKS as well!!!!!!");
}
}
因此,这里的问题似乎是实际上无法访问元素(GridView)中的元素(BoundField),因此创建了上面的代码。 在后面的代码中手动执行操作会导致事件处理程序无法正常工作(尝试并失败)。
问题:我在做什么错?如何正确创建事件处理程序,以便可以将对象添加到列表中? 问题可能与BoundFields与ButtonField的组合有关吗? PS。 我在这里寻找了可能的重复项,但是没有什么适合当前的问题。
<asp:GridView ID="gview" runat="server" CellPadding="15" ForeColor="#333333" GridLines="None" AutoGenerateColumns="false" HorizontalAlign="Center" OnSelectedIndexChanged="gvVbResult_SelectedIndexChanged">
<AlternatingRowStyle BackColor="White" />
<Columns>
<asp:BoundField DataField="prodId" HeaderText="Product ID" >
<ItemStyle HorizontalAlign="Center" Width="160px"></ItemStyle>
</asp:BoundField>
<asp:BoundField DataField="prodName" HeaderText="Product Name" >
<ItemStyle HorizontalAlign="Left" Width="150px"></ItemStyle>
</asp:BoundField>
<asp:BoundField DataField="packNo" HeaderText="Package amount" >
<ItemStyle HorizontalAlign="Center" Width="100px"></ItemStyle>
</asp:BoundField>
<asp:BoundField DataField="bxCont" HeaderText="Box Content" >
<ItemStyle HorizontalAlign="Center" Width="100px"></ItemStyle>
</asp:BoundField>
<asp:BoundField DataField="price" HeaderText="Price" ItemStyle-Width="100" >
<ItemStyle Width="100px"></ItemStyle>
</asp:BoundField>
<asp:ButtonField Text="addToCart" ButtonType="Button" CommandName="Add to cart" />
</Columns>
</asp:GridView>
让我们再看一下GridView声明,删除不必要的部分。
<asp:GridView ID="gview" runat="server"
...
OnSelectedIndexChanged="gvVbResult_SelectedIndexChanged">
因此,有一个为索引更改事件声明的处理程序,但是未为row命令声明任何处理程序。 处理程序的存在并不意味着任何事情,从ASP.NET的角度来看,这只是页面类的另一种方法,它确实将处理程序与控件的事件连接在一起。 即使此处理程序遵循标准命名约定。
要解决此问题,只需简单地执行row命令事件:
OnRowCommand="gview_RowCommand"
附带说明。 在这里,您可能会被ASP.NET中标准页面事件的连接机制所误导。 它由Page指令的AutoEventWireup
属性公开,默认情况下,对于每个新页面,它都设置为true
。 说,如果你有一个处理程序
protected void Page_Load(object source, EventArgs e)
连线机制将识别它并绑定到页面的Load事件。 此机制仅特定于页面,并且不会散布在这些页面内的控件上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.