下拉框 的 演示

Dim strCmd AsString = "select code TOSC,rpad(code,length(code),' ')||rpad(' ',2,' ')||code_desc TOSC_desc from tbl_aml_config where code_category='TOSC' order by code_sequence"

        oReturnReader = fillBoxesT(clb_TOSC, strCmd, "TOSC", "TOSC_desc")

 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

<summary>

'''   用反射操作 comboBox 或者 checkedListBox 或者 ListBox, 向其中填充可供选择的选项(来源于数据库查询)

''' </summary>

''' <typeparam name="T">comboBox 或者 checkedListBox</typeparam>

''' <param name="_control">具体的控件</param>

''' <param name="CmdTxt"></param>

''' <param name="ValueMember"></param>

''' <param name="DisplayMember"></param>

''' <param name="ParamNames"></param>

''' <param name="ParamVals"></param>

''' <returns></returns>

''' <remarks></remarks>

   

PublicFunction fillBoxesT(OfT)(ByRef _control AsT, CmdTxt AsString, ValueMember AsString, DisplayMember AsStringOptionalByVal ParamNames AsString = NOPARAMS, OptionalByVal ParamVals() AsObject = Nothing) AsQueryReturnReader

        

     Dim rs As ADODB.Recordset = Nothing

                Dim oReturnReader AsNewQueryReturnReader

                Dim RecCount AsInteger = RECCNT_NOREC

                Dim dt AsNewDataTable

                 Dim da AsNewOleDbDataAdapter()

        

      OnErrorGoTo ERRHANDLER

        

        Dim cmd AsNew ADODB.Command

                    cmd.CommandType =CommandType.Text

                   cmd.ActiveConnection = conn

                   cmd.CommandText = CmdTxt

       

         Dim oReturnParam As  SetReturnParam

                       oReturnParam = SetCommandParameters(cmd, ParamNames, ParamVals)

        

       If oReturnParam.ReturnDescription(INDX_RETRESULT) = PARAM_SUCCESS Then

                                       rs = cmd.Execute

                   IfNot rs.EOF Then

                                              RecCount = rs.RecordCount

                                              da.Fill(dt, rs)

                                             Dim ty AsType = _control.GetType()     'GetType(T)   '  这种控件的具体类型                            

              'MessageBox.Show(dd.ToString)

               

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

               

'Dim o As Object = _control               

'Dim strs As String() = ty.ToString.Split(".")   '  转化为字符串数组               

 'Select Case strs(strs.Length - 1).Trim

'    Case "ComboBox"     '  如果控件类型是 ComboBox

'        Dim pCombo As ComboBox = DirectCast(o, ComboBox)

'        pCombo.DataSource = dt

'        pCombo.DisplayMember = DisplayMember    '   DisplayMember , 下拉框显示的TEXT

'        pCombo.ValueMember = ValueMember        '   ValueMember  ,  隐藏的值

'    Case "CheckedListBox" '  如果控件类型是 CheckedListBox

'        Dim pCombo As CheckedListBox = DirectCast(o, CheckedListBox)

'        pCombo.DataSource = dt

'        pCombo.DisplayMember = DisplayMember

'        pCombo.ValueMember = ValueMember

'    Case "ListBox"  '  如果控件类型是 ListBox

'        Dim pCombo As ListBox = DirectCast(o, ListBox)

'        pCombo.DataSource = dt

'        pCombo.DisplayMember = DisplayMember

'        pCombo.ValueMember = ValueMember

'    Case Else   '  其他类型

'        MessageBox.Show("不能处理的控件类型:" & ty.ToString())

'End Select

               

'  上面以前,使用了泛型,有些代码重复

'  下面现在, 使用了反射,避免代码重复               

'Dim pi As PropertyInfo = ty.GetProperty("DataSource")

'pi.SetValue(_control, dt, Nothing)

'pi = ty.GetProperty("DisplayMember")

'pi.SetValue(_control, DisplayMember, Nothing)

'pi = ty.GetProperty("ValueMember")

'pi.SetValue(_control, ValueMember, Nothing)

                ty.GetProperty("DataSource").SetValue(_control, dt, Nothing)

                ty.GetProperty("DisplayMember").SetValue(_control, DisplayMember, Nothing)

                ty.GetProperty("ValueMember").SetValue(_control, ValueMember, Nothing)

               

EndIf

            dt =Nothing

            da =Nothing

            rs.Close()

            oReturnReader.ReturnDescription = {SUCCESS, NO_DESC}

        

Else

            oReturnReader.ReturnDescription = oReturnParam.ReturnDescription

        

EndIf

        cmd.ActiveConnection =Nothing

        oReturnReader.RecordCount = RecCount

        

    Return oReturnReader

        

     Exit Function

ERRHANDLER:

        oReturnReader.RecordCount = RECCNT_INVREC

        oReturnReader.ReturnDescription = {PRGEXECERROR, Err.Description}

        

Return oReturnReader

        Err.Clear()

   

EndFunction

   

'   上面是新的填充函数,使用了泛型,适用于ComboBox,listBox 和 CheckedListBox 的

   Public Function SetCommandParameters(ByRef cmd As ADODB.Command, ByVal ParamNames As String, ByVal ParamVals() As Object) As SetReturnParam

        Dim oReturnParam As New SetReturnParam

        oReturnParam.ReturnDescription = {PARAM_SUCCESS, NO_DESC}

        Dim ParamNmCnt = ParamCount(ParamNames)

        If ParamNmCnt > 0 Then

            If ParamNmCnt = ParamVals.Length Then

                Dim ColParams As Collection

                ColParams = CreateParamCollection(ParamNames, ParamVals)

                For i = 0 To ColParams.Count - 1

                    Dim ParamFldSize As Integer

                    Dim InnerColParam As Collection = ColParams.Item(PARAM_PFX & (i + 1).ToString)

                    Dim oParam As ADODB.Parameter = New ADODB.Parameter

                    Dim ParamValue As Object = InnerColParam.Item(PARAM_VALUE)

                    ParamFldSize = 40

                    '  下面这段代码很容易出错

                    Select Case VarType(InnerColParam.Item(PARAM_VALUE))

                        Case VariantType.Integer

                            oParam = cmd.CreateParameter(Trim(InnerColParam.Item(PARAM_NAME).ToString), ADODB.DataTypeEnum.adInteger, ADODB.ParameterDirectionEnum.adParamInput, ParamFldSize)

                        Case VariantType.Long

                            oParam = cmd.CreateParameter(Trim(InnerColParam.Item(PARAM_NAME).ToString), ADODB.DataTypeEnum.adLongVarChar, ADODB.ParameterDirectionEnum.adParamInput, ParamFldSize)

                        Case VariantType.Double

                            oParam = cmd.CreateParameter(Trim(InnerColParam.Item(PARAM_NAME).ToString), ADODB.DataTypeEnum.adNumeric, ADODB.ParameterDirectionEnum.adParamInput, ParamFldSize)

                        Case VariantType.Date

                            oParam = cmd.CreateParameter(Trim(InnerColParam.Item(PARAM_NAME).ToString), ADODB.DataTypeEnum.adDBDate, ADODB.ParameterDirectionEnum.adParamInput, ParamFldSize)

                        Case VariantType.String

                            ParamFldSize = IIf(ParamValue = STRING_EMPTY, 40, Len(ParamValue))

                            oParam = cmd.CreateParameter(Trim(InnerColParam.Item(PARAM_NAME).ToString), ADODB.DataTypeEnum.adLongVarChar, ADODB.ParameterDirectionEnum.adParamInput, ParamFldSize)

                    End Select

                    oParam.Value = ParamValue

                    cmd.Parameters.Append(oParam)

                Next

            Else

                oReturnParam.ReturnDescription = {PARAM_CONFIGERROR, "Incorrect Parameters"}

            End If

        End If

        SetCommandParameters = oReturnParam

    End Function

猜你喜欢

转载自www.cnblogs.com/gaoleionline/p/11730807.html