2012-01-15 2 views
0

때때로 사용자 정의 컨트롤을 표시하고 해당 바인딩을 설정하려면 System.ArgumentOutOfRangeException이 표시됩니다. 계속을 클릭하면 작업이 중단되지만 동일한 작업을 다시 수행하면 사용자 정의 컨트롤이 제대로 표시됩니다. 문제를 재현 할 수 없습니다.때때로 BindingsCollection에서 System.ArgumentOutOfRangeException이 발생합니다.

업데이트 도중 BingdinsCollection이 변경되는 몇 가지 문제를 읽었습니다. 그러나 나는 내 프로젝트의 특정 코드를 지적 할 수 없다. 창문 핸들과 관련이있을 수 있습니까?

************** Exception Text ************** 
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. 
Parameter name: index 
    at System.Collections.ArrayList.get_Item(Int32 index) 
    at System.Windows.Forms.BindingsCollection.get_Item(Int32 index) 
    at System.Windows.Forms.Control.UpdateBindings() 
    at System.Windows.Forms.Control.OnBindingContextChanged(EventArgs e) 
    at System.Windows.Forms.ContainerControl.OnCreateControl() 
    at System.Windows.Forms.UserControl.OnCreateControl() 
    at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) 
    at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) 
    at System.Windows.Forms.Control.CreateControl() 
    at System.Windows.Forms.Control.OnVisibleChanged(EventArgs e) 
    at System.Windows.Forms.ScrollableControl.OnVisibleChanged(EventArgs e) 
    at System.Windows.Forms.Control.SetVisibleCore(Boolean value) 
    at System.Windows.Forms.Control.set_Visible(Boolean value) 
    .. my click 
+0

아주 작은 정보로 예/아니오 질문 대신 "이것을 디버깅하는 프로세스가 무엇인가"또는 이와 비슷한 질문을하면 질문이 개선 될 것입니다. – mydogisbox

+2

여기 당신에게 도움이되는 질문이 충분하지 않습니다. 실패한 코드를 게시해야합니다. –

답변

0

다른 스레드에서 BindingSource를 설정하고 있습니까? 또는 을 다른 스레드에서 처리하면 열거되는 동안 DataBindings 컬렉션이 변경 될 수 있습니다.

프레임 워크 소스에서 이것은 발생할 수있는 유일한 방법 인 것처럼 보입니다. 당신이 컨트롤의 가시성을 변경 같은 BindingsCollection.cs에서 Control.cs

private void UpdateBindings() 
    { 
     for (int index = 0; index < this.DataBindings.Count; ++index) 
     BindingContext.UpdateBinding(this.BindingContext, ((BindingsCollection) this.DataBindings)[index]); 
    } 

에서

의 예외 스택 추적에서
public Binding this[int index] 
{ 
    get 
    { 
    return (Binding) this.List[index]; 
    } 
} 
+0

바인딩을 추가하고 화면을 보여주는 것은 같은 스레드에서 발생합니다. 데이터 자체는 다른 스레드에서 가져온 것입니다. 예외가 발생하는 usercontrol에서 바인딩을 제거하지 않고 추가 만합니다. 나는 예외가 발생하는 컨트롤을 알지 못한다. 재현 할 수 없다. – Bojo

+0

코드를 게시하십시오. 그렇지 않으면 더 많은 추측을 얻을 수 있습니다. –

0

, 그것은 보이지만 ArrayList를이 결합 컨트롤에 컨트롤에 대한 올바른 항목이 없습니다.

작업을 수행하는 순서를 변경하려고합니다. 예를 들어 바인딩하고 표시하는 경우 해당 프로세스를 취소합니다.

+0

먼저 컨트롤을 만들고 바인딩을 부모에게 설정 한 다음 마지막으로 보여줍니다. 실제 데이터 만 표시하고 기본값/빈 값은 표시하지 않습니다. 상태를 표시하는 데 색상을 사용하고 항상 상태 변경을 표시하고 싶지 않습니다. – Bojo

+0

일부 경우에는 바인딩이 잘못된 것 같습니다. 사용중인 코드가 표시되지 않지만 배열 목록과 컨트롤을 바인딩하는 데 사용되는 인덱스 주변에 범위 검사가 많이 포함되어 있는지 확인합니다. –

관련 문제