代码之家  ›  专栏  ›  技术社区  ›  LiamGu

当从服务器端代码创建HTML元素时,如何在另一个子元素中使用它们的ID?

  •  1
  • LiamGu  · 技术社区  · 15 年前

    我在代码隐藏中创建了一个表,最后一列包含一个带有runat=“server”的HTML复选框。

    我使用的代码是:

            Do While reader.HasRows
                Do While reader.Read
                    Dim tNewRow As New HtmlTableRow
                    Dim cellSKU, cellDESCR, cellDept1, cellDeptGrp1, cellDeptRng1, cellStand, cellBoard, cellSelect As New HtmlTableCell
                    cellSKU.InnerHtml = "<a href='edit.aspx?edit=" & reader("SKUN") & "'>" & reader("SKUN") & "</a>"
                    cellDESCR.InnerText = reader("DESCR")
                    cellDept1.InnerText = reader("DPT1")
                    cellDeptGrp1.InnerText = reader("GRP1")
                    cellDeptRng1.InnerText = reader("RNG1")
                    cellBoard.InnerText = reader("BOARD")
                    cellStand.InnerText = reader("STAND")
                    cellSelect.InnerHtml = "<input type='checkbox' id='selectedSKU' value='" & reader("SKUN") & "' runat='server' />"
                    tNewRow.Cells.Add(cellSKU)
                    tNewRow.Cells.Add(cellDESCR)
                    tNewRow.Cells.Add(cellDept1)
                    tNewRow.Cells.Add(cellDeptGrp1)
                    tNewRow.Cells.Add(cellDeptRng1)
                    tNewRow.Cells.Add(cellStand)
                    tNewRow.Cells.Add(cellBoard)
                    tNewRow.Cells.Add(cellSelect)
                    tNewRow.Style.Add("border", "solid 1px #cccccc")
                    skusTable.Rows.Add(tNewRow)
                Loop
                reader.NextResult()
            Loop
    

    但我想在另一个子项中使用该复选框,例如:

    Protected Sub editSkus_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles editSkus.Click
    End Sub
    

    尽管我不能使用selectedsku.whatever作为复选框,但在运行代码的另一部分之前,该复选框不在页面上。

    有什么方法可以让我绕过这一点,还是其他的方法?

    事先谢谢你的帮助。

    2 回复  |  直到 15 年前
        1
  •  1
  •   digiguru    15 年前

    这很讨厌,但这里……

                Dim skusTable As New HtmlTable
                Dim i As Integer
    
                Do While reader.HasRows
                    Do While reader.Read
                        i = i + 1
    
                        Dim tNewRow As New HtmlTableRow
                        tNewRow.ID = "MyRow" & i
                        Dim cellSKU, cellDESCR, cellDept1, cellDeptGrp1, cellDeptRng1, cellStand, cellBoard, cellSelect As New HtmlTableCell
                        cellSKU.InnerHtml = "<a href='edit.aspx?edit=" & reader("SKUN") & "'>" & reader("SKUN") & "</a>"
                        cellDESCR.InnerText = reader("DESCR")
                        cellDept1.InnerText = reader("DPT1")
                        cellDeptGrp1.InnerText = reader("GRP1")
                        cellDeptRng1.InnerText = reader("RNG1")
                        cellBoard.InnerText = reader("BOARD")
                        cellStand.InnerText = reader("STAND")
    'Create the checkbox as a webcontrol and add it to the table cell
                         Dim checkBox As New HtmlControls.HtmlInputCheckBox
                        checkBox.Value = reader("SKUN")
                        checkBox.ID = "selectedSKU"
                        cellSelect.ID = "SelectedCell"
                        cellSelect.Controls.Add(New WebControls.CheckBox)
    
    
                        tNewRow.Cells.Add(cellSKU)
                        tNewRow.Cells.Add(cellDESCR)
                        tNewRow.Cells.Add(cellDept1)
                        tNewRow.Cells.Add(cellDeptGrp1)
                        tNewRow.Cells.Add(cellDeptRng1)
                        tNewRow.Cells.Add(cellStand)
                        tNewRow.Cells.Add(cellBoard)
                        tNewRow.Cells.Add(cellSelect)
                        tNewRow.Style.Add("border", "solid 1px #cccccc")
                        skusTable.Rows.Add(tNewRow)
                    Loop
                    reader.NextResult()
                Loop
    

    现在您所需要做的就是使用findcontrols来获取元素…

                Dim myRow As HtmlControls.HtmlTableRow = skusTable.FindControl("MyRow" & i)
                'Probably be good to check the object exists first....
                If Not myRow Is Nothing Then
                    Dim myCell As HtmlControls.HtmlTableCell = myRow.FindControl("SelectedCell")
                    If Not myCell Is Nothing Then
                        Dim myCheckbox As HtmlControls.HtmlInputCheckBox = myCell.FindControl("selectedSKU")
                        If Not myCheckbox Is Nothing Then
                            'Got it! now is it selected?
                            Return myCheckbox.Checked
                        End If
                    End If
                End If
    
        2
  •  0
  •   AnthonyWJones    15 年前

    runat=“server”属性由ASP.NET进程解析,并指示它应该创建某种控制对象。此时您的代码正在运行,此分析已经完成。ASP.NET不分析添加到InnerHTML属性中的内容,以查找其他runat属性或任何其他特定于ASP.NET的标记,InnerHTML应该是要发送到服务器的严格标准HTML。

    可以创建复选框ASP.NET控件的实例并将其添加到 cellSelect 控制集合,相当于runat=“server”。但是,这并没有真正的帮助,因为您希望将事件绑定到此控件,但在回发时,此控件将不再存在。

    是否有原因不使用DataGrid实现此UI?