2010-05-07 7 views
2

문제가 있습니다. 나는 동적으로 생성 된 레이아웃과 함께 Windows Forms 응용 프로그램을 가지고 있지만 성능에 문제가 있습니다. 이 양식에서는 DataBinding.NET 4.0에서 사용하고 데이터 바인딩 후 설정은 정상적으로 작동하지만 ONE 컨트롤에 대한 바인딩 설정 시간은 약 초에 내 응용 프로그램을 차단합니다. 나는 몇 가지 컨트롤을 가지고 있으며 빙빙는 시간은 2 분입니다.C# .NET 4.0에서 느린 데이터 바인딩 설정 시간

나는 모든 가능한 해결책을 시도해, 나는 각자 바인딩 종류를 쓰기없이 아이디어가 없다. 내 코드가 왜 잘못 되었습니까? 문제의 코드 라인없이

case "Boolean": 
{ 
    Binding b = new Binding("Checked", __bindingsource, __ep.Name); 
    CheckBox cb = new CheckBox(); 

    /* 
    * HERE is the start of problem 
    */ 

    cb.DataBindings.Add(b); 

    /* 
    * HERE is the end of problem 
    */ 

    __flp.Controls.Add(cb); 
    __bindingcontrol.AddBinding(b); 
    break; 
} 

모두 빠르고 바인딩없이 작동 ;-(하지만 난 정상 속도에서 회전을 결합 할 수 있습니다. 생성 시간에

PS1. 나는 부유 한 레이아웃을.

PS2를. TextBox'es, PictureBoxe, CheckBox 같은 바인딩 문제가 있습니다.

문제를 디버깅하는 방법을 알려면 vs2010 프로파일 러에서 바인딩 문제 만 알았습니다.

,451,515,
  1. System.Windows.Forms.Control.ControlCollection.Add (클래스 System.Windows.Forms.Control)
  2. System.Windows.Forms.ControlBindingsCollection.Add (클래스 System.Windows.Forms.Binding)

편집 : DataContext는 데이터베이스에서 가져온 것입니다. (엔터티 프레임 워크)

+0

'__bindingsource'는 (는) 무엇을보고 있습니까? –

+0

@Marc Gravell : __bindingsource는 System.Windows.Forms.BindingSource이며 다른 형식으로 선언되고이 형식의 DataGridView에 바인딩되며이 형식 (dynamicaly)은 생성자 인수로 전달됩니다. – Svisstack

+0

Entity Framework 쿼리는 지연 시간이 있습니다. 이전에는 강제로 실행하지 않는 한 바인딩 시간에만 실행됩니다 (단, 바인딩 시간에 두 번 실행될 수도 있음). 따라서 쿼리가 복잡한 경우 언급 한 행에서 논리적으로 성능 문제가 표시됩니다. 그런 다음 체적에 관한 표시와 함께 쿼리의 구성 논리를 표시 할 수 있습니까? – Marcanpilami

답변

1

__bindingsource에는 많은 요소가 있으므로이 작업이 빠르지 않습니다.Binding 큰 컬렉션과 잘 작동하지 않으며 이는 문제입니다.

__bindingsourceBindingSource 클래스입니다. 그리고 빠른 작업을 위해서는 훨씬 적은 요소가 있어야합니다. 각 BindingSet (하나의 객체의 속성에 많은 요소를 한 번 바인딩하는 것을 의미 함)에 대해 또 다른 새로운 BindingSource 인스턴스를 만드는 것으로이 문제를 해결했습니다. 단 하나의 요소 만 사용하면됩니다.

1

이 경우 문제가 될지 확실하지 않지만 바인딩이 "이벤트 폭풍"을 유발하는 경우 오랜 시간이 걸릴 수 있습니다. 즉 컨트롤 A에 바인딩하면 컨트롤 B의 변경을 트리거하여 컨트롤 A의 변경을 트리거합니다.

확인할 사항 중 하나는 업데이트하려는 컨트롤의 이벤트입니다.

다른 의견은 양식 사이에 __bindingsource를 공유하는 것처럼 보입니다. 이것은 문제의 근원 일 수 있습니다. 왜 이런 짓을하는? 폼마다 바인딩 소스를 사용하면 프로그램을 관리하기가 더 쉽습니다.

+0

바인딩 탐색기를 사용하여 테이블의 요소를 반복하고 싶기 때문에 동일한 바인딩 소스를 사용합니다. 그러나이 루트가 문제의 루트 인 경우이 옵션을 잊어 버릴 수 있습니다. 나는 귀하의 게시물 tomorow를 분석하고 결과 피드백을 제공합니다. – Svisstack

+0

Binding Context는 Entity Framework에서 가져온 것으로,이 문제에 유용 할 수 있습니까? 포함 :이 DataContext의 DridGridView에 대한 데이터는 즉시로드됩니다. – Svisstack

0

이 문제도있었습니다. DataSourceUpdateMode을 -class 생성자의 Never으로 설정했습니다. 성능이 훨씬 향상되었습니다. 데이터 소스를 업데이트 할 필요가 없다면 이것이 올바른 방법입니다.

이 성능 문제는 발생 된 유효성 검사 이벤트 때문에 발생합니다. 컨트롤에서 포커스를 잃거나 클릭 된 경우에도 유효성 검사 이벤트가 발생하여 응용 프로그램의 성능이 크게 저하 될 수 있습니다.

EDIT : EntityFramework에 바인딩하지는 않았지만 성능이 매우 나빴습니다. DataSourceUpdateModeNever으로 설정하면 발생되는 이벤트 수가 줄어 듭니다. DataSourceUpdatedModeNever으로 설정하면 업데이트가 단방향 (데이터 원본에서 제어까지)됩니다.

+0

DataSinding OneTime은 DataSource에서 Control으로, 항상 DataSource에서는 Control에서 Data를 검증해야합니다. 왜냐하면 다른 SQL에서는 SQL 오류가 발생하기 때문입니다. – Svisstack

관련 문제