visual una seleccionar poner manualmente foco filas fila evento ejemplos datos celda agregar c# winforms scroll datagridview panel

c# - una - Cómo desplazar DataGridView en incrementos de píxeles



fill datagridview c# (3)

Lamento decirlo, pero este requisito no es la forma en que funciona DataGridView. En realidad, no interactúas directamente con la barra de desplazamiento.

Tome este código, por ejemplo, la única propiedad sobre la que tiene control es FirstDisplayedScrollingRowIndex .

No puede desplazar una fila de DataGridView como una fracción (por ejemplo, un desplazamiento de media fila o ... con más granularidad hasta el nivel de píxel que desee).

private void button1_Click(object sender, EventArgs e) { var dt = new DataTable(); dt.Columns.Add("test"); var rnd = new Random(); for (int i = 0; i < 10000; i++) { var dr = dt.NewRow(); dr[0] = rnd.Next().ToString(); dt.Rows.Add(dr); } dataGridView1.DataSource = dt; } int i = 0; int lastTopRow = 0; var isRecursive = false; private void dataGridView1_Scroll(object sender, ScrollEventArgs e) { if (isRecursive) return; //Honor each 20th scroll for "*attempted gradual*" scrolling if (i % 20 == 0) { lastTopRow++; } isRecursive = true; dataGridView1.FirstDisplayedScrollingRowIndex = lastTopRow; isRecursive = false; //Boundary check if (i > int.MaxValue) i = 0; i++; }

Puede que necesite recurrir a capturas de pantalla (es decir, usando Blips) para engañar al usuario y hacerle pensar que la cuadrícula se desplaza un píxel a la vez cuando en realidad es solo una imagen. No recomendaría este enfoque.

La otra forma es usar un ViewPort como un Panel o un GroupBox y cambiar la posición superior de GridView.

A menos que quiera que los usuarios de su aplicación obtengan RSI o CTS, no veo el punto de desplazamiento tan preciso.

Mi enfoque original fue encerrar mi DataGridView dentro de un panel, establecer su altura fuera del límite del panel y luego cambiar la posición de la barra de desplazamiento del panel de control. Sin embargo, descubrí que el número de filas dentro de mi DataGridView llegaría a 2000, lo que me obliga a ajustar el tamaño de DataGridView al menos a:

65px (altura de fila) x 2,000 = 130,000px.

El tamaño máximo permitido para un control DataGridView en mi máquina de 64 bits es 65.535. ¿Alguien puede pensar en una forma de evitar este problema?


Tal vez podría establecer que la altura de la fila sea algo así como 1 píxel para que todas las filas tengan 1 píxel de alto en el momento en que todo se cargue. Luego, suponiendo que sepa cuántas filas pueden verse en la altura máxima del DataGridView que tiene, podría asegúrese de seleccionar 1 fila y colocarla en el centro de ella. Luego, con un bucle, puede establecer el alto de la fila seleccionada y x filas arriba y debajo de la fila seleccionada a los 65 píxeles. Y tenga cuando la fila seleccionada cambie (cuando el usuario usa las teclas de flecha, etc.) haga que desplace la selección al centro y cambie el tamaño de las filas nuevamente. Esa es la única forma en que puedo pensar para este caso.

Espero que sea de alguna ayuda para ti.


Hmm, no, no puedes tenerlo de las dos maneras. La restricción de tamaño de 65535 píxeles no es artificial, es una limitación muy estricta en el sistema operativo. El motivo subyacente es el mensaje WM_VSCROLL . El valor del argumento LPARAM pasado se documenta como:

El HIWORD especifica la posición actual del cuadro de desplazamiento si el LOWORD es SB_THUMBPOSITION o SB_THUMBTRACK

HIWORD son los 16 bits superiores en el valor, LOWORD son los 16 bits inferiores. Que solo puede proporcionar un rango de 0 .. Pow (2, 16) -1 = 0..65535. Esta limitación es visible en otros lugares, un ListBox se comporta mal si lo llenas con más de (65535 + elementos visibles). Ya no puedes desplazarte hacia abajo.

Suena como un problema bastante malo, seguramente Microsoft debería arreglar esas horribles limitaciones en su software. Pero no, esto no está en la parte superior de su lista de prioridades. No muy diferente de la aparentemente extraña limitación de que WaitHandle.WaitAny () no puede tratar con una matriz que contiene más de 64 elementos. Esto es intencional, piensan que lo estás haciendo mal, no ellos. Y lo es, una interfaz de usuario que espera que un usuario tenga que buscar entre miles de filas de información no es una interfaz muy útil o amigable. Siga el ejemplo de, por ejemplo, la forma en que Google muestra cientos de miles de consultas.