winform net databind conectar con c# datagridview

net - fill datagridview c#



actualizar datagridview con mucha frecuencia (1)

Tengo problemas para actualizar mi DataGridView en un tiempo razonable en C # (que soy nuevo por cierto, estoy acostumbrado a Java ...).

Recibo datos a través de una red con 20 paquetes enviados por segundo. Me gustaría analizar los datos y ponerlos en un DataGridView. También me gustaría ajustar el intervalo en el que se actualiza DataGridView, de 0.1 segundos a 1 minuto.

Así que creé un hilo adicional, que lee los paquetes y los analiza en una matriz. También tengo un temporizador, que uso para cambiar el intervalo. En cada tic del temporizador, reasigno DataSource a DataGridView.

Curiosamente, cuando lo hago, incluso si configuro el temporizador en 0.1 segundos, solo se activa una vez por segundo. Si no actualizo el DataGridView, se activa 10 veces por segundo, como se supone que debe hacerlo.

Por lo tanto, supongo que mi método de actualizar DataGridView lleva demasiado tiempo. Pero, ¿qué debo hacer para que sea más eficiente, para poder actualizarlo 10 veces por segundo sin ningún problema?

Aquí está el código que uso:

public MyForm() { InitializeComponent(); timer = new System.Windows.Forms.Timer(); timer.Interval = (1 * 1000); // 1 secs timer.Tick += new EventHandler(timer_Tick); timer.Start(); readNetworkValues = true; networkReader = new Thread(() => { Thread.CurrentThread.IsBackground = true; byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 49003); UdpClient newsock = new UdpClient(ipep); IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); while (readNetworkValues) { data = newsock.Receive(ref sender); dataSet = parseData(data); //Decrypts the data } newsock.Close(); }); networkReader.Start(); } private void timer_Tick(object sender, EventArgs e) { if (dataSet != null) { lock (dataSet) { int currentRow = dataGrid.FirstDisplayedScrollingRowIndex; dataGrid.DataSource = dataSet; dataGrid.FirstDisplayedScrollingRowIndex = currentRow; } } }


El número de celdas que desea actualizar y también la velocidad de actualización que desea son lo suficientemente altas como para causar parpadeo y retraso .

Para evitarlo, puede activar DoubleBuffering para DataGridView .

Esta propiedad no está expuesta por defecto. Así que puede elegir entre

  • creando una subclase o
  • accediendo por reflexión

Aquí hay una publicación que demuestra lo primero. Fue escrito para un caso de parpadeo de desplazamiento, pero también ayudará a evitar retrasos de actualización. La clase puede verse así:

public class DBDataGridView : DataGridView { public new bool DoubleBuffered { get { return base.DoubleBuffered; } set { base.DoubleBuffered = value; } } public DBDataGridView() { DoubleBuffered = true; } }

Puede agregar esta clase al proyecto o simplemente a la clase de formulario (antes del último rizado). Compile y aparecerá en el Cuadro de herramientas.

La otra opción usa la reflexión ; Aquí hay una función de propósito general que debería funcionar para cualquier tipo de control:

using System.Reflection; static void SetDoubleBuffer(Control ctl, bool DoubleBuffered) { typeof(Control).InvokeMember("DoubleBuffered", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty, null, ctl, new object[] { DoubleBuffered }); }

Ambas formas le permiten activar y desactivar DoubleBuffering a voluntad; el primero a través de la propiedad ahora expuesta, el último por el bool param del método.