获取动态复选框的值

get values of dynamic checkboxes

我根据数据库中的值在 VB.Net 和 .aspx 页面中动态创建复选框。为了便于对齐,我将它们放在两列 table 中。这部分工作正常。

 Private Async Function InitForEditAsync() As Task

    Dim docList = Await GetLoanApplicationConfigurationDocs()
    Dim row = New HtmlTableRow()
    Dim cell = New HtmlTableCell()
    Dim i = 0

    For Each doc In docList

        Dim chkBox = New HtmlInputCheckBox()
        Dim lbl = New Label()

        Dim remainder = i Mod 2

        chkBox.ID = "chkDocId" + doc.Id.ToString
        lbl.Text = doc.DisplayName
        cell.Controls.Add(chkBox)
        cell.Controls.Add(lbl)

        row.Cells.Add(cell)
        cell = New HtmlTableCell()

        If remainder <> 0 OrElse i = docList.Count() - 1 Then
            tblEdit.Rows.Add(row)
            row = New HtmlTableRow()

        End If

        i += 1
    Next
End Function

现在我需要在不知道 ID 的情况下检索值,但我运气不好。我试过这个:

        For Each chkBox As HtmlInputCheckBox In pnlEdit.Controls.OfType(Of HtmlInputCheckBox)

但控件列表中未返回复选框。 table 是,但是当我在控件集合中探索它时 table 对象中没有行,当我尝试这样做时:

For Each row As HtmlTableRow In tblEdit.Rows.OfType(Of HtmlTableRow)

如果有帮助,这里是创建的 UI 和 HTML 的片段:

如有任何建议,我们将不胜感激。提前致谢。

根据我从另一个站点获得的一些想法,我将使用 asp:CheckBoxList 重写它。显然它像数据网格一样绑定,您可以通过它进行枚举。好像是我需要的。

更新:我发布的所有内容都用五行代码解决了! “cblDocList 是我的 asp CheckboxList,而 docList 是我的可枚举的对象。

    cblDocList.RepeatColumns = 2
    cblDocList.DataSource = docList
    cblDocList.DataTextField = "DisplayName"
    cblDocList.DataValueField = "Id"
    cblDocList.DataBind()

您可以通过对每一行和每个单元格进行循环或使用 Linq 来仅包含内部具有 HtmlInputCheckBox 类型控件的单元格。 我已将您的代码简化为 运行,此处还向您展示了一个示例来完成您的任务。显然,您必须根据自己的紧急情况进行更改。 希望我理解得很好:)

    Dim tblEdit As New HtmlTable

    For k As Integer = 0 To 10

        Dim cell = New HtmlTableCell()
        Dim row = New HtmlTableRow()
        Dim chkBox = New HtmlInputCheckBox()

        Dim lbl = New Label()
        Dim remainder = k Mod 2

        chkBox.ID = "chkDocId_" + k.ToString
        chkBox.Checked = remainder = 0
        lbl.Text = "Text indicator of CheckBox nr:" + k.ToString

        cell.Controls.Add(chkBox)
        cell.Controls.Add(lbl)

        row.Cells.Add(cell)

        cell = New HtmlTableCell()
        tblEdit.Rows.Add(row)

    Next

    Dim checkBoxes As IEnumerable(Of HtmlInputCheckBox) =
        (From mRow In tblEdit.Rows).Select(Function(mr)
                                               Dim cb = (From cc In CType(mr, HtmlTableRow).Cells
                                                         Where CType(cc, HtmlTableCell).Controls.OfType(Of HtmlInputCheckBox).Count > 0
                                                         Select CType(cc, HtmlTableCell).Controls.OfType(Of HtmlInputCheckBox)()(0)).FirstOrDefault

                                               Return CType(cb, HtmlInputCheckBox)
                                           End Function).ToList


    For Each checkBox In checkBoxes
        Debug.WriteLine("CheckBox ID: {0}  Checked: {1} ", checkBox.ID, checkBox.Checked)
    Next