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.

¿Cómo puedo declarar e inicializar una estructura VB.Net en una clase Form para definir una variable que contenga todas las columnas DataGridView en variables separadas?

Cuando quiero usar un índice de columna específico, puedo usar el objeto de columna definido por el diseñador de Visual Studio.

sAccount = grid.Rows(e.RowIndex).Cells.Item(Col_Account.Index).Value

donde el objeto Col_Account está definido automáticamente por Visual Studio en el archivo Form.Designer.vb en la siguiente línea:

Friend WithEvents Col_Account As DataGridViewTextBoxColumn

El problema es que no es muy fácil encontrar el nombre de la columna definido manualmente usando el editor de formularios de Visual Studio WinForm en un formulario.

Así que decidí crear una estructura en la que colocaré todas las columnas definidas en el Diseñador de Visual Studio de la siguiente manera:

Public Structure GridColumns
    Public Account As DataGridViewTextBoxColumn
    Public Communication As DataGridViewTextBoxColumn
    Public Amount As DataGridViewTextBoxColumn
End Structure

y que puedo usar en Intellisense para encontrar rápidamente todos los nombres de columnas escribiendo:

GridColumns.

Cuando compilo este código, recibo el siguiente código de error:

BC30469: Se requiere una referencia a un miembro no compartido.

Eso no está funcionando.

La única solución que he encontrado es definir la siguiente estructura:

Public Structure GridColumns
    Public Account As DataGridViewTextBoxColumn
    Public Communication As DataGridViewTextBoxColumn
    Public Amount As DataGridViewTextBoxColumn
End Structure

Public xColumns As GridColumns

y inicializar sus miembros en el controlador Me.Load del formulario, de la siguiente manera:

Private Sub FrmSearch_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    With xColumns
        .Account = Col_Account
        .Amount = Col_Amount
        .Communication = Col_Communication
    End With
End Sub

Después de compilar, ahora puedo escribir xColumns. para ver todos los posibles nombres de columnas utilizables en mi código.

¿Existe una solución simple para implementar lo que quiero? ¿Una solución que combine la declaración e inicialización en un solo lugar?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una solución simple para implementar lo que quieres utilizando una colección en lugar de una estructura. Puedes declarar e inicializar la colección en un solo lugar utilizando un inicializador de objetos. Aquí tienes un ejemplo:

    Public ReadOnly Property GridColumns As New Dictionary(Of String, DataGridViewColumn) From {
        {"Account", Col_Account},
        {"Communication", Col_Communication},
        {"Amount", Col_Amount}
    }
    

    Esto crea una propiedad de solo lectura llamada “GridColumns” de tipo “Dictionary(Of String, DataGridViewColumn)” e inicializa la colección con tres pares clave-valor utilizando un inicializador de objetos. Las claves son los nombres de las columnas y los valores son los objetos de columna correspondientes definidos en el diseñador de Visual Studio.

    Para acceder a un objeto de columna específico utilizando su nombre, puedes utilizar la propiedad “Item” del diccionario de la siguiente manera:

    sAccount = grid.Rows(e.RowIndex).Cells.Item(GridColumns("Account").Index).Value
    

    Esto devolverá el objeto de columna para la columna “Account” y te permitirá acceder a su índice o valor.

    Utilizar una colección en lugar de una estructura tiene varias ventajas. Primero, te permite utilizar claves de tipo string en lugar de nombres de campos, lo cual es más fácil de recordar y no necesita ser actualizado si los campos subyacentes cambian. Segundo, te permite agregar o eliminar columnas de forma dinámica sin modificar el código que utiliza la colección. Por último, te permite iterar sobre las columnas utilizando un bucle “For Each”, lo cual puede ser muy útil en algunos escenarios.

Comments are closed.