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