Как связать несколько полей ввода пользователя с помощью цикла for / next? - PullRequest
1 голос
/ 20 марта 2012

Форма приложения VB.NET 2008 для Windows. У меня есть групповое окно с несколькими флажками, списками и текстовыми полями внутри него.

С помощью членов StackOverFlow я узнал, как использовать цикл FOR / NEXT, чтобы найти все флажки, которые отмечены.

Код:

    Dim chk As CheckBox
    Dim sb As New System.Text.StringBuilder
    For Each chk In gbInterior.Controls.OfType(Of CheckBox)()
        If chk.Checked Then
            sb.AppendLine(chk.Text)
        End If
    Next chk

Затем я использую эту информацию, чтобы написать имена флажков в теле письма, используя следующий код:

Dim Outl As Object
    Outl = CreateObject("Outlook.Application")
    If Outl IsNot Nothing Then
        Dim omsg As Object
        omsg = Outl.CreateItem(0)
        omsg.To = ""
        omsg.Subject = "Cabinet Request"
        omsg.Body = "A cabinet request has been created with the following information:" _
        + vbCrLf + sb.ToString

Как вы можете видеть по коду, sb.tostring будет печатать каждое имя флажка в отдельной строке ... отлично. Как связать правильное имя combobox.selecteditem, textbox.value и флажок для печати в той же строке. Когда я говорю правильный ... пример; checkbox = ручка, combobox = цвет, textbox = количество. Допустим, мои другие флажки - это разные элементы, а остальные поля одинаковы. Поскольку я использую цикл, как мне создать ассоциацию? Вот результат, который я ищу:

ручка синяя 1
карандаш черный 3
ластик розовый 2

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Окончательное РЕДАКТИРОВАНИЕ (проверено и подтверждено):

Public Class Form1

    Private Enum interiorTypes

        Rack
        RackShelf
        RackSlide
        RackDrawer
        BackPanel
        Shelf
        Drawer
        Light
        Fan
        Therm

    End Enum       

    Private Sub btnOrder_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOrder.Click

        Dim sb As New System.Text.StringBuilder

        For Each type As interiorTypes In System.Enum.GetValues(GetType(interiorTypes))

            Dim chk = CType(gbInterior.Controls.Find("c" & type.ToString(), True)(0), CheckBox)
            Dim cb = CType(gbInterior.Controls.Find("cb" & type.ToString(), True)(0), ComboBox)
            Dim tb = CType(gbInterior.Controls.Find("tb" & type.ToString(), True)(0), TextBox)

            If chk.Checked Then
                sb.AppendFormat("{0} {1} {2}", chk.Text, cb.SelectedItem.ToString, tb.Text)
                sb.AppendLine()
            End If

        Next

        MsgBox(sb.ToString, MsgBoxStyle.OkOnly, "Order Summary")

    End Sub

End Class

Если у вас нет всех 3 входов для каждого типа интерьера, то вам потребуетсяпроверить на ничто.Чтобы перейти к вашему примеру с отсутствующим ComboBox, после ваших объявлений Dim внутри цикла For вы можете выполнить:

If chk.Checked Then

    sb.Append(chk.Text)
    If cb IsNot Nothing Then sb.Append(" " & cb.SelectedItem.ToString)
    sb.Append(" " & tb.Text)
    sb.AppendLine()

End If
0 голосов
/ 21 марта 2012

Если все флажки, текстовые поля и комбинированные списки являются частью одного родителя (например, группового блока), то почти невозможно связать их вместе.

Я думаю, вам следует взглянуть на группировку каждого набора элементов на панели:

+- Panel 1 -----------------------------------------+
| Check box 1-------- Text Box 2 ---- Combobox 1 ---|
+---------------------------------------------------+
+- Panel 2 -----------------------------------------+
| Check box 2-------- Text Box 2 ---- Combobox 2 ---|
+---------------------------------------------------+

Затем вы можете выполнить цикл по всем панелям в группе, а для каждого цикла панели - через все элементы управления в пределах:

Dim stringbld As New System.Text.StringBuilder
    Dim fullstring As String

    For Each pnl As Panel In gbInterior.Controls.OfType(Of Panel)()

        Dim pen As Boolean
        Dim color As String = ""
        Dim quantity As Integer

        For Each ctrl As Control In pnl.Controls



            If TypeOf (ctrl) Is CheckBox Then
                Dim tmpchk As CheckBox = ctrl
                pen = tmpchk.Checked
            End If

            If TypeOf (ctrl) Is ComboBox Then
                Dim tmpchk As ComboBox = ctrl
                color = tmpchk.SelectedValue
            End If

            If TypeOf (ctrl) Is TextBox Then
                Dim tmpchk As TextBox = ctrl
                If IsNumeric(tmpchk.Text) Then
                    quantity = CInt(tmpchk.Text)
                End If
            End If

        Next

        stringbld.AppendLine(pen & " " & color & " " & quantity)



    Next

    fullstring = stringbld.ToString

Альтернативой может быть использование ретранслятора данных, здесь есть методы для получения всех значений:

Этот поток переполнения стека

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...