es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Despliegue de controles dinámicos en VB.NET

A continuación se muestra un código VBA que funciona bien añadiendo controles a cualquier objeto que los admita mientras extrae datos de una tabla de la base de datos. Esto funciona tan bien porque aquí tengo un método .Add que admite 2 variables de tipo string que definen el tipo y el nombre del control. No puedo encontrar algo así en VB.Net. Solo puedo hacer procedimientos separados para cada tipo de control. Este código no es utilizable porque no puedo construir un MSForms.UserForm en abstracto. Debe tener un prototipo construido con un diseñador de formularios, mientras que esto en VS solo construye MSForms.UserForms, pero solo System.Windows.Forms.

¿Alguna solución aparte de hacer mi propio procedimiento con muchos Select, Ifs y similares? Esto aún funcionaba en VB.6: hay soluciones históricas en la WEB y en esta plataforma.

Function formFill(obj As Object, strSQL As String) As String
Dim rs As ADODB.Recordset, cntr As MSForms.Control, c As String

c = ""
On Error GoTo formFill_err
Set rs = ui_cnt.Execute(strSQL)

Do While Not rs.EOF

    Set cntr = obj.Controls.Add("Forms." + rs("obj_type") + ".1", rs("obj_name"), True)
    cntr.Height = rs("Height")

    If Left(cntr.Name, 3) = "lbl" And cntr.Height > 32 Then cntr.WordWrap = True
    cntr.Left = rs("Left")
    cntr.Top = rs("Top")
    cntr.Width = rs("Width")
    cntr.Caption = str_convert_null(rs("caption"))
    cntr.ControlTipText = str_convert_null(rs("tip"))
    cntr.Font.Size = 8
    cntr.Visible = True
    If Left(cntr.Name, 3) = "txt" Then
        cntr.AutoSize = False
    Else
        cntr.AutoSize = True
    End If

    c = c + rs("obj_type") + ";" + rs("obj_name") + ";"
    rs.MoveNext
Loop

Set rs = Nothing
formFill = c
Exit Function
formFill_err:
If Err.Number = 438 Then Resume Next
End Function
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no hay un equivalente directo al método Controls.Add en VB.Net que permita la creación dinámica de controles con solo dos variables de cadena que definen el tipo y el nombre del control. Sin embargo, existen soluciones alternativas que pueden lograr resultados similares.

    Un enfoque es crear procedimientos separados para cada tipo de control y llamarlos dinámicamente según el tipo de control necesario, utilizando una declaración If o una declaración Select. Si bien puede parecer tedioso, puede ser más manejable que una declaración If anidada y tiene menos probabilidades de errores. Otro enfoque es utilizar bibliotecas de terceros o controles personalizados que ofrecen capacidades de creación de controles dinámicos.

    Es importante tener en cuenta que VB.Net utiliza controles System.Windows.Forms, no MSForms.UserForms como en VB.6. Por lo tanto, es posible que se requieran algunas modificaciones en el código escrito en VB.6 para que funcione en VB.Net.

Comments are closed.