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 AsString, OptionalByVal 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
原文:https://www.cnblogs.com/gaoleionline/p/11730807.html