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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Llenar un DatagridView de dos columnas con Linq en VB .net
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Llenar un DatagridView de dos columnas con Linq en VB .net  (Leído 6,245 veces)
juanedwin

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Llenar un DatagridView de dos columnas con Linq en VB .net
« en: 23 Septiembre 2022, 04:28 am »

Saludos a todos.
 Tengo un archivo de texto el cual contiene una lista de elementos supera los 35 000 lineas eso creo, y cada linea hay dos valores separados por un Tab  por ejemplo digamos
CP0000023            Aqui texto descriptivo del elemento
CP0000024            Aqui texto descriptivo del elemento
CP0000025            Aqui texto descriptivo del elemento
CP0000026            Aqui texto descriptivo del elemento
CP0000027            Aqui texto descriptivo del elemento

como puedo hacer que llene el DataGridView pero usando el LinQ, esto lo he hecho pero con un Foreach recorriendo todoas las lineas pero me parece que se demora un poco, pues pienso que con el LinQ puede hacerlo mas rápido, de manera que pido su ayuda .. saludos y gracias desde ya


En línea

juanedwin

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Re: Llenar un DatagridView de dos columnas con Linq en VB .net
« Respuesta #1 en: 23 Septiembre 2022, 23:52 pm »

Aui esta el codigo que uso para rellenar el datagrid
Código
  1. Dim aa = My.Resources.DiccionarioCodigoPenal.Split(vbLf)
  2. For Each a As String In aa
  3.    DataGridView1.Rows.Add(a.Split(vbTab))
  4. Next


En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.055



Ver Perfil
Re: Llenar un DatagridView de dos columnas con Linq en VB .net
« Respuesta #2 en: 24 Septiembre 2022, 16:04 pm »

Se me ocurren un par de optimizaciones:

1. Usar StreamReader para leer, así no sobrecargas tu variable aa con más de 35 000 líneas XD
2. Ocultar el DataGridView para que no consuma recursos intentando mostrar resultados cada vez que se le agrega un registro

Código
  1.  Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  2.    Me.DataGridView1.Columns.Add("codigo", "codigo")
  3.    Me.DataGridView1.Columns.Add("descripcion", "descripcion")
  4.    Dim sr As New System.IO.StreamReader("txt.txt")
  5.    Dim linea As String
  6.    Me.DataGridView1.Hide()
  7.    While True
  8.      linea = sr.ReadLine()
  9.      If linea = Nothing Then Exit While
  10.      Me.DataGridView1.Rows.Add(linea.Split(vbTab))
  11.    End While
  12.    Me.DataGridView1.Show()
  13.    sr.Close()
  14.    MsgBox("listo")
  15.  End Sub

Probé ese código para leer un txt.txt con 35 000 líneas y carga el DataGridView en un par de segundos

Tengo entendido que LinQ es para filtrar datos tipo SQL, no sé si por ahí vaya la cosa que necesites, de todas maneras no soy experto en VB o LinQ, solo hago pruebas con lo que tengo o encuentro y comparto para aprender yo también.
En línea

juanedwin

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Re: Llenar un DatagridView de dos columnas con Linq en VB .net
« Respuesta #3 en: 24 Septiembre 2022, 22:45 pm »

Tienes razon ocultar el datagrid ayuda, lo del bucle que haces se podria decir que en algo no noto mucha diferencia pero eso  de ocultar el datagridview si esta  genial, gracias

Espero lo del LinQ que podria hacer........ saludos 
En línea

Elektro Enjuto

Desconectado Desconectado

Mensajes: 121



Ver Perfil WWW
Re: Llenar un DatagridView de dos columnas con Linq en VB .net
« Respuesta #4 en: 12 Octubre 2022, 21:55 pm »

esto lo he hecho pero con un Foreach recorriendo todoas las lineas pero me parece que se demora un poco, pues pienso que con el LinQ puede hacerlo mas rápido, de manera que pido su ayuda .. saludos y gracias desde ya

Date cuenta de que cada vez que llamas al método "DataGridView1.Rows.Add" para agregar una fila estás invocando el evento de redibujado del control, ya que el control debe dibujar la fila y refrescar el contenido. Eso multiplicado por 35.000 lineas debe de tardarte una auténtica eternidad...

Lo aconsejable es que adaptes tu código para utilizar el método ADDRANGE en lugar de ADD, de esa forma añades todas las filas de una vez y evitas redibujados adicionales e innecesarios del control.

O también puedes especificar un origen de datos en la propiedad DATASOURCE como en el siguiente ejemplo usando LINQ donde genero un tipo anónimo como origen de datos:

Código
  1. Dim filePath As String = ".\código_penal.txt"
  2.  
  3. Dim textLines As IEnumerable(Of String) =
  4.    File.ReadLines(filePath, Encoding.Default)
  5.  
  6. Dim rows As IEnumerable(Of String()) =
  7.    From line As String In textLines
  8.    Select line.Split(ControlChars.Tab)
  9.  
  10. Dim dataSource As IEnumerable(Of Object) =
  11.    (From row As String() In rows
  12.     Select New With {
  13.         .Left = row(0),
  14.         .Right = row(1)}
  15.    ).ToList()
  16.  
  17. Me.DataGridView1.DataSource = dataSource

La carga de filas es casi casi practicamente instantanea.

PD: para este caso en concreto no está del todo mal utilizar LINQ (si lo prefieres podrías utilizar un For y una colección de tipo List, aunque habría que escribir más código), pero ten en cuenta que LINQ siempre será más lento que iterar los elementos de un array mediante un búcle For tradicional. Digo esto por el comentario que hiciste sobre la velocidad de ejecución de un For. Por que el problema de velocidad en tu código no es el uso del For, sino las miles de llamadas consecutivas al método "DataGridView1.Rows.Add" que ralentizan el procedimiento de adición de dichas filas, como ya expliqué.

-Enjuto Mojamuto "rey de los frikis" a su disposición para futuras dudas.
« Última modificación: 12 Octubre 2022, 23:50 pm por Enjuto Mojamuto » En línea

@%$& #$ %&#$, ¡hay que decirlo más!.
juanedwin

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Re: Llenar un DatagridView de dos columnas con Linq en VB .net
« Respuesta #5 en: 18 Octubre 2022, 23:05 pm »

Gracias, por la respuesta claro el LinQ es mas rápido; tuvo un error con el tipo anonimo, asi que estuve batallando con esto, entonces empeze un proyecto nuevo solo con un datagridView y el archivo de texto y pude conseguir algo que hasta el momento esta Ok, lo cargo al momento...  y aqui el codigo, uso un archivo de texto  como recurso...

Código
  1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  2.        DataGridView1.DataSource = (From line In My.Resources.Resource1.TextFile1.Split(vbLf) Select codigo = line.Split(vbTab)(0), descripcion = line.Split(vbTab)(1)).ToArray
  3.    End Sub

En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines