问题:我得到了一个网格视图,其中填充了来自数据库的产品数据。在该网格视图中嵌套了一个"ButtonField"(在最后一列中),以便在用户单击ButtonField(添加到购物车)时能够将整个行内容作为对象添加到列表中。在"设计视图"中使用双击该按钮时,我总是最终进入...
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),因此创建了上面的代码。在代码隐藏中手动执行此操作会导致事件处理程序不起作用(尝试并失败)。
问题:我做错了什么,如何正确创建事件处理程序,以便可以将对象添加到列表中?问题是否与绑定字段与按钮字段的组合有关?附言。我在这里寻找了一个可能的副本,但没有适合手头的问题。
<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">
因此,有一个为索引更改事件声明的处理程序,但是没有为行命令声明任何处理程序。处理程序的存在并不意味着什么,从 ASP.NET 的角度来看,这只是页面类的另一种方法,它确实将处理程序与控件的事件连接起来。即使此处理程序遵循标准命名约定。
要解决此问题,只需为行命令事件唱歌:
OnRowCommand="gview_RowCommand"
附带说明一下。您可能在这里被 ASP.NET 中标准页面事件的接线机制误导了。它由 Page 指令的AutoEventWireup
属性公开,默认情况下设置为每个新页面的 true
。说你是否有处理程序
protected void Page_Load(object source, EventArgs e)
连接机制将识别它并绑定到页面的 Load 事件。此机制仅特定于页面,并且不会在这些页面内的控件上展开。