繁体   English   中英

无法创建嵌套在gridview中的ButtonField事件处理程序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM