Usuario
Tengo redundancia de código al usar dos formularios y un procedimiento.

Pregunta
-
Hola.
Bueno pues como lo dice el título de la nota, se me presenta una redundancia de código al emplear dos formularios y un procedimiento.
El objetivo es el siguiente: emplear el procedimiento en los dos formularios sin tener que recurrir a la redundancia de código, es decir, tener que repetir todo el procedimiento y hacer una ligera modificación en el mismo (cambiar el nombre del procedimiento y una línea de código dentro de él).
¿Qué es lo que espero?: poder mostrar un combobox con información en dos formularios distintos.
El resultado actual: De momento solo puedo emplear el procedimiento en un solo formulario, ya que no encuentro la manera de llamar el procedimiento desde el segundo formulario, la única idea que se me ocurre ya la comenté, repetir código.
Entorno: estoy usando VB.NET 2012 y una BD en Access 2013
A continuación les muestro el código original para que lo analicen:
En el procedimiento se muestra en un combobox las ciudades/municipios de un estado; mando llamar al procedimiento y le mando como parámetro uno de los formularios principales (frmCliReg) y éste mismo procedimiento lo necesito en un formulario secundario (frmColonias), el detalle aquí es como logro hacer para que el procedimiento me reconozca un formulario u otro.
Public Sub MostrarMunicipios(ByVal Frm As Form) Dim Conexion = New OleDbConnection(CadCon) : Dim Comando As OleDbCommand = New OleDbCommand Dim Adaptador As OleDbDataAdapter = New OleDbDataAdapter : Dim GpoDatos As DataSet = New DataSet Try With CType(Frm, frmCliReg) Comando.Connection = Conexion Comando.CommandText = "SELECT Municipio FROM tblMunicipios ORDER BY Municipio" Adaptador.SelectCommand = Comando Adaptador.Fill(GpoDatos, "Tabla") .cboMunicipio.Items.Clear() Dim Tabla As DataTable Dim Fila As DataRow Tabla = GpoDatos.Tables("Tabla") For Each Fila In Tabla.Rows .cboMunicipio.Items.Add(Fila.Item("Municipio")) Next End With Catch ex As OleDbException MsgBox(ex.Message) Finally Conexion = Nothing : Comando = Nothing : Adaptador = Nothing : GpoDatos = Nothing End Try End Sub
- Intente con un Select Case y la variable "tmp" de tipo Form donde se guarda el nombre (Name) del formulario pero me marcó el siguiente error: Un valor de tipo 'String' no se puede convertir en 'System.Windows.Forms.Form'.
- Lo intente declarando "tmp" de tipo String y me marcó: Un valor de tipo 'System.Windows.Forms.Form' no se puede convertir en 'String'.
"No hay pregunta tonta, lo que hay son tontos que no preguntan"
Todas las respuestas
-
Yo personalmente lo que haria es separar este procedimiento de acceso a datos de la capa de interfaz de usuario.
Crea una clase que acceda a los datos y luego desde tu form la llamas y asocias la tabla obtenida al combo que quieres de cada formulario.
un ejemplo... Mas o menos te muestro mi idea
Public Class Municipio Public Function MostrarMunicipios() As DataTable Using Conexion As OleDbConnection = New OleDbConnection(CadCon) Using Comando As OleDbCommand = New OleDbCommand Comando.Connection = Conexion Comando.CommandText = "SELECT IdMunicipio, Municipio FROM tblMunicipios ORDER BY Municipio" Adaptador.SelectCommand = Comando Adaptador.Fill(GpoDatos, "Tabla") Return GpoDatos.Tables("Tabla") End Using End Using End Sub End Class 'En tu formulario Dim m As Municipio = New Municipio() cboMunicipio.DataSource = Municipio.MostrarMunicipios() cboMunicipio.ValueMembeer = "IdMunicipio" 'No se como se llama tu campo clave cboMunicipio.DisplayMember = "Municipio"
Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos
-
No me resulto tu sugerencia mi estimado Sergio.
Implemente el código que me pusiste de ejemplo y vi como el VS me estaba mostrando errores sintácticos y los fui corrigiendo y me quedo de esta manera.
En la llamada a la clase queda así:
Private Sub cboMunicipio_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboMunicipio.SelectedIndexChanged Dim Municipio As clsCliReg = New clsCliReg cboMunicipio.DataSource = Municipio.MostrarMunicipios cboMunicipio.ValueMember = "IdMpio" cboMunicipio.DisplayMember = "Municipio" End Sub
Y la clase queda así:
Public Class clsCliReg Public Function MostrarMunicipios() As DataTable Using Conexion As OleDbConnection = New OleDbConnection(CadCon) Using Comando As OleDbCommand = New OleDbCommand Dim Adaptador As OleDbDataAdapter = New OleDbDataAdapter Dim GpoDatos As DataSet = New DataSet Comando.Connection = Conexion Comando.CommandText = "SELECT IdMunicipio, Municipio FROM tblMunicipios ORDER BY Municipio" Adaptador.SelectCommand = Comando Adaptador.Fill(GpoDatos, "Tabla") Return GpoDatos.Tables("Tabla") End Using End Using End Function End Class
En la línea de Adaptador.Fill(GpoDatos, "Tabla") me marca el siguiente error:
"No se controlo OleDbExcetion. No No se han especificado valores para algunos de los parámetros requeridos."
"No hay pregunta tonta, lo que hay son tontos que no preguntan"