2010-12-16 4 views
1

저는 ListView가 타일 모드입니다. SizeChanged 이벤트가 발생할 때 발생시키는 사용자 지정 메서드를 만들었습니다. 여하튼이 메서드를 재정 의하여 SizeChanged 이벤트가 시작되기 전에 발생합니다.C# ListView Hook Pre SizeChanged 이벤트

SizeChanging 이벤트를 찾으려고했지만 거기에는 문제가 없습니다. 어떻게해야합니까?

+0

변경 사항은 무엇입니까? 클라이언트 창 크기; 코드 등? – curtisk

+0

폼의 ResizeBegin 이벤트 만 후보입니다. 목록보기가 도킹 또는 고정 된 경우에만 관련이 있습니다. 다른 것은 시간 기계가 필요합니다. –

답변

3

SizeChanged 이벤트가 발생하기 전에 논리를 추가하려면 기존 ListView 컨트롤을 하위 클래스에 추가해야합니다. 프로젝트에 새로운 클래스를 생성하고이 코드를 붙여 :

public class CustomListView : ListView 
{ 

    protected override void OnSizeChanged(System.EventArgs e) 
    { 
     //Fire my custom method before the ListView's size is changed 
     MyCustomMethod(); 

     base.OnSizeChanged(e); 
    } 

    private void MyCustomMethod() 
    { 
     //Insert your custom logic here 
     //... 
    }  

} 

그런 다음 프로젝트를 구축하고,이 CustomListView 컨트롤을 사용 (또는 무엇이든 당신은 그것을 이름을 결정하는) 대신 표준 ListView의.


또는 컨트롤 자체에서 사용자 지정 논리를 분리하려면 사용자 지정 목록 뷰에서 이벤트를 발생시킬 수도 있습니다. 그런 다음 코드에서 필요에 따라이 새로운 이벤트를 처리 할 수 ​​있습니다 (일관성을 위해 SizeChanging이라고합니다). 예를 들어 위의 예를 수정하면 다음과 같습니다.

public class CustomListView : ListView 
{ 

    public event EventHandler SizeChanging; 

    protected override void OnSizeChanged(System.EventArgs e) 
    { 
     //Raise the SizeChanging event before the ListView's size is changed 
     if (SizeChanging != null) { 
      SizeChanging(this, e); 
     } 

     base.OnSizeChanged(e); 
    } 

} 
+0

nitpicky :'Control'은'System.ComponentModel.Component'에서 파생되며 모든 컨트롤 (및 Form) 이벤트는'Component.Events' ('System.ComponentModel.EventHandlerList')에 의해 관리됩니다. Control 객체에 이벤트 포인터를 추가하는 대신이 메커니즘을 사용하는 것이 좋습니다. http://msdn.microsoft.com/en-us/library/system.componentmodel.eventhandlerlist.aspx – Tergiver

+1

@Tergiver : 흥미 롭다. 나는 어디서나 본 적이 없다고 생각한다. 호기심에서, 당신이 링크하는 문서가 그런 말을하지 않기 때문에, 어딘가에 특별히 제안 된 것이 있습니까? 예를 들어 있을까요? –

+0

그 패턴을 사용하도록 권장하는 Tergiver보다 나은 것을 요구하고 있다면, 저는이 패턴을 사용하지 않습니다. 나는 당신이 논리를 연습하도록 권합니다. 20 개의 이벤트가있는 클래스는 해당 이벤트에 대한 구독자가 없더라도 20 개의 포인터가 있습니다. Component.Events를 사용하면 포인터를 제거하여 클래스의 공간을 줄일 수 있습니다. 내가 제공 한 링크에는 커뮤니티 콘텐츠 섹션의 예가 있습니다. Control.Events는 이미 노출 (보호)되어 있으므로이를 선언 할 필요가 없습니다. 나는이 예제에서 문자열 키의 사용을 싫어하며'static 읽기 전용 객체 KeyIdentifier = new Object()'를 대신 사용합니다. – Tergiver