问题:我有一个gridview,其中填充了源自数据库的产品数据。在该gridview中嵌套了一个“ButtonField”(在最后一列中),以便在用户单击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>
答案 0 :(得分:1)
让我们再看一下GridView声明,删除不必要的部分。
<asp:GridView ID="gview" runat="server"
...
OnSelectedIndexChanged="gvVbResult_SelectedIndexChanged">
因此,为索引更改事件声明了一个处理程序,但是没有为row命令声明任何处理程序。处理程序的存在并不意味着什么,从ASP.NET的角度来看,这只是页面类的另一种方法,它确实将处理程序与控件的事件连接起来。即使此处理程序遵循标准命名约定。
要解决此问题,只需选择行命令事件:
OnRowCommand="gview_RowCommand"
旁注。您可能会被ASP.NET中的标准页面事件的连线机制误导。它由Page指令的AutoEventWireup
属性公开,默认情况下为每个新页面设置为true
。假如你有一个处理程序
protected void Page_Load(object source, EventArgs e)
连线机制将识别它并绑定到页面的Load事件。此机制仅适用于页面,不会在这些页面内的控件上传播。