StackOverflowException im DataGridView-Steuerelement auf dem Tablet-PC
Dieser Artikel hilft Ihnen, die Stack Overflow-Ausnahme zu vermeiden, wenn Sie auf ein DataGridView-Steuerelement auf dem Tablet-PC zugreifen.
Ursprüngliche Produktversion: .NET Framework
Ursprüngliche KB-Nummer: 3046509
Problembeschreibung
Wenn ein Benutzer zum ersten Mal auf ein Steuerelement mit System.Windows.Forms.DataGridView vielen Zeilen auf einem Tablet-PC zugreift, stürzt das Steuerelement ab und generiert eine Stack Overflow-Ausnahme.
Dieses Problem tritt auf, wenn die erste Benutzeraktion darin besteht, auf die letzte Zeile oder eine andere Zeile am unteren Rand des Steuerelements zuzugreifen, nachdem die Anwendung gestartet wurde. Wenn beispielsweise die Anwendung gestartet und das Formular mit dem Windows Forms DataGridView-Steuerelement angezeigt wird, scrollt der Benutzer zur letzten Zeile des Steuerelements und wählt diese Zeile aus.
Wenn die erste Benutzeraktion darin besteht, auf Zeilen zuzugreifen, die sich nicht weit vom oberen Rand des Windows Forms DataGridView-Steuerelements befinden, tritt der Stapelüberlauf nicht auf.
Es folgt ein Beispiel für einen Aufrufstapel, der nach einem Absturz generiert wird:
System.Windows.Forms.dll! System. Windows. Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get()
<repeat>
System.Windows.Forms.dll! System. Windows. Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get()
System.Windows.Forms.dll! System. Windows. Forms.DataGridViewRow.DataGridViewRowAccessibleObject.Bounds.get()
System.Windows.Forms.dll! System. Windows. Forms.DataGridViewCell.DataGridViewCellAccessibleObject.GetAccessibleObjectBounds(System.Windows. Forms.AccessibleObject parentAccObject)
System.Windows.Forms.dll! System. Windows. Forms.DataGridViewCell.DataGridViewCellAccessibleObject.Bounds.get()
System.Windows.Forms.dll! System. Windows. Forms.AccessibleObject.Accessibility.IAccessible.accLocation(int pxLeft, int pyTop, int pcxWidth, int pcyHeight, object childID)
System.Windows.Forms.dll! System. Windows. Forms.InternalAccessibleObject.System. Windows. Forms.UnsafeNativeMethods.IAccessibleInternal.accLocation(int l, int t, int w, int h, object childID)
[Systemeigen in verwalteten Übergang]
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 librariessCaretEvents()
user32.dll! ___ClientCallWinEventProc@4- ()
ntdll.dll! _KiUserCallbackDispatcher@12- ()
Ursache
Wenn ein Benutzer das erste Mal auf das Windows Forms DataGridView-Steuerelement zugreift, fragt die Tablet PC-Eingabepanelkomponente die Grenzen der Klasse ab, die dem ersten untergeordneten Element AccessibleObject des Windows Forms DataGridView-Steuerelements entspricht. In der Regel ist das erste untergeordnete Element die oberste Zeile des Steuerelements. Wenn der Benutzer jedoch einen Bildlauf nach unten zum unteren Rand des Steuerelements durchführt, ist die oberste Zeile nicht mehr sichtbar.
In diesem Fall versucht das Windows Forms DataGridView-Steuerelement, die erste sichtbare Zeile zurückzugeben. Um die erste sichtbare Zeile zu finden, zählt die Klasse des Steuerelements rekursiv alle Zeilen auf, AccessibleObject bis sie die sichtbare Zeile erreicht. Abhängig von den ressourcen, die für den Prozess verfügbar sind, kann das Programm abstürzt, während es nach der nächsten Zeile sucht.
Lösung
Um die Stapelüberlaufausnahme zu vermeiden, können Entwickler die Klasse initialisieren, AccessibleObject sobald das Windows Forms DataGridView-Steuerelement aufgefüllt wird. Sie können z. B. den folgenden Code verwenden, um den Fokus für das Steuerelement festzulegen:
dataGridView1.Focus();
Wenn Sie diesen Befehl ausführen, tritt die folgende Abfolge von Ereignissen auf:
- Die Tablet PC-Eingabepanelkomponente wird initialisiert.
- Die Tablet PC-Eingabepanelkomponente verfolgt alle Aktionen nach, die dem Steuerelement zugeordnet sind.
- Die Tablet PC-Eingabepanelkomponente fragt die Grenzen der ausgewählten Zeile anstelle der ersten sichtbaren Zeile ab.
Weitere Informationen
Dies ist ein Implementierungsfluss in der Microsoft Active Accessibility-Unterstützung des Windows Forms DataGridView-Steuerelements.