none
Seleccion desde codigo en ColumnaCombo de DatagridView RRS feed

  • Pregunta

  • Hola

    En un DataGridView tengo una columna combo.....Como puedo hacer para seleccionar items desde el codigo..?

    Por ejemplo si fuera un ComboBox ....escribiria   ComboBox1.SelectedIndex = 2

    Como seria la instruccion para la columna combo ???


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    martes, 22 de abril de 2014 21:59

Respuestas

  • "Efrain Mejias Castillo" preguntó:

    > En un DataGridView tengo una columna combo.....Como puedo hacer para
    > seleccionar items desde el codigo..?
    >
    > Por ejemplo si fuera un ComboBox ....escribiria   ComboBox1.SelectedIndex = 2
    >
    > Como seria la instruccion para la columna combo ???

    A modo de simular la propiedad SelectedIndex del control ComboBox, tanto para establecer como para obtener el índice del elemento actualmente seleccionado en una celda del tipo DataGridViewComboBoxCell, inserta en tu formulario los siguientes procedimientos:

        ''' <summary>
        ''' Establece el índice que especifica el elemento seleccionado
        ''' actualmente en una celda DataGridViewComboBoxCell
        ''' </summary>
        ''' <param name="index">Índice en base cero del elemento
        ''' que se desea seleccionar.</param>
        ''' <author>Enrique M. Montejo - 2014</author>
        Private Sub EstablecerSelectedIndex(index As Integer)
    
            ' Referenciamos la fila actual del control DataGridView.
            '
            Dim currentRow As DataGridViewRow = DataGridView1.CurrentRow
            If (currentRow Is Nothing) Then Return
    
            ' Referenciamos la celda del tipo DataGridViewComboBoxCell, que
            ' vamos a suponer que es la celda que contiene la primera 
            ' columna del control DataGridView.
            '
            Dim comboCell As DataGridViewComboBoxCell = TryCast(currentRow.Cells(0), DataGridViewComboBoxCell)
            If (comboCell Is Nothing) Then Return
    
            If ((index < 0) OrElse (index > comboCell.Items.Count - 1)) Then
                ' En lugar de esperar a que se produzca una excepción del
                ' tipo ArgumentOutOfRangeException, verificamos que el índice
                ' especificado se encuentre dentro del intervalo de
                ' elementos existentes en el control ComboBox.
                '
                MessageBox.Show("Elemento inexistente.")
                Return
            End If
    
            ' Del control ComboBox seleccionamos el elemento especificado.
            '
            currentRow.Cells(0).Value = comboCell.Items(index)
            
        End Sub
    
        ''' <summary>
        ''' Devuelve el índice del elemento seleccionado actualmente
        ''' en una celda DataGridViewComboBoxCell. Si no hay ningún
        ''' elemento seleccionado se devuelve el valor -1. 
        ''' </summary>
       ''' <author>Enrique M. Montejo - 2014</author>
        Private Function ObtenerSelectedIndex() As Integer
    
            ' Referenciamos la fila actual del control DataGridView.
            '
            Dim currentRow As DataGridViewRow = DataGridView1.CurrentRow
            If (currentRow Is Nothing) Then Return -1
    
            ' Referenciamos la celda del tipo DataGridViewComboBoxCell, que
            ' vamos a suponer que es la celda que contiene la primera 
            ' columna del control DataGridView.
            '
            Dim comboCell As DataGridViewComboBoxCell = TryCast(currentRow.Cells(0), DataGridViewComboBoxCell)
            If (comboCell Is Nothing) Then Return -1
           
            ' Valor actual de la celda.
            '
            Dim value As String = Convert.ToString(currentRow.Cells(0).Value)
    
            ' Recorremos la colección de elementos para obtener el índice
            ' del elemento actualmente seleccionado en el control ComboBox.
            '
            For index As Integer = 0 To comboCell.Items.Count - 1
                If (value = comboCell.Items(index).ToString()) Then
                    Return index
                End If
            Next
    
            ' Actualmente no existe ningún elemento seleccionado.
            '
            Return -1
    
        End Function

    Quiero recordar que la columna tipo DataGridViewComboBoxColumn del control DataGridView no la tienes enlazada a un origen de datos, es decir, su propiedad DataSource es Nothing.

    Cuando desees establecer el valor, llamarías al método EstablecerSelectedIndex:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Seleccionamos el tercer elementos; el índice
            ' está en base cero.
            '
            EstablecerSelectedIndex(2)
    
        End Sub

    Y cuando desees obtener el índice del elemento seleccionado, llamarías al método ObtenerSelectedIndex:

        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    
            Dim index As Integer = ObtenerSelectedIndex()
    
        End Sub

    Si por casualidad deseas que aparezca el primer elemento seleccionado del control ComboBox cuando cambias de celda, en el evento CurrentCellChanged del control DataGridView ejecutarías:

        Private Sub DataGridView1_CurrentCellChanged(sender As Object, e As EventArgs) Handles DataGridView1.CurrentCellChanged
    
            If (ObtenerSelectedIndex() = -1) Then
    
                ' Actualmente no hay ningún elemento seleccionado;
                ' establecemos como valor por defecto el primer
                ' elemento del control ComboBox.
                '
                EstablecerSelectedIndex(0)
       
            End If
    
        End Sub

       


    Enrique Martínez Montejo

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    jueves, 24 de abril de 2014 14:24
    Moderador

Todas las respuestas

  • "Efrain Mejias Castillo" preguntó:

    > En un DataGridView tengo una columna combo.....Como puedo hacer para
    > seleccionar items desde el codigo..?
    >
    > Por ejemplo si fuera un ComboBox ....escribiria   ComboBox1.SelectedIndex = 2
    >
    > Como seria la instruccion para la columna combo ???

    A modo de simular la propiedad SelectedIndex del control ComboBox, tanto para establecer como para obtener el índice del elemento actualmente seleccionado en una celda del tipo DataGridViewComboBoxCell, inserta en tu formulario los siguientes procedimientos:

        ''' <summary>
        ''' Establece el índice que especifica el elemento seleccionado
        ''' actualmente en una celda DataGridViewComboBoxCell
        ''' </summary>
        ''' <param name="index">Índice en base cero del elemento
        ''' que se desea seleccionar.</param>
        ''' <author>Enrique M. Montejo - 2014</author>
        Private Sub EstablecerSelectedIndex(index As Integer)
    
            ' Referenciamos la fila actual del control DataGridView.
            '
            Dim currentRow As DataGridViewRow = DataGridView1.CurrentRow
            If (currentRow Is Nothing) Then Return
    
            ' Referenciamos la celda del tipo DataGridViewComboBoxCell, que
            ' vamos a suponer que es la celda que contiene la primera 
            ' columna del control DataGridView.
            '
            Dim comboCell As DataGridViewComboBoxCell = TryCast(currentRow.Cells(0), DataGridViewComboBoxCell)
            If (comboCell Is Nothing) Then Return
    
            If ((index < 0) OrElse (index > comboCell.Items.Count - 1)) Then
                ' En lugar de esperar a que se produzca una excepción del
                ' tipo ArgumentOutOfRangeException, verificamos que el índice
                ' especificado se encuentre dentro del intervalo de
                ' elementos existentes en el control ComboBox.
                '
                MessageBox.Show("Elemento inexistente.")
                Return
            End If
    
            ' Del control ComboBox seleccionamos el elemento especificado.
            '
            currentRow.Cells(0).Value = comboCell.Items(index)
            
        End Sub
    
        ''' <summary>
        ''' Devuelve el índice del elemento seleccionado actualmente
        ''' en una celda DataGridViewComboBoxCell. Si no hay ningún
        ''' elemento seleccionado se devuelve el valor -1. 
        ''' </summary>
       ''' <author>Enrique M. Montejo - 2014</author>
        Private Function ObtenerSelectedIndex() As Integer
    
            ' Referenciamos la fila actual del control DataGridView.
            '
            Dim currentRow As DataGridViewRow = DataGridView1.CurrentRow
            If (currentRow Is Nothing) Then Return -1
    
            ' Referenciamos la celda del tipo DataGridViewComboBoxCell, que
            ' vamos a suponer que es la celda que contiene la primera 
            ' columna del control DataGridView.
            '
            Dim comboCell As DataGridViewComboBoxCell = TryCast(currentRow.Cells(0), DataGridViewComboBoxCell)
            If (comboCell Is Nothing) Then Return -1
           
            ' Valor actual de la celda.
            '
            Dim value As String = Convert.ToString(currentRow.Cells(0).Value)
    
            ' Recorremos la colección de elementos para obtener el índice
            ' del elemento actualmente seleccionado en el control ComboBox.
            '
            For index As Integer = 0 To comboCell.Items.Count - 1
                If (value = comboCell.Items(index).ToString()) Then
                    Return index
                End If
            Next
    
            ' Actualmente no existe ningún elemento seleccionado.
            '
            Return -1
    
        End Function

    Quiero recordar que la columna tipo DataGridViewComboBoxColumn del control DataGridView no la tienes enlazada a un origen de datos, es decir, su propiedad DataSource es Nothing.

    Cuando desees establecer el valor, llamarías al método EstablecerSelectedIndex:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Seleccionamos el tercer elementos; el índice
            ' está en base cero.
            '
            EstablecerSelectedIndex(2)
    
        End Sub

    Y cuando desees obtener el índice del elemento seleccionado, llamarías al método ObtenerSelectedIndex:

        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    
            Dim index As Integer = ObtenerSelectedIndex()
    
        End Sub

    Si por casualidad deseas que aparezca el primer elemento seleccionado del control ComboBox cuando cambias de celda, en el evento CurrentCellChanged del control DataGridView ejecutarías:

        Private Sub DataGridView1_CurrentCellChanged(sender As Object, e As EventArgs) Handles DataGridView1.CurrentCellChanged
    
            If (ObtenerSelectedIndex() = -1) Then
    
                ' Actualmente no hay ningún elemento seleccionado;
                ' establecemos como valor por defecto el primer
                ' elemento del control ComboBox.
                '
                EstablecerSelectedIndex(0)
       
            End If
    
        End Sub

       


    Enrique Martínez Montejo

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    jueves, 24 de abril de 2014 14:24
    Moderador
  • Hola Enrique 

    En la función EstablecerSelectedindex ¿como validas cuando son columnas ComboBox? lo digo por esta linea de código.

    Dim comboCell As DataGridViewComboBoxCell = TryCast(currentRow.Cells(0), DataGridViewComboBoxCell)

    Otro detalle es que siempre entra al primer return 

     If (comboCell Is Nothing) Then Return

    Y salgo de la función.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    jueves, 26 de julio de 2018 0:10
  • "Pedro Ávila" preguntó:

    > En la función EstablecerSelectedindex ¿como validas cuando son columnas ComboBox?
    > lo digo por esta linea de código.
    >
    > Dim comboCell As DataGridViewComboBoxCell = TryCast(currentRow.Cells(0), DataGridViewComboBoxCell)

    Hola, Pedro:

    Si te fijas bien en el comentario que aparece ANTES de esa línea, allí se indica CLARAMENTE lo siguiente:

        ' Referenciamos la celda del tipo DataGridViewComboBoxCell, que
        ' vamos a suponer que es la celda que contiene la primera 
        ' columna del control DataGridView.
        '
        Dim comboCell As DataGridViewComboBoxCell = TryCast(currentRow.Cells(0), DataGridViewComboBoxCell)

    Es decir, que en el EJEMPLO se supone que la PRIMERA COLUMNA (índice 0) del control DataGridView es del tipo DataGridViewComboBoxCell.

    > Otro detalle es que siempre entra al primer return
    >
    > If (comboCell Is Nothing) Then Return

    Si estás ejecutando el procedimiento EstablecerSelectedIndex tal cual aparece en el EJEMPLO, digo yo que se deberá a que la PRIMERA COLUMNA (índice 0) de tu control DataGridView NO ES DEL TIPO DataGridViewComboBoxCell. Tendrás que adaptar tanto el procedimiento EstablecerSelectedIndex como la función ObtenerSelectedIndex a tus necesidades.

    Debes de tener en cuenta que los procedimientos indicados no son genéricos y sirven solamente para un control DataGridView concreto, de ahí que se tengan que ejecutar ambos procedimientos en el mismo formulario que contiene el control DataGridView. Si tu intención es la de disponer de esos procedimientos para que puedan ser ejecutados con independencia del índice que tenga la columna del tipo DataGridViewComboBoxCell, entonces no te va a quedar más remedio que establecer un nuevo parámetro para indicar precisamente el índice de la columna que actúa de control ComboBox. ¿Me explico? ;-)

    Un saludo


    Enrique Martínez Montejo

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción Option Strict.


    sábado, 28 de julio de 2018 8:46
    Moderador