首页 > 解决方案 > 如何一次填充多个组合框?

问题描述

我正在 VB.NET 中创建一个表单,用户可以在其中编辑 1 个窗口中的 7 天膳食计划。如图所示,用户从填充有相关食物的组合框中选择食物。

我正在编写的代码应该:

  1. 使用计划数据库中当前选择的餐点填充每个组合框
  2. 将项目与相关餐点一起添加到每个组合框(例如,仅早餐类型的餐点)
  3. 将用户更改保存回数据库

由于每顿饭都不一样,每一天都不一样,我不得不单独编码每个组合框,这很快就会变得难以管理。

这是当前的代码,只是为了加载星期一的饭菜并添加了组合框项目:

    Private Sub getMealPlan()

        Dim day As Integer

        Dim mealPlan As MealPlan
        mealPlan = New MealPlan
        mealPlan.setMealPlanTableData()
        mealPlan.setMealTableData()

        Dim items As New List(Of String)()

        Dim meals As MealPlan
        meals = New MealPlan

        meals.setMealsTable("Pre-workout/Snack")

        With Me.monPreWorkout
            .DataSource = meals.getTable
            .ValueMember = meals.getTable.Columns(0).ToString
            .DisplayMember = meals.getTable.Columns(1).ToString
        End With

        With Me.monSnack
            .DataSource = meals.getTable
            .ValueMember = meals.getTable.Columns(0).ToString
            .DisplayMember = meals.getTable.Columns(1).ToString
        End With


        meals.setMealsTable("Breakfast")

        With Me.monBreakfast
            .DataSource = meals.getTable
            .ValueMember = meals.getTable.Columns(0).ToString
            .DisplayMember = meals.getTable.Columns(1).ToString
        End With


        meals.setMealsTable("Lunch/Dinner")

        With Me.monLunch
            .DataSource = meals.getTable
            .ValueMember = meals.getTable.Columns(0).ToString
            .DisplayMember = meals.getTable.Columns(1).ToString
        End With

        With Me.monDinner
            .DataSource = meals.getTable
            .ValueMember = meals.getTable.Columns(0).ToString
            .DisplayMember = meals.getTable.Columns(1).ToString
        End With


        meals.setMealsTable("Drink")

        With Me.monMornDrink
            .DataSource = meals.getTable
            .ValueMember = meals.getTable.Columns(0).ToString
            .DisplayMember = meals.getTable.Columns(1).ToString
        End With

        With Me.monAfternoonDrink
            .DataSource = meals.getTable
            .ValueMember = meals.getTable.Columns(0).ToString
            .DisplayMember = meals.getTable.Columns(1).ToString
        End With

        day = 0

        Me.monPreWorkout.Text = mealPlan.getMealName(day, 0)
        Me.monBreakfast.Text = mealPlan.getMealName(day, 1)
        Me.monLunch.Text = mealPlan.getMealName(day, 2)
        Me.monDinner.Text = mealPlan.getMealName(day, 3)
        Me.monSnack.Text = mealPlan.getMealName(day, 4)
        Me.monMornDrink.Text = mealPlan.getMealName(day, 5)
        Me.monAfternoonDrink.Text = mealPlan.getMealName(day, 6)

    End Sub



除了插入代码以反映数据库中的用户更改外,我还必须为一周中的每一天复制这 7 天。这不可能是最好的方法。

我怎样才能一次分配多个组合框参数或使这个对象面向对象,这样我就不会有这种混乱?

包含 7 天每餐组合框的表格。

Public Class MealPlan
    Inherits DatabaseTable

    Public Shared meals As DatabaseTable

    Public Sub setMealPlanTableData()

        table = MainConnectionAccess.conndb.runAdapter("SELECT `preWorkout`, `breakfast`, `lunch`, `dinner`, `snack`, `drink1`, `drink2` FROM `tblMealPlan`")
        setIndexToZero()

    End Sub

    Public Sub setMealTableData()

        meals = New DatabaseTable
        meals.setTableContents("SELECT `mealID`, `name` FROM `tblMeal`")

    End Sub

    Function getMealName(day, meal)

        Dim mealID As String
        Dim mealRow As Integer

        mealID = getValue(day, meal)
        setIndexToZero()

        For Each row As DataRow In meals.table.Rows

            If mealID = "0" Then

                Return ""

            ElseIf meals.getValue(currentRowIndex, 0) = mealID Then

                mealRow = currentRowIndex

            End If

            addRowCount()
        Next

        Return meals.getValue(mealRow, 1)

    End Function

    Public Sub setMealsTable(category As String)

        setTableContents("SELECT `mealID`, `name`, `category` FROM `tblMeal` WHERE category = '" + category + "'")

    End Sub

    Function getTable()

        Return table

    End Function

End Class

Public Class DatabaseTable

    Public table As DataTable
    Public currentRowIndex As Integer = 0
    Public currentColumnIndex As Integer = 0

    Public rowCountTotal As String
    Public columnCountTotal As String

    Public Sub setTableContents(mysqlstatement)

        table = MainConnectionAccess.conndb.runAdapter(mysqlstatement)
        setIndexToZero()

    End Sub

    Public Sub setIndexToZero()

        currentColumnIndex = 0
        currentRowIndex = 0
        rowCountTotal = table.Rows.Count
        columnCountTotal = table.Columns.Count

    End Sub

    Public Sub addColCount()

        currentColumnIndex = currentColumnIndex + 1

    End Sub

    Public Sub addRowCount()

        currentRowIndex = currentRowIndex + 1

    End Sub

    Public Sub initialise()

        table = New DataTable

    End Sub

    Function getCurrentValue(row, column)

        Dim actualRow As Integer
        Dim actualCol As Integer

        If IsNumeric(row) Then
            'nothing
        Else
            actualRow = currentRowIndex
        End If

        If IsNumeric(column) Then
            'nothing
        Else
            actualCol = currentColumnIndex
        End If

        Return table.Rows(actualRow).Item(actualCol).ToString()

    End Function

    Function getCurrentRow(column)

        Return table.Rows(currentRowIndex).Item(column).ToString()

    End Function

    Function getCurrentColumn(row)


        Return table.Rows(row).Item(currentColumnIndex).ToString()


    End Function

    Public Sub increaseQuantity(searchCol, searchValue, addCol, addValue)

        Dim currentRowIndex As Integer = 0
        For Each row As DataRow In table.Rows

            If table.Rows(currentRowIndex).Item(searchCol) = Int(searchValue) Then
                table.Rows(currentRowIndex).Item(addCol) = table.Rows(currentRowIndex).Item(addCol) + addValue
                Exit Sub
            End If
            currentRowIndex += 1
        Next

        addNewItem(searchValue, addValue)

    End Sub

    Function getValue(row, column)

        Return table.Rows(row).Item(column).ToString()

    End Function

    Public Sub printQuantities()

        setIndexToZero()
        For Each row As DataRow In table.Rows

            Console.WriteLine(getValue(currentRowIndex, 0) + "," + getValue(currentRowIndex, 1))
            addRowCount()
        Next

    End Sub

    Public Sub addNewItem(name, quantity)

        table.Rows.Add(name, quantity)

    End Sub

    Function getRowCount()

        Return table.Rows.Count()

    End Function
End Class

标签: vb.netvisual-studioperformanceoop

解决方案


推荐阅读