2011-02-15 4 views
0

필자는 필자의 이전 연구에서 주로 웹 기술과 관련이 있으며 대부분 백엔드에서와 같이 Windows 프로그래밍에 익숙하지 않습니다. Winforms 응용 프로그램을 상속 한 내 가장 큰 악몽 중 하나는 폼이 들어갈 수있는 끝없는 상태를 탐색하는 것입니다.양식 상태를 더 효과적으로 관리 할 수 ​​있습니까?

예를 들어, 폼은 상태를 '새로 만들기'및 '편집' 사용자가 레코드 추가 또는 편집을 결정했습니다. 이 양식에는 논리가 있습니다. 이 texbox에 특정 값이 있으면이 다른 텍스트 상자는 사용할 수 없게됩니다. 이렇게하면 이러한 규칙이 끊임없이 연결됩니다. 따라서 텍스트 상자의 TextChanged 이벤트는 다른 필드에 영향을줍니다. 그러면 다른 컨트롤의 상태를 변경하는 X 이벤트가 발생합니다. 그것은 유지하기가 불가능한 얽힌 혼란으로 빠르게 전복됩니다.

더 나은 방법이 있어야합니다.이 문제를 해결하는 간단하고 우아한 무언가가 있습니다. 어떤 제안?

답변

1

내가하는 일은 FormatControls()이라는 단일 방법을 사용하는 것입니다. 이 방법에서는 myTextbox.Enabled = mycheckBox.Checked과 같은 모든 로직을 구현합니다.

나는 체크 된 변경 등등과 같은 형식의 내 이벤트 핸들러에서이 메서드를 호출합니다 ... 적절한 경우 (즉, 데이터가 새로로드 된 폼, 데이터베이스에서로드 된 레코드 등)도 호출합니다. 이것은 여러 해 동안 나에게 잘 어울리 며 모든 것을 덜 복잡하게 만듭니다.

사용중인 패턴이 없으면 너무 복잡한 것으로 변할 수 있습니다.

+1

나는이 아이디어를 좋아한다. FormatControls 꽤 큰 자체 (물론, 당신은 작은 비트로 리팩터링 할 수 있지만) 발견했다. 논리가 어딘가에 있어야한다고 생각합니다. 수많은 이벤트 핸들러에 퍼져있는 것보다 중앙에서 한 곳에서 훨씬 나아졌습니다. – tardomatic

0

Application.Idle 이벤트를 사용하여 사용 안 함 논리를 수행하고이 부분을 비즈니스 논리 파트에서 분리 할 수 ​​있습니다.

+0

이것은 "느슨하게 결합 된"것으로 간주 될 수 있지만 CPU를 100 % 고정 할 위험이 있습니다. – Reinderien

+0

@Reinderien 값 비싼 루프 * 안드로이드 * 처리기를 사용하지 않으면 CPU가 값 비싼로드를 채우지 않습니다. 단지이 이벤트가 이전 메시지 루프의 창에 의해 발생 되었기 때문입니다. –

+0

나는 이것을 잘 모르겠다. 전체 응용 프로그램이 유휴 상태가 될 때마다 Application.Idle 이벤트가 실행되지 않습니까? 신청서에 양식이 여러 개 있다면 어떨까요? 현재 어떤 윈도우가 표시되는지 파악한 다음 필요한 로직을 수행해야합니까? – tardomatic

0

양식에있는 컨트롤에 따라 개별 텍스트 상자를 제거하고 단추를 추가/삭제하고 전체 작업을 DataGrid으로 바꿀 수 있습니다.

+0

DataGrid와 비슷한 문제가 있습니다. 다른 셀의 값에 따라 특정 열을 비활성화해야합니다. 행 기반으로이 작업을 관리해야하기 때문에이 작업이 더욱 복잡해집니다. – tardomatic

관련 문제