2016-03-07 11 views
0

问题:我得到了一个gridview,它填充了来自数据库的产品数据。在该GridView中嵌套一个“ButtonField”(在最后一列),以便能够将整个行内容作为对象添加到List,如果用户单击ButtonField(加入购物车)。该按钮在“设计视图”使用时,双击我一直在......无法创建嵌套在gridview中的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控件),所以在创建上面的代码实际上是访问一个元素(绑定列)。在后台代码中手动执行此操作会导致非工作事件处理程序(尝试失败)。

问题:我在做什么错误,以及如何正确创建事件处理程序,因此可以将对象添加到列表中?问题可能与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

但是你不会为RowCommand事件唱歌,你为什么期望它的处理程序被触发? – Andrei

+0

今天也许我有点迟缓,但我没有跟着你。请你详细说明一下吗?谢谢。 – themightyhulk

+0

在你的代码片段中,你有'OnSelectedIndexChanged =“gvVbResult_SelectedIndexChanged”'这个事件处理程序。你没有相同的行命令 – Andrei

回答

1

让我们再次看看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事件。该机制仅针对页面,并不会传播到这些页面内的控件上。

相关问题