2008-09-25 2 views
1

C#으로 작성된 Windows Form 앱이 있습니다. 그 일은 사용자 목록에 메시지를 보내는 것입니다. 이러한 메시지가 전송되는 동안 각 사용자의 작업 상태를 표시하고 싶습니다. 내가 뭘하는지 (각 사용자마다) Label 컨트롤을 만들고 Panel에 추가하고 있습니다. 이것은 작은 사용자 집합에 문제없이 작동합니다..NET Windows Form (C#)에 많은 컨트롤을 추가 할 때 문제가 발생했습니다.

유형의 첫 번째 예외 'System.ComponentModel.Win32Exception가' 가 system.windows.forms.dll (A)에 발생 : I 1000 이상으로 크기를 늘릴 때, 비주얼 스튜디오 디버거는 다음과 같은 메시지를 표시합니다 유형 'System.Reflection.TargetInvocationException'의 첫 번째 예외는 가 mscorlib.dll

그리고 응용 프로그램이 중단 발생했습니다. 내가 뭘 잘못하고 어떻게 해결할 수 있을지에 대한 생각?

답변

3

크기를 알면 RichTextBox에 상태를 표시하는 것이 좋습니다.

너무 많은 핸들을 생성하고 프레임 워크에서 처리 할 수없는 경우가 있습니다.

+0

Absolutely ... adeel825, System.Windows.Forms (아마 모든 것)의 모든 것이 Windows API에 해당하며 그 한계에 구속된다는 것을 기억하십시오. –

2

이것은 일종의 해결 방법이지만 사용자가 실제로 1000 명을보고 싶지는 않습니다. 그들에게 현재/가장 최근 및 요약 보고서를 보여줍니다. 또는 페이지를 넘겨 보도록하십시오.

3

대신 DataGridView 사용

0

너무 많은 컨트롤! 모든 상태 메시지를 포함하는 단일 컨트롤을 만듭니다. 멀티 라인 텍스트 박스는 어떻습니까?

1

특정 코드를 보지 않아도 알기가 어렵습니다. 만약 내가 같은 프로그램으로 임명 되었다면, 나는 다르게 접근 할 것이다.

그리드 나리스트 뷰를 사용하여 사용자 및 전송중인 메시지의 상태를 표시합니다. 이러한 컨트롤은 제한없는 (시스템 메모리에 의해 잘 제한된) 행 수를 처리 할 수 ​​있습니다. 사용자 당 하나의 행 (또는 메시지 당 하나의 행 - 이제까지 더 효과적입니다).

UI 스레드에서 계속 진행해야합니다. 백그라운드 작업자 (BacngroundWorker 클래스) 또는 메시지 대기열 프레임 워크 (MSMQ, SQL 서버)를 사용하여 메시지를 비동기 적으로 보내고 BackgroundWorker를 통해 상태를보고합니다.

귀하의 구체적인 오류에 관해서 - 나는 당신이 그것을 얻는 이유를 모르겠습니다. WinForm에 넣을 수있는 레이블의 수에는 제한이 없어야합니다. 나는 그 오류가 다른 것으로 인한 것이라고 생각합니다.

0

문자 그대로 패널에 레이블을 표시하는 경우 GDI를 사용하여 상태를 표시하는 것이 좋습니다. OnPaint에 보이는 영역의 텍스트를 작성하고 변경 될 때만 상태 라벨의 영역을 무효화하십시오.

1

폼에 ProgressBar를 배치하십시오. 메시지를 1000 명에게 보내는 경우 메시지를 보낼 때마다 ProgressBar를 1 씩 증가시킵니다.

1000 명에게 5 개의 메시지를 보내는 경우 메시지와 사람의 진행률 막대를 각각 하나씩 표시합니다 (두 번째 막대는 첫 번째 막대의 각 값에 대해 한 번씩 값을 순환합니다).

각 진행률 표시 줄에 대해 레이블을 지정할 수도 있습니다 ("95 % 완료"또는 "메시지 3/5"등).

.NET 폼에는 많은 수의 컨트롤을 사용할 수 없으며 가능한 경우 사용자가 동시에 모든 것을 볼 수있는 방법이 없습니다.

1

세부 모드에서 ListView을 사용하고 싶습니다. 일반적으로 행을 추가하고 선택한 항목을 선택하고 항목에 EnsureVisible()을 호출하면 자동 스크롤이 실행됩니다.

이미 언급 한 것처럼 컨트롤은 하나 이상의 창 핸들과 관련이 있으며 운영 체제는 많은 것을 제공 할 수 있습니다.

관련 문제