2016-10-12 1 views
-2

나는 (특히 특정 버튼을 누를 때 처음으로) 드문 상황에서 (매우 복잡한) 응용 프로그램과form.ShowDialog (owner)는 IndexOutOfRangeException을 발생시킵니다. 원인은 무엇입니까?

public static bool ShowDialogOk(this Form form, IWin32Window owner = null) { 
      return form.ShowDialog(owner) == DialogResult.OK; 

{System.IndexOutOfRangeException: Index -1 does not have a value. 
    at System.Windows.Forms.CurrencyManager.get_Item(Int32 index) 
    at System.Windows.Forms.DataGridView.DataGridViewDataConnection.OnRowEnter(DataGridViewCellEventArgs e) 
    at System.Windows.Forms.DataGridView.OnRowEnter(DataGridViewCell& dataGridViewCell, Int32 columnIndex, Int32 rowIndex, Boolean canCreateNewRow, Boolean validationFailureOccurred) 
    at System.Windows.Forms.DataGridView.SetCurrentCellAddressCore(Int32 columnIndex, Int32 rowIndex, Boolean setAnchorCellAddress, Boolean validateCurrentCell, Boolean throughMouseClick) 
    at System.Windows.Forms.DataGridView.OnCellMouseDown(HitTestInfo hti, Boolean isShiftDown, Boolean isControlDown) 
    at System.Windows.Forms.DataGridView.OnCellMouseDown(DataGridViewCellMouseEventArgs e) 
    at System.Windows.Forms.DataGridView.OnMouseDown(MouseEventArgs e) 
    at System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.DataGridView.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
    at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
    at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Form.ShowDialog(IWin32Window owner) 

이제이 함수가 호출하는 예외를 던져 기능을 가지고 충돌 이전에 같은 변수를 사용하여 무엇이 잘못되었는지를 알기가 어렵습니다. 누구든지 form.ShowDialog 함수에서 IndexOutOfRangeException의 가능한 원인을 알고 있습니까? 그렇게하면이 코드를 좀 더 디버깅 할 수 있습니다.

편집 : ShowDialogOk는 단 한 곳에서만 호출되는 것으로 나타났습니다.이 줄에 중단 점을 입력하면 GUI를 만들 때만 전달되지만 실제로는 오류가 발생할 때 전달되지 않습니다.

+0

그리고 누구 전에 예스 바깥 쪽 인덱스가 예외 범위 밖으로 나가는 것을 의미한다는 것을 알고 있습니다.하지만 인덱스 경계를 ​​벗어날 것입니다.하지만 실제로는 windows.Forms 코드를 변경할 수는 없습니다. windows.forms에서이 오류가 발생할 수있는 상황을 찾고 있습니다. 이전 호출은 최소한 얕은 사본에서는 같은 양식을 사용하지만 전체 GUI의 코드를 제공하면이 질문에 커다란 도움이됩니다. – Thijser

+0

StackTrace는 문제가 'DataGridView'에 있음을 알려줍니다. 양식이 열릴 때 뭔가 추가하고 있습니까? MouseClick을 강요하고 있습니까? 내가 보여준 코드가 문제의 원인이라고 생각하지 않습니다. – jAC

+0

코드에서 마우스 클릭을 강요하지 않지만 마우스 커서로 여기에 응답하고 있습니다. – Thijser

답변

-1

CurrencyManager 속성은 크기를 확인하고 크기를 확인합니다. (이 폼 클래스의 속성이며, 그 아마 행 입력하거나 somrthing가) (AN 그리드 이벤트에 사용) (을 가정 한 속성입니다 때문에 : CurrencyManager.get_Item (INT32 지수))

var index = <somenumber>; 
if(CurrencyManager.Length > 0 && index < CurrencyManager.Length) //also can be Count() 
    CurrencyManager[index] 
else 
    // Do some logic when index is out of bounds. 
+0

문제는 CurrencyManager라는 단어가 내 코드의 아무 곳에 나 나타나지 않는다는 것입니다. 문제는 윈도우 안쪽 어딘가에서 발생한다는 것입니다.양식에 액세스 할 수 없습니다. – Thijser

+0

해당 양식의 통화 형식을 꺼내거나 삭제하고 주석을 달고 작동하는지 확인하십시오. (그것의 단지 임시) –

+0

Yhea 문제는 그 폼이 정말로 버튼 하나의 새로운 버튼이 모든 버튼 누름이 나타나는 곳의 datagridview라는 것입니다. 처음 버튼을 누를 때 처음 던졌습니다. 이 오류. – Thijser