una selectedrows seleccionar seleccionada por obtener numero fila evento datos como codigo c# .net winforms datagridview

selectedrows - seleccionar fila datagridview c# por codigo



modo virtual datagridview, update RowCount hace que CellValueNeeded se active para todas las filas (5)

Estoy intentando implementar el modo virtual de Datagridview, pero cuando configuro RowCount en un número (para mostrar la barra de desplazamiento), la cuadrícula quiere tener todas las filas a la vez, no solo las que se muestran.

DataGridView grid = new ...; grid.VirtualMode = true; grid.CellValueNeeded += OnCellValueNeeded; grid.RowCount = dataprovider.GetFullCount();

¿Cómo puedo decirle a la grilla que solo solicite las filas que se muestran?


Esto es solo una suposición, pero ¿tiene los valores AutoSizeRowsMode o AutoSizeColumnsMode establecidos en AllCells o cualquiera de las columnas está configurada para eso? Intente configurar el modo de cambio de tamaño a Ninguno o solo a DisplayedCells y vea si todavía hay un problema.


No estoy seguro de si este es el mismo problema que estaba teniendo, pero obtuve un rendimiento muy pobre al cambiar drásticamente de forma regular el RowCount en un VirtualGate DataGridView.

Lo que noté fue que la barra de desplazamiento estaba cambiando "lentamente"; es decir, parecía que estaba eliminando individualmente mis filas virtuales (!).

De todos modos, hacer una grid.Rows.Clear() antes de cada llamada a grid.RowCount = n mejoró drásticamente el rendimiento.


Estoy teniendo el mismo problema e intenté la solución de establecer un marcador activo como lo hizo, y también probé la solución de configurar el RowCount en 0 (o grid.Rows.Clear ()) antes de configurar el nuevo RowCount.

Ambas cosas mejoraron el rendimiento, pero ninguno lo aceleró lo suficiente como para ser lo más instantáneo que deseo porque estoy filtrando dinámicamente la cuadrícula en tiempo real en función de la entrada de un cuadro de búsqueda.

Encontré otras dos soluciones:

1) Usa la paginación para que no tengas que configurar RowCount tan alto para empezar. Creo que esta es una gran solución si ya está usando la paginación (en cuyo caso no estaría aquí) pero demasiado engorrosa si no planea implementarla.

2) Ponga la llamada para establecer el RowCount en su propio hilo. Este es el que estoy a punto de intentar. Honestamente, no estoy seguro de cuán seguro es esto si estás tratando de editar celdas mientras el hilo todavía está terminando, pero creo que pronto lo sabré.

EDITAR:

OK, así que intenté enhebrarlo esperando que eso hiciera el truco, ya que leí en otro lado que realmente ayudó a otro tipo. Parece ser una buena solución SI solo vas a cambiar el valor de vez en cuando, pero aún se cuelga si lo haces varias veces consecutivas (que yo soy). Creo que esto se debe a que tienes que usar Invoke () y la segunda vez todavía está esperando que termine el primero. No puedo decir que entiendo totalmente cuál es el trato, pero por ahora he decidido vivir con las filas en blanco porque es mucho más rápido y menos complejo cuando los dejo ahí.


Debe establecer RowCount en cero antes de configurar el conteo completo.

DataGridView grid = new ...; grid.VirtualMode = true; grid.CellValueNeeded += OnCellValueNeeded; grid.RowCount = 0; grid.RowCount = dataprovider.GetFullCount();


desafortunadamente, este parece ser el comportamiento estándar. podría resolverlo ya sea por

void OnCellValueNeeded(...) { if(!_active) return; } grid.VirtualMode = true; grid.CellValueNeeded += OnCellValueNeeded; _active = false; grid.RowCount = dataprovider.GetFullCount(); _active = true;

o implementando IBindingList, ITypedList con búsqueda lenta y compleja en el hilo de fondo

Actualización: el problema parece estar solucionado ahora. No puedo reproducirlo más usando lo siguiente:

static class Program { private static Form form; private static int i; [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); var grid = new DataGridView { Dock = DockStyle.Fill, VirtualMode = true, AllowUserToAddRows = false, Columns = { new DataGridViewTextBoxColumn { HeaderText = "foo" }, new DataGridViewTextBoxColumn { HeaderText = "bar" }, }, }; grid.CellValueNeeded += OnCellValueNeeded; form = new Form { Controls = { grid } }; //grid.RowCount = 0; grid.RowCount = 10000; Application.Run(form); } private static void OnCellValueNeeded(object sender, DataGridViewCellValueEventArgs e) { i++; form.Text = i.ToString(); e.Value = "fooValue"; } }