2009-04-13 4 views
1

winforms를 사용하여 KeyPreview 속성을 true로 설정하고 기본 폼 내에서 적절한 키 이벤트에 대한 이벤트 핸들을 가지고 있습니다.키 미리보기 및 수락 단추

폼을 상속 한 폼에서 응용 프로그램의 요구 사항에 따라 AcceptButton 속성을 설정합니다.

Enter 키에 AcceptButton의 기능과 다른 기능을 부여하려는 경우가 있습니다.

기본 폼 내에서 Enter 키를 누른 다음 AcceptButton 이벤트가 발생하지 않도록 특별한 경우를 확인하고 싶습니다.

내 Basef 형식의 키 이벤트보다 먼저 AcceptButton 클릭이 발생합니다. 가능한 수락 버튼의 클릭 이벤트에 기능을 쓸 수도 있지만, 제 의견으로는 해킹이 될 수 있습니다.

제안 사항?

감사합니다.

+0

위의 것 내 문제를 해결하는 데 도움이 수있는 후속 질문은 "acceptbutton 클릭 억제하는 방법이 있나요? – user90279

답변

2

이 문제를 처리하는 또 다른 방법은 수락 및/또는 취소 단추를 숨길 수있는 양식의 ProcessDialogKey() 메서드를 재정의하는 것입니다. 예를 들어 사용자 입력을 기반으로 그리드를 필터링하는 필터 편집기가있는 응용 프로그램이 있습니다. 필터 편집기 컨트롤에 필터를 적용 할 포커스가있는 경우 사용자가 반환 키를 누를 수 있어야합니다. 문제는 수락 단추 코드가 실행되고 양식을 닫는 것입니다. 아래 코드는 문제를 해결합니다.

기본 대화 상자 형식으로 다음 코드를 삭제하면이 문제를 더욱 효과적으로 처리 할 수 ​​있습니다. 그런 다음 필요에 따라 하위 클래스의 컨트롤에 대한 수락 단추를 표시하지 않을 수 있습니다.

private readonly List<Control> _disableAcceptButtonList = new List<Control>(); 

    protected override bool ProcessDialogKey(Keys keyData) 
    { 
     if (((keyData & Keys.Return) == Keys.Return) && (_disableAcceptButtonList.Count > 0)) 
     { 
      foreach (Control control in _disableAcceptButtonList) 
       if (control.ContainsFocus) 
        return false; 
     } 

     return base.ProcessDialogKey(keyData); 
    } 

    protected virtual void DisableAcceptButtonForControl(Control control) 
    { 
     if (!_disableAcceptButtonList.Contains(control)) 
      _disableAcceptButtonList.Add(control); 
    } 
+0

솔리드 생각. 내가 필요한 경우는, 글로벌 수준에서 적용 할 수있는 방법을 좋아한다, 광산은 특정 통제만을위한 것입니다. – user90279

0

해결 방법으로 우리는 받아 들일 수있는 기능을 무시하기 위해 컨트롤의 입력 및 종료 이벤트를 캡처했습니다. enter 이벤트 내에서 private 변수에 현재 accept 버튼을두고 accept 버튼을 null로 설정했다. 떠날 때 우리는 받아 들인 버튼을 우리가 가지고 있었던 사적인 ​​변수에 다시 할당 할 것입니다.

KeyPreview 이벤트는 위와 비슷한 작업을 수행 할 수 있습니다. 누구든지 좀 더 우아한 해결책을 가지고 있다면, 나는 여전히 알고 싶어합니다.

감사합니다.