none
¿Es posible obtener el indice del elemento seleccionado en una lista de un DataGridView?

    Pregunta

  • Suponiendo que tenemos una columna del tipo DataGridViewComboBoxColumn ¿se puede obtener el índice del valor seleccionado? ¿o sea el de la parte del texto?

    Por ejemplo si la lista consta de los continentes: Africa, América, Europa, Asia, Oceanía.

    y el valor actual de la celda es Europa, hay forma de obtener 2, que indica que está seleccionado el tercer valor en la lista (contando de cero)?

    martes, 4 de octubre de 2016 2:10

Respuestas

  • Hola James-2016,

    Es como usar un ComboBox convencional, solo asignarías el DataSource y el ValueMember y DisplayMember.

    Un ejemplo :

      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            Dim dt As New DataTable
            dt.Columns.Add("Id")
            dt.Columns.Add("Continente")
    
            dt.Rows.Add(1, "Africa")
            dt.Rows.Add(2, "America")
            dt.Rows.Add(3, "Europa")
    
    
            'Crea la columna del combo
            Dim cbo As New DataGridViewComboBoxColumn
    
            cbo.DataSource = dt
            cbo.DisplayMember = "Continente"
            cbo.ValueMember = "Id"
    
            'Agrega la columna
            DataGridView1.Columns.Add(cbo)
        End Sub

    Y cuando quiero tomar los datos de un comboBox de alguna fila :

            'Fila 1 (posición 0) en la columna 2 (posición 1)
            Dim cbo = TryCast(DataGridView1.Rows(0).Cells(1), DataGridViewComboBoxCell)
    
    
            If cbo IsNot Nothing Then
                MessageBox.Show(String.Format("Texto : {0}{2}Valor :{1}",
                                  cbo.FormattedValue.ToString, cbo.Value, vbCrLf))
            End If

    O simplemente :

     'Muestra el 2
      DataGridView1.Rows(0).Cells(1).Value.ToString
     'Muestra el texto
      DataGridView1.Rows(0).Cells(1).FormattedValue.ToString

    Resultado :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI



    martes, 4 de octubre de 2016 4:38

Todas las respuestas

  • Hola James-2016,

    Pero cuál es la necesidad de obtener el índice? Si puedes obtener el value del comboBox, eso sí siempre y cuando lo hayas establecido al crear la columna.

    El DataGridViewComboBoxColumn necesita un origen de datos para poder mostrar la información, en el cual puede almacenar un ValueMember y DisplayMember.

    Por cierto, usas un DataTable para cargas tu combo?

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    martes, 4 de octubre de 2016 3:12
  • Así me parecía que con ValueMember obtendría ese valor pero no me queda claro ¿debe existir un valor en ValueMember que se corresponda con cada valor en la lista a manera de índice?

    ¿Cómo sería la definición de los tres parámetros: datasource, ValueMember y DisplayMember vía código para el ejemplo de los continentes?

    O sea que el resultado sea una columna en un DataGridView con una lista de continentes y que obtenga el valor correspondiente al elemento seleccionado en la lista.


    martes, 4 de octubre de 2016 3:33
  • Hola James-2016,

    Es como usar un ComboBox convencional, solo asignarías el DataSource y el ValueMember y DisplayMember.

    Un ejemplo :

      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            Dim dt As New DataTable
            dt.Columns.Add("Id")
            dt.Columns.Add("Continente")
    
            dt.Rows.Add(1, "Africa")
            dt.Rows.Add(2, "America")
            dt.Rows.Add(3, "Europa")
    
    
            'Crea la columna del combo
            Dim cbo As New DataGridViewComboBoxColumn
    
            cbo.DataSource = dt
            cbo.DisplayMember = "Continente"
            cbo.ValueMember = "Id"
    
            'Agrega la columna
            DataGridView1.Columns.Add(cbo)
        End Sub

    Y cuando quiero tomar los datos de un comboBox de alguna fila :

            'Fila 1 (posición 0) en la columna 2 (posición 1)
            Dim cbo = TryCast(DataGridView1.Rows(0).Cells(1), DataGridViewComboBoxCell)
    
    
            If cbo IsNot Nothing Then
                MessageBox.Show(String.Format("Texto : {0}{2}Valor :{1}",
                                  cbo.FormattedValue.ToString, cbo.Value, vbCrLf))
            End If

    O simplemente :

     'Muestra el 2
      DataGridView1.Rows(0).Cells(1).Value.ToString
     'Muestra el texto
      DataGridView1.Rows(0).Cells(1).FormattedValue.ToString

    Resultado :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI



    martes, 4 de octubre de 2016 4:38
  • Muchas gracias.
    martes, 4 de octubre de 2016 5:03