簡體   English   中英

如何將 OnRowCommand 分配給多個 ID ASP.net 和 VB.net 后端

[英]How do I assign OnRowCommand to multiple IDs ASP.net and VB.net Backend

我有 2 個具有不同 ID 的 GridView

我需要后端代碼來更新單擊按鈕時正在查看的代碼。

` 受保護的子保存狀態(發送者為 Object,e 為 EventArgs)

    Dim btn As Button = TryCast(sender, Button)
    Dim row As GridViewRow = CType(((CType(sender, Button)).NamingContainer), GridViewRow)
    Dim rowindex As Integer = row.RowIndex
    Dim code As String = GridView1.DataKeys(row.RowIndex).Values(0).ToString()
    Dim type As Int32 = GridView1.DataKeys(row.RowIndex).Values(1)
    Dim statusid As Integer

    Dim checkLocked, checkerror As CheckBox
    ' For Each row As GridViewRow In GridView1.Rows
    checkLocked = CType(GridView1.Rows(rowindex).FindControl("lock"), CheckBox)
    checkerror = CType(GridView1.Rows(rowindex).FindControl("error"), CheckBox)
    If checkerror.Checked Then ' error
        statusid = 2
    End If
    If checkLocked.Checked Then
        statusid = 3
    End If`

如何根據按下按鈕的網格視圖使 GridView1 成為變量。

好的,至少顯示按鈕和幾行 gridview 標記會很有幫助。

大約有 10 種方法可以做到這一點。 (真的。!!)。

但是,在您的情況下,有兩個復選框,並且您需要在更改復選框時執行操作 - 並說更改另一個!

現在我使用了兩個復選框——但它可以是一個文本框或我更改的任何內容。

所以,假設我有這個網格標記一些列+兩個未綁定的復選框。

        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundField DataField="ID" HeaderText="ID"  />
                <asp:BoundField DataField="HotelName" HeaderText="HotelName" />
                <asp:BoundField DataField="City" HeaderText="City"  />
                <asp:BoundField DataField="Province" HeaderText="Province" />

                <asp:TemplateField HeaderText="Good">
                    <ItemTemplate>
                        <asp:CheckBox ID="chkGood" runat="server" 
                            AutoPostBack="true"
                            OnCheckedChanged="chkGood_CheckedChanged"
                            MyRowID ='<%# Container.DataItemIndex %>' />
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Bad">
                    <ItemTemplate>
                        <asp:CheckBox ID="chkBad" runat="server" 
                            AutoPostBack="true"
                            OnCheckedChanged="chkBad_CheckedChanged"
                            MyRowID ='<%# Container.DataItemIndex %>' />
                    </ItemTemplate>
                </asp:TemplateField>

            </Columns>
        </asp:GridView>

好的,現在是加載網格的代碼:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If IsPostBack = False Then

        Using cmdSQL As New SqlCommand("SELECT ID, HotelName, City, Province from tblHotels",
                      New SqlConnection(My.Settings.Test3))
            cmdSQL.Connection.Open()
            GridView1.DataSource = cmdSQL.ExecuteReader
            GridView1.DataBind()
        End Using
    End If
End Sub

因此我們有這個:

在此處輸入圖像描述

好的,到目前為止 - 非常簡單。

現在請注意兩個復選框的標記處的 CLOSE。

在普通表單上放置一個按鈕或其他任何東西的同時,您可以雙擊跳轉到事件/存根后面的代碼?

好吧,對於按鈕或任何你放在網格內部的東西,你不能雙擊控件來創建+跳轉到存根后面的代碼。

但是,在標記中,你可以開始輸入事件,你會得到:

在此處輸入圖像描述

注意非常小心英特爾感知如何彈出創建事件的選項。 所以點擊那個選項。 似乎什么都沒有發生,但現在我們得到了一個代碼存根。

所以,我們有這個 chkOk 事件的代碼存根:

Protected Sub chkGood_CheckedChanged(sender As Object, e As EventArgs)

    Dim ckBox As CheckBox = sender
    Dim RowID As Integer = ckBox.Attributes.Item("MyRowID")
    Dim gvRow As GridViewRow = GridView1.Rows(RowID)

    If ckBox.Checked = True Then
        ' do whatever if true - say un-check the "bad" check box
        Dim ckBoxBad As CheckBox = gvRow.FindControl("chkBad")
        ckBoxBad.Checked = False
    Else
        ' code here if the user just un-checked the "good" check box
    End If

End Sub

注意幾點:

我們拿起按鈕單擊 - 然后將其推入復選框控件。 這更容易獲得復選框值,以及我們的 CUSTOM MyRowID

(例如,如果它是一個按鈕,則此方法有效)。

然后我們得到我們添加的自定義屬性,稱為“MyRowID”

MyRowID ='<%# Container.DataItemIndex %>'

您可以在標記中看到表達式 - 它傳遞當前行 ID。 有時,我會從行中傳遞其他值,您可以這樣做:

    <asp:CheckBox ID="chkBad" runat="server" 
        AutoPostBack="true"
        OnCheckedChanged="chkBad_CheckedChanged"
        MyRowID ='<%# Container.DataItemIndex %>' 
        MyPKID =  '<%# Eval("ID") %>'  />

因此,在上面,我同時傳遞了 RowID 和自定義 MyPKID(因此 Eval() 表達式可用於傳遞綁定時可用的任何有效數據行。它通常很方便,然后不得不抓取並弄亂數據行 - 你只需抓取來自發件人的按鈕 - 你不關心 gridview 或其他任何東西來獲得一些額外的值。(僅供參考)。例如,我真的不希望 PK 行 ID 作為第一行。所以我可以刪除它並仍然使用上述想法來傳遞 pk 行 id - 可以使用所有列 - 即使控件不在網格中 - 只要該列在數據綁定過程中存在 - 你可以抓住它。

所以,現在我們選擇當前的 GridRow - 我們可以隨意修改該行上的任何內容。

在我的簡單示例中,我們選擇 OTHER 復選框 - 並取消選中它是否被選中。 但我們可以說更新該行的其他內容。

我為 chkBad 復選框做了同樣的事情。 和我的第一個chkBox代碼stub一樣。 例如這個:

Protected Sub chkBad_CheckedChanged(sender As Object, e As EventArgs)

    Dim ckBox As CheckBox = sender
    Dim RowID As Integer = ckBox.Attributes.Item("MyRowID")

    Dim gvRow As GridViewRow = GridView1.Rows(RowID)

    If ckBox.Checked = True Then
        ' user checked the bad box, un-check the good one
        Dim ckBoxGood As CheckBox = gvRow.FindControl("chkGood")
        ckBoxGood.Checked = False
    Else
        ' code here if the user just un-checked the "bad" check box
    End If

End Sub

因此,在上面我們很難通過 GridView 事件。

所以在上面,如果您選中一個框而另一個被選中 - 我們取消選中它。 不用說,我會使用按鈕列表或復選框列表,那么當然不需要上面的代碼。 但它仍然是如何采摘/獲取當前行的一個很好的例子。 然后從該行獲取/提取控件。

請注意,對於前 3 行(數據綁定),您不能使用 findControl,它們是使用 gvRow.Cells(0) 引用的(從 0 到 N 列開始。因此這些數據綁定列或自動生成的列不需要 findcontrol . 他們沒有名字 - 你必須在單元格集合中使用從 0 開始的數字。當然對於我們按照上面添加的“模板化”控件?然后你實際上按照上面的方法使用 findcontrol。

暫無
暫無

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

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