none
Desplegar valores en una columna textBox de un DatagridView RRS feed

  • Pregunta

  • Hola, buenos días

    No acabo de encontrar una solución definitiva al problema que se me presenta. Tengo una columna de un datagridview de tipo TextBox a la que he asignado una serie de valores con la que se debe cargar mediante el evento EditingControlShowing

                            If Grids(0).CurrentCell.ColumnIndex = 1 Then
                                With DirectCast(e.Control, TextBox)
                                    .AutoCompleteMode = AutoCompleteMode.SuggestAppend
                                    .AutoCompleteSource = AutoCompleteSource.CustomSource
                                    .AutoCompleteCustomSource = Autocompletes.autCollection
                                End With
                            End If

    Para que se muestren valores de la colección, debo iniciar la edición de la celda con un carácter y me propone la elección de los elementos de esa colección que empiezan por el carácter introducido.

    Mi idea es que al entrar en la celda en cuestión muestre todos los elementos de la colección sin teclear carácter ninguno.

    Alguna idea? Gracias de antemano

    Aringo


    domingo, 25 de agosto de 2019 8:16

Respuestas

  • Bueno por lo que dices la idea es recorrer mediante tab los rows y no utilizár el mouse para agilizar, te voy mostrado los avences y seguramente, si te sirve, tú lo mejorarás. La idea es generar un listbox y al enter de la celda desplegarlo debajo de la misma y, con el foco en ella, pooder seleccionar un item. A nivel fomulario un un integer que después asignarmeos el valor del Rowindex y también a nivel formulario un ListBox declarado mediante AddHandel  de ListBox2 (en mi escenario)

       Public RowInd As Integer = 0
        Public Lst As ListBox = New ListBox()

    Esto en caso de ser necesario sino simplemente agreas un Listbox a tu formulario  visible= false. En el Load del formulairo pasamos los valores de Lst

       Lst.Visible = False
            Me.Controls.Add(Lst)
            Lst.Items.AddRange({"uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve"})
            AddHandler Lst.KeyDown, AddressOf ListBox2_KeyDown
    Ocupo el evento KeyDown. Por ultimo cargamos las sentencias al ListBox2 (en mi escenario)

     Private Sub ListBox2_KeyDown(sender As Object, e As KeyEventArgs) Handles ListBox2.KeyDown
            If e.KeyData = Keys.Enter Then
                DGV(4, RowInd).Value = Lst.SelectedItem.ToString
                Lst.Visible = False
                DGV.Focus()
                DGV.ClearSelection()
                DGV(5, RowInd).Selected = True
                DGV.CurrentCell = DGV(5, RowInd)
                DGV.BeginEdit(True)
            ElseIf e.KeyData = Keys.Escape Then
    
                DGV.Focus()
                DGV.ClearSelection()
                DGV(5, RowInd).Selected = True
                DGV.CurrentCell = DGV(5, RowInd)
                DGV.BeginEdit(True)
            End If
    
        End Sub

    En mi caso la columna a modificar es la 5 (4). Luego de seleccionar el item se coloca en foco nuevamente el DGV y la celda siguiente en modo de edición, como si siguiera el Tab. Aquí mi duda, coloque la opción escape en caso de que el usuario solo pasé por la columna y no desee cambiar el dato para esto utilizo Key escape, sería bueno mediante un toltip que indicase al usuario utilizar escape para salir de la lista.

      Private Sub DGV_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles DGV.CellEnter
            Dim a As Integer = DGV.CurrentCell.ColumnIndex
            Dim Rec As Rectangle = DGV.GetCellDisplayRectangle(DGV.CurrentCell.ColumnIndex, DGV.CurrentCell.RowIndex, False)
            If a = 4 Then
                Lst.Location = New Point((Rec.Location.X + DGV.Location.X), (Rec.Location.Y + DGV.Location.Y) + 25)
                Lst.Visible = True
                Lst.BringToFront()
                Lst.Focus()
                RowInd = DGV.CurrentCell.RowIndex
            Else
                Lst.Visible = False
    
            End If
    
        End Sub

    La llista tomará los Point de la celda en cuestión y desplegará justo debajo de ella. Una vez el Tab llegue a la celda se hace visible la lista y el foco pasa a esta, mediante cursores flecha arriba abajo selecciona un item y al dar enter caga el valor a la celda DGV, nuevamente invisible la lista y el cursor pasa a la siguiente celda.

     Bueno espero te sivra o al menos sea otro rumbo a mirar

    Saludos


    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗




    • Marcado como respuesta aringo lunes, 26 de agosto de 2019 13:40
    • Editado Marcelo PF lunes, 26 de agosto de 2019 15:43
    lunes, 26 de agosto de 2019 5:39

Todas las respuestas

  • Hola aringo, por qué no usas un datagridviewcombobox en lugar de lista? si el caso es que debes cargar diferentes listas seún la consulta puedes hacerlo en timpo de ejecución eJ:

     Dim Columna As New DataGridViewComboBoxColumn
            With Columna
                .Items.AddRange("a", "b", "c", "d", "e")
                .Name = "ABc"
            End With
            Dgv.Columns.RemoveAt(0)
            Dgv.Columns.Insert(0, Columna)

    En el ejemplo la columna original ComboBox (0) ya tiene por defecto una colección y según necesidad cambia la colección por otrar reemplazando la columna por el indice, en caso de que los datos vengan de una BD pues asignas el origen  a la columna creada ej: Columna.DataSourece= M_DataSet.Tables("ELCampo").DefaultView

    Saludos


    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗


    • Editado Marcelo PF domingo, 25 de agosto de 2019 13:04
    domingo, 25 de agosto de 2019 12:58
  • Gracias Marcelo,

    Esa es la opción clásica, pero, por más que insistas en desplegar el combo mediante teclas combinadas, los usuarios se tiran al ratón de forma sistemática, aumentando considerablemente el tiempo de trabajo.

    Un saludo

    domingo, 25 de agosto de 2019 13:22
  • Bueno por lo que dices la idea es recorrer mediante tab los rows y no utilizár el mouse para agilizar, te voy mostrado los avences y seguramente, si te sirve, tú lo mejorarás. La idea es generar un listbox y al enter de la celda desplegarlo debajo de la misma y, con el foco en ella, pooder seleccionar un item. A nivel fomulario un un integer que después asignarmeos el valor del Rowindex y también a nivel formulario un ListBox declarado mediante AddHandel  de ListBox2 (en mi escenario)

       Public RowInd As Integer = 0
        Public Lst As ListBox = New ListBox()

    Esto en caso de ser necesario sino simplemente agreas un Listbox a tu formulario  visible= false. En el Load del formulairo pasamos los valores de Lst

       Lst.Visible = False
            Me.Controls.Add(Lst)
            Lst.Items.AddRange({"uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve"})
            AddHandler Lst.KeyDown, AddressOf ListBox2_KeyDown
    Ocupo el evento KeyDown. Por ultimo cargamos las sentencias al ListBox2 (en mi escenario)

     Private Sub ListBox2_KeyDown(sender As Object, e As KeyEventArgs) Handles ListBox2.KeyDown
            If e.KeyData = Keys.Enter Then
                DGV(4, RowInd).Value = Lst.SelectedItem.ToString
                Lst.Visible = False
                DGV.Focus()
                DGV.ClearSelection()
                DGV(5, RowInd).Selected = True
                DGV.CurrentCell = DGV(5, RowInd)
                DGV.BeginEdit(True)
            ElseIf e.KeyData = Keys.Escape Then
    
                DGV.Focus()
                DGV.ClearSelection()
                DGV(5, RowInd).Selected = True
                DGV.CurrentCell = DGV(5, RowInd)
                DGV.BeginEdit(True)
            End If
    
        End Sub

    En mi caso la columna a modificar es la 5 (4). Luego de seleccionar el item se coloca en foco nuevamente el DGV y la celda siguiente en modo de edición, como si siguiera el Tab. Aquí mi duda, coloque la opción escape en caso de que el usuario solo pasé por la columna y no desee cambiar el dato para esto utilizo Key escape, sería bueno mediante un toltip que indicase al usuario utilizar escape para salir de la lista.

      Private Sub DGV_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles DGV.CellEnter
            Dim a As Integer = DGV.CurrentCell.ColumnIndex
            Dim Rec As Rectangle = DGV.GetCellDisplayRectangle(DGV.CurrentCell.ColumnIndex, DGV.CurrentCell.RowIndex, False)
            If a = 4 Then
                Lst.Location = New Point((Rec.Location.X + DGV.Location.X), (Rec.Location.Y + DGV.Location.Y) + 25)
                Lst.Visible = True
                Lst.BringToFront()
                Lst.Focus()
                RowInd = DGV.CurrentCell.RowIndex
            Else
                Lst.Visible = False
    
            End If
    
        End Sub

    La llista tomará los Point de la celda en cuestión y desplegará justo debajo de ella. Una vez el Tab llegue a la celda se hace visible la lista y el foco pasa a esta, mediante cursores flecha arriba abajo selecciona un item y al dar enter caga el valor a la celda DGV, nuevamente invisible la lista y el cursor pasa a la siguiente celda.

     Bueno espero te sivra o al menos sea otro rumbo a mirar

    Saludos


    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗




    • Marcado como respuesta aringo lunes, 26 de agosto de 2019 13:40
    • Editado Marcelo PF lunes, 26 de agosto de 2019 15:43
    lunes, 26 de agosto de 2019 5:39
  • Hola Marcelo,

    Disculpa la tardanza y muchas gracias por tomarte tanto interés en el tema. Voy a probarlo en breve, pero, tal como lo indicas, tiene toda la lógica del mundo. Ciertamente, una solución original que, seguro, voy a saber amoldar a lo que necesito.

    Te reitero mi agradecimiento. Saludos

    Aringo

    lunes, 26 de agosto de 2019 13:40