簡體   English   中英

如何使用 button_click 事件獲取行索引

[英]How to get Index of row with button_click event

<asp:GridView class="table table-striped table-bordered " ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="dish_id" DataSourceID="SqlDataSource1" OnRowCommand="GridView1_RowCommand">
    <Columns>
        <asp:BoundField DataField="dish_id" HeaderText="ID" ReadOnly="True" SortExpression="dish_id" />

        <asp:TemplateField>
            <ItemTemplate>
                <div class="container-fluid">
                    <div class="row">
                        <div class="col-lg-8">
                            <div class="row">
                                <div class="col-12">
                                    <asp:Label ID="Label1" runat="server" Font-Bold="True" Font-Size="X-Large" Text='<%# Eval("dish_name") %>'></asp:Label>
                                </div>
                            </div>

                            <div class="row">
                                <div class="col-12">
                                    Category-<asp:Label ID="Label2" Font-Bold="True" runat="server" Text='<%# Eval("cat_name") %>'></asp:Label>
                                    &nbsp;| Cuisine-
                                                    <asp:Label ID="Label3" Font-Bold="True" runat="server" Text='<%# Eval("cuisine") %>'></asp:Label>
                                    &nbsp;| Price-
                                                    <asp:Label ID="Label4" Font-Bold="True" runat="server" Text='<%# Eval("price") %>'></asp:Label>

                                </div>
                            </div>

                            <div class="row">
                                <div class="col-12">
                                    Description-
                                                    <asp:Label Font-Bold="True" ID="Label5" runat="server" Text='<%# Eval("dish_description") %>'></asp:Label>

                                </div>
                            </div>
                        </div>
                        <div class="col-lg-2">
                            <asp:Image class="img-fluid" ID="Image1" runat="server" ImageUrl='<%# Eval("dish_img_link") %>' />
                        </div>
                        <div class="col-lg-2">
                            <asp:Button ID="Button1" class="btn btn-outline-info btn-block btn-sm" runat="server" Text="Add to Cart" OnClick="Button1_Click" />
                        </div>
                    </div>
                </div>
            </ItemTemplate>
        </asp:TemplateField>

    </Columns>
</asp:GridView>

我在每一行前面都有這個 GridView & 按鈕(添加到購物車),我想獲取單擊其按鈕的特定行的 ID。 我觀看了一些使用復選框更改事件的教程,但我想使用 button_click 事件獲取 id。 可能嗎?

您沒有提到這是客戶端 Java 點擊還是服務器端? 當您想開始在網格中使用自定義控件和標准 asp.net 控件時? 那么我強烈建議您翻轉以使用列表視圖。 它們非常相似,但列表視圖支持標准控件,而不必將控件包裝在模板中 - 因此標記更加清晰,您可以更輕松地將按鈕等放入給定的行中。

作弊方式(繞過所有gridview事件),電源過去的問題,不要太在意?

然后為您的按鈕執行此操作:

<asp:Button ID="Button1" class="btn btn-outline-info btn-block btn-sm" runat="server"
 Text="Add to Cart" OnClick="Button1_Click" 
 MyPKID = '<%# Eval("ID") %>'
 MyRow  = '<%# Container.DataItemIndex %>'
 />

請注意,我如何同時獲取數據行的 pK 非常有趣(在上面的示例中,主鍵行列名稱是“ID”)。 這是一個很棒的技巧,因為您通常不希望 PK 行 ID 顯示在網格中,隱藏它可能會很痛苦。 因此,在上面,我獲取了數據庫行的 BOTH PK 以及行索引 - 不確定你想要哪一個 - 所以讓我們獲取 BOTH 值。

好的,現在在您的點擊事件中,您可以這樣做:

protected void btnRowJump_Click(object sender, EventArgs e)

{
Button btn = sender;

int MyRow = btn.Attributes.Item("MyRow");
int MyPKID = btn.Attributes.Item("MyPKID");

Debug.Print("Database PK id = " + MyPKID.ToString());
Debug.Print("grid row click =  = " + MyRow.ToString());

// Get grid row data item

GridViewRow MyGvRow = GridView1.Rows(MyRow);
}

因此,使用您自己的“自定義”屬性通常會很方便。 我可能在該數據庫行中有幾個數據項 - 但未顯示在網格中。 所以你看我這樣做:

 <asp:LinkButton ID="pUploadFiles"  runat="server" 
                    Text='Upload Files'

         PortalComp      = '<%# Eval("PortalComp")%>'
         ContactNameID   = '<%# Eval("ContactNameID")%>'
         QuoteNum        = '<%# Eval("QuoteNum")%>'
         ProjectHeaderID = '<%# Eval("ID")%>'
         ContactGeneralID = '<%# Eval("ContactGeneralID")%>'
   </asp:LinkButton>

因此,只要數據行在數據綁定時存在,那么我不必在顯示部分中包含這些行 - 但在綁定時來自數據源的任何行都可以在上面使用。 所以在上面,這些行沒有顯示在網格中,但我仍然將它們獲取/抓取到自定義屬性中,並按照代碼示例將它們取出。

說了上面的話? 請記住,上述技巧不會觸發 GridView 更改索引事件 - 所以你不能在代碼中說 go

        MyRvRow2 = GridView1.SelectedRow

但是,我經常發現我並不關心或不需要或希望更改選擇的實際網格行,這沒什么大不了的。 您可以通過以下方式強制更改行:

    GridView1.SelectedIndex = MyRow

大多數示例建議設置 CommandName = "My Select",然后使用 CommandArugment。 這意味着您沒有單獨的按鈕單擊事件存根,而是使用 gridview 的 RowCommand 事件。 使用上面的“自定義屬性”技巧,您最終會編寫更少的代碼,但您會為每個按鈕獲得很好的單獨代碼事件存根 - 在很多情況下,我更喜歡這個而不是利用和使用 GridView事件 model。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM