elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  obtener celdas seleccionadas (DataGridView)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: obtener celdas seleccionadas (DataGridView)  (Leído 7,814 veces)
FJDA


Desconectado Desconectado

Mensajes: 322


Ver Perfil
obtener celdas seleccionadas (DataGridView)
« en: 14 Marzo 2017, 09:37 am »

que tal, necesito obtener las celdas seleccionadas al hacer click de un DataGridView.

He probado con este código pero sólo me devuelve la celda donde hice clic.
Código
  1.   Dim celda As New List(Of String)
  2.        For Each cell As DataGridViewCell In Me.DataGridView1.SelectedCells
  3.            celda.Add(CStr(cell.ColumnIndex & "," & cell.RowIndex))
  4.        Next
  5.        MessageBox.Show(String.Join("; ", celda))
  6.  

la idea es que al seleccionar un grupo de celdas al hacer clic, introducir una serie de valores automáticos en dichas celdas, pero necesito saber cuales están seleccionadas para introducirles el valor.

Ademas DataGridView1.SelectedCells.Count sólo me devuelve el valor 1 al hacer clic en el evetno DataGridView1_CellMouseClick, aunque haya más de una celda seleccionada.

gracias



Bueno, parece que solo funciona desde un evento distinto de CLICK, puedo obtener las celdas seleccionadas desde otros eventos como MOUSEUP o MOUSEDOWN.

Al parecer al hacer click sobre una celda del grupo de celdas seleccionadas, se deseleccionan todas las celdas y queda solamente 1 celda seleccionada, entonces siempre devuelve 1.

 También devolvería todas las celdas desde un botón, por ejemplo:

How to: Get the Selected Cells, Rows, and Columns in the Windows Forms DataGridView Control






« Última modificación: 14 Marzo 2017, 10:05 am por FJDA » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: obtener celdas seleccionadas (DataGridView)
« Respuesta #1 en: 14 Marzo 2017, 23:48 pm »

Bueno, parece que solo funciona desde un evento distinto de CLICK, puedo obtener las celdas seleccionadas desde otros eventos como MOUSEUP o MOUSEDOWN.

Al parecer al hacer click sobre una celda del grupo de celdas seleccionadas, se deseleccionan todas las celdas y queda solamente 1 celda seleccionada, entonces siempre devuelve 1.

A mi me funciona perfectamente el evento DataGridView.Click, al seleccionar múltiples celdas la propiedad DataGridView.SelectedCells.Count devuelve el valor esperado y tú código funciona correctamente, así como si lo pruebo a hacer cuando se dispara el evento DataGridView.CellClick. La deselección y selección de elementos ocurre ANTES de que se dispare el evento Click/Cellclick.

Supongo que lo que te ocurre será algún fallo de diseño de alguna versión anterior de los controles de WindowsForms que ya corrijieron en algún update de .NET Framework. Por si te sirve de algo, esto lo he probado en Visual Studio 2015 bajo .NET Framework 4.0, 4.5 y 4.6



Con respecto al código que has mostrado, si por el motivo que sea realmente no puedes recurrir a la propiedad DataGridView.SelectedCells para especiificar lso valores de las celdas seleccionadas:
Código
  1. For Each cell As DataGridViewCell In Me.DataGridView1.SelectedCells
  2.    cell.Value = ...
  3. Next cell

Entonces yo modificaría un poco el código para utilizar un tipo más versatil que una lista desordenada como estás usando... por ejemplo:
Código
  1. Dim cellsDict As New SortedDictionary(Of Integer, SortedSet(Of Integer))(Comparer(Of Integer).Default)
  2. For Each cell As DataGridViewCell In DirectCast(sender, DataGridView).SelectedCells
  3.    If Not cellsDict.ContainsKey(cell.ColumnIndex) Then
  4.        cellsDict.Add(cell.ColumnIndex, New SortedSet(Of Integer))
  5.    End If
  6.    cellsDict.Item(cell.ColumnIndex).Add(cell.RowIndex)
  7. Next cell
  8.  
  9. Dim sb As New StringBuilder()
  10. For Each kvp As KeyValuePair(Of Integer, SortedSet(Of Integer)) In cellsDict
  11.    sb.AppendLine(String.Format("{0}, {{{1}}}", kvp.Key, String.Join(", ", kvp.Value)))
  12. Next
  13. MessageBox.Show(sb.ToString())
  14. ' sb.Clear()
  15. ' cellsDict.Clear()
Y entonces...
Código
  1. For Each kvp As KeyValuePair(Of Integer, SortedSet(Of Integer)) In cellsDict
  2.    For Each value As Integer In kvp.Value
  3.        Dim cell As DataGridViewCell = Me.DataGridView1.Rows(value).Cells(kvp.Key)
  4.        cell.Value = ...
  5.    Next value
  6. Next kvp

¡Saludos!


« Última modificación: 15 Marzo 2017, 00:01 am por Eleкtro » En línea



FJDA


Desconectado Desconectado

Mensajes: 322


Ver Perfil
Re: obtener celdas seleccionadas (DataGridView)
« Respuesta #2 en: 16 Marzo 2017, 20:35 pm »

A mi me funciona perfectamente el evento DataGridView.Click, al seleccionar múltiples celdas la propiedad DataGridView.SelectedCells.Count devuelve el valor esperado y tú código funciona correctamente, así como si lo pruebo a hacer cuando se dispara el evento DataGridView.CellClick. La deselección y selección de elementos ocurre ANTES de que se dispare el evento Click/Cellclick.

Supongo que lo que te ocurre será algún fallo de diseño de alguna versión anterior de los controles de WindowsForms que ya corrijieron en algún update de .NET Framework. Por si te sirve de algo, esto lo he probado en Visual Studio 2015 bajo .NET Framework 4.0, 4.5 y 4.6



Con respecto al código que has mostrado, si por el motivo que sea realmente no puedes recurrir a la propiedad DataGridView.SelectedCells para especiificar lso valores de las celdas seleccionadas:
Código
  1. For Each cell As DataGridViewCell In Me.DataGridView1.SelectedCells
  2.    cell.Value = ...
  3. Next cell

Entonces yo modificaría un poco el código para utilizar un tipo más versatil que una lista desordenada como estás usando... por ejemplo:
Código
  1. Dim cellsDict As New SortedDictionary(Of Integer, SortedSet(Of Integer))(Comparer(Of Integer).Default)
  2. For Each cell As DataGridViewCell In DirectCast(sender, DataGridView).SelectedCells
  3.    If Not cellsDict.ContainsKey(cell.ColumnIndex) Then
  4.        cellsDict.Add(cell.ColumnIndex, New SortedSet(Of Integer))
  5.    End If
  6.    cellsDict.Item(cell.ColumnIndex).Add(cell.RowIndex)
  7. Next cell
  8.  
  9. Dim sb As New StringBuilder()
  10. For Each kvp As KeyValuePair(Of Integer, SortedSet(Of Integer)) In cellsDict
  11.    sb.AppendLine(String.Format("{0}, {{{1}}}", kvp.Key, String.Join(", ", kvp.Value)))
  12. Next
  13. MessageBox.Show(sb.ToString())
  14. ' sb.Clear()
  15. ' cellsDict.Clear()
Y entonces...
Código
  1. For Each kvp As KeyValuePair(Of Integer, SortedSet(Of Integer)) In cellsDict
  2.    For Each value As Integer In kvp.Value
  3.        Dim cell As DataGridViewCell = Me.DataGridView1.Rows(value).Cells(kvp.Key)
  4.        cell.Value = ...
  5.    Next value
  6. Next kvp

¡Saludos!

Elektro el problema ye está solucionado ya que di con la solución, como ya comenté. De todos modos gracias por el interés, el esfuerzo y el aporte.

Te explico. El evento que utilicé no fue DataGridView1_Click, si no DataGridView1_CellMouseClick.

Quizá no me expliqué bien o no me entendiste. Lo que yo me refería era esto.

PRIMERO:  Arrastrar y seleccionar un grupo de celdas, entonces estas celdas por defecto quedan de color azul marino indicando que están seleccionadas.

SEGUNDO:  Una vez hecho esto hago clic de nuevo sobre cualquier celda de las que han quedado seleccionadas, me devuelve las celdas que hay seleccionadas y luego relleno las celdas.

El evento DataGridView1_Click, como dices si que devuelve el total las celdas seleccionadas, pero en el momento de arrastrar y soltar. Una vez seleccionadas al hacer clic la segunda vez en cualquiera de las celdas seleccionadas devuelve 1. Esto es porque al clicar de nuevo en UNA, todas se deseleccionan excepto la celda seleccionada la segunda vez y lógicamente devuelve 1.


Código
  1.  
  2.    Private Sub DataGridView1_Click(sender As Object, e As EventArgs) Handles DataGridView1.Click
  3.        MessageBox.Show(CStr(Me.DataGridView1.SelectedCells.Count))
  4.    End Sub



De modo que lo que pedía era primero seleccionar y que no ocurra nada, de nada. Y en el segundo clic en cualquier celda seleccionada me devuelva la colección.

Si aplicas el mismo código en  DataGridView1.CellClick, no devuelve la colección ni cuando seleccionas y cuando haces clic la segunda vez.


La solución ha sido obtener la colección desde el evento MyDataGridView_CellMouseUp guardar la colección en un array y ahora si la dimensión del array es mayor de 1 entonces rellena las celdas de la colección desde el evento DataGridView1_CellMouseClick:

Código
  1. Public Class Form1
  2.    Dim CellColection As New List(Of String)
  3.    Dim WithEvents MyDataGridView As New DataGridView
  4.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  5.        Me.Controls.Add(MyDataGridView)
  6.        With MyDataGridView
  7.            .Width = 406
  8.            .Height = 200
  9.            .ReadOnly = True
  10.            .ColumnCount = 3
  11.            .RowCount = 5
  12.            .Columns(0).Name = "Columna 1"
  13.            .Columns(1).Name = "Columna 2"
  14.            .Columns(2).Name = "Columna 3"
  15.  
  16.        End With
  17.    End Sub
  18.  
  19.    Private Sub MyDataGridView_CellMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles MyDataGridView.CellMouseClick
  20.        If e.Button = Windows.Forms.MouseButtons.Left Then
  21.            If CellColection.Count > 1 Then
  22.                For Each Item In CellColection
  23.                    Dim Columna As Integer = CInt(Item.Substring(0, 2))
  24.                    Dim Fila As Integer = CInt(Item.Substring(2, 2))
  25.                    If String.IsNullOrWhiteSpace(CStr(MyDataGridView.Item(Columna, Fila).Value)) Then
  26.                        MyDataGridView.Item(Columna, Fila).Value = String.Format("{0:00}{1:00}", Columna, Fila)
  27.                    Else
  28.                        MyDataGridView.Item(Columna, Fila).Value = ""
  29.                    End If
  30.  
  31.                Next
  32.            End If
  33.        End If
  34.    End Sub
  35.  
  36.  
  37.    Private Sub MyDataGridView_CellMouseUp(sender As Object, e As DataGridViewCellMouseEventArgs) Handles MyDataGridView.CellMouseUp
  38.        'Obtiene la colección
  39.        CellColection.Clear()
  40.        For Each Cell As DataGridViewCell In Me.MyDataGridView.SelectedCells
  41.            CellColection.Add(String.Format("{0:00}{1:00}", Cell.ColumnIndex, Cell.RowIndex))
  42.        Next
  43.    End Sub
  44. End Class


Como podrás comprobar al hacer clic la primera vez y arrastrar no ocurrirá nada, pero al hacer clic de nuevo en cualquiera de las cedas seleccionadas éstas se rellenan.

Así que selecciono un grupo de celdas sin que ocurra nada, ¿que no me gustan? vuelvo a seleccionar otras, cuando estoy de acuerdo, hago clic sobre cualquiera de las celdas seleccionadas y entonces se rellenan.

Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Combinar celdas en DataGridView
.NET (C#, VB.NET, ASP)
elmaro 2 11,231 Último mensaje 5 Febrero 2008, 19:23 pm
por elmaro
Filas seleccionadas DataGridView
.NET (C#, VB.NET, ASP)
piwi 3 14,933 Último mensaje 30 Julio 2010, 00:53 am
por piwi
Obtener rango de celdas seleccionadas en excel con vb [SOLUCIONADO]
.NET (C#, VB.NET, ASP)
1mpuls0 1 8,536 Último mensaje 22 Enero 2013, 17:34 pm
por 1mpuls0
Obtener celdas activas con vb despues de aplicar filtro en excel.
.NET (C#, VB.NET, ASP)
1mpuls0 2 3,698 Último mensaje 22 Enero 2013, 19:21 pm
por 1mpuls0
Guardar celdas de datagridview en variable (vb.net)
.NET (C#, VB.NET, ASP)
Gabe 0 3,329 Último mensaje 25 Abril 2015, 16:28 pm
por Gabe
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines