【问题标题】:How do I assign OnRowCommand to multiple IDs ASP.net and VB.net Backend如何将 OnRowCommand 分配给多个 ID ASP.net 和 VB.net 后端
【发布时间】:2021-02-23 21:31:14
【问题描述】:

我有 2 个具有不同 ID 的 GridView

我需要后端代码来更新单击按钮时正在查看的代码。

` Protected Sub savestatus(sender As Object, e As 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 设为变量。

【问题讨论】:

    标签: asp.net vb.net variables backend


    【解决方案1】:

    好的,至少显示按钮和几行 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。

    在普通表单上放置按钮或其他内容时,您可以双击跳转到事件/存根后面的代码?

    好吧,对于按钮或任何你放在网格内部的东西,你不能双击控件来创建 + 跳转到存根后面的代码。

    但是,在标记中,您可以开始输入事件,然后您会得到:

    请注意非常小心 intel-sense 如何弹出创建事件的选项。所以点击那个选项。似乎什么也没发生,但现在我们得到了一个代码存根。

    所以,我们有这个 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。

    【讨论】:

      猜你喜欢
      • 2021-04-20
      • 2021-10-20
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多