簡體   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