StackOverflowException en el control DataGridView en Tablet PC
Este artículo le ayuda a evitar la excepción de desbordamiento de la pila al tener acceso a un control DataGridView en Tablet PC.
Versión del producto original: .NET Framework
Número KB original: 3046509
Síntomas
Cuando un usuario accede por primera vez a un control que tiene muchas filas en un Tablet PC, el control se bloquea y genera una excepción de desbordamiento System.Windows.Forms.DataGridView de pila.
Este problema se produce si la primera acción del usuario es obtener acceso a la última fila u otra fila cerca de la parte inferior del control después de que se inicie la aplicación. Por ejemplo, después de que se inicie la aplicación y se muestre el formulario que tiene el control dataGridView de Windows Forms, el usuario se desplaza a la última fila del control y selecciona esa fila.
Si la primera acción del usuario es obtener acceso a filas que no están lejos de la parte superior del control DataGridView de Windows Forms, no se producirá el desbordamiento de la pila.
A continuación se muestra una pila de llamadas de ejemplo que se genera después de un bloqueo:
System.Windows.Forms.dll! Sistema. Windows. Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get()
<repeat>
System.Windows.Forms.dll! Sistema. Windows. Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get()
System.Windows.Forms.dll! Sistema. Windows. Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get()
System.Windows.Forms.dll! Sistema. Windows. Forms.DataGridViewCell.DataGridViewCellAccessibleObject.GetAccessibleObjectBounds(System.Windows. Forms.AccessibleObject parentAccObject)
System.Windows.Forms.dll! Sistema. Windows. Forms.DataGridViewCell.DataGridViewCellAccessibleObject.Bounds.get()
System.Windows.Forms.dll! Sistema. Windows. Forms.AccessibleObject.Accessibility.IAccessible.accLocation(int pxLeft, int pyTop, int pcxWidth, int pcyHeight, object childID)
System.Windows.Forms.dll! Sistema. Windows. Forms.InternalAccessibleObject.System. Windows. Forms.UnsafeNativeMethods.IAccessibleInternal.accLocation(int l, int t, int w, int h, object childID)
[Transición nativa a administrada]
oleacc.dll! AccWrap_LocationEtcFix::accLocation(long *,long *,long *,long *,struct tagVARIANT)
tiptsf.dll! CARET::UpdateMSAAEditFieldState()
tiptsf.dll! CARET::UpdateEditFieldState(struct HWND__ *,unsigned int,unsigned int)
tiptsf.dll! CARET::_ProcessCaretEvents()
tiptsf.dll! CARET::P rocessCaretEvents()
user32.dll! ___ClientCallWinEventProc@4- ()
ntdll.dll! _KiUserCallbackDispatcher@12- ()
Causa
Cuando un usuario tiene acceso al control DataGridView de Windows Forms por primera vez, el componente de panel de entrada de Tablet PC consulta los límites de la clase que corresponde al primer elemento secundario del AccessibleObject control DataGridView de Windows Forms. Normalmente, el primer elemento secundario es la fila superior del control. Sin embargo, si el usuario se desplaza hacia abajo hasta la parte inferior del control, la fila superior ya no estará visible.
En esta situación, el control Windows Forms DataGridView intenta devolver la primera fila visible. Para buscar la primera fila visible, la clase del control enumera de forma recursiva todas las filas hasta que AccessibleObject llega a la fila visible. Según los recursos disponibles para el proceso, el programa puede bloquearse mientras busca la siguiente fila.
Solución
Para evitar la excepción de desbordamiento de pila, los programadores pueden inicializar la clase tan pronto como se rellene el AccessibleObject control dataGridView de Windows formularios. Por ejemplo, puede usar el siguiente código para establecer el foco del control:
dataGridView1.Focus();
Al ejecutar este comando, se produce la siguiente secuencia de eventos:
- Se inicializa el componente del panel de entrada de Tablet PC.
- El componente del panel de entrada de Tablet PC realiza un seguimiento de todas las acciones asociadas con el control.
- El componente del panel de entrada de Tablet PC consulta los límites de la fila seleccionada en lugar de la primera fila visible.
Más información
Este es un flujo de implementación en el Windows Forms DataGridView del control Microsoft Active Accessibility.