2013-05-16 2 views
0

나는 Control (예 : ToolStripMenuItemButton)에 클릭 이벤트에 바인딩 된 함수가 있어야합니다. 새로운 Form을 생성하거나 TabPage을 현재 TabControl에 추가합니다. 결국 같은 함수가 필요한 여러 다른 Control이 생겨 결국 전역 함수 저장소를 만들려고합니다. 그것은 어디서나 액세스 할 수 있도록 프로그램 시작과 세계적으로 저장 될 때글로벌 함수 리파지토리

public class Services { 
    TabControl container; 
    delegate void fonction(int id); 
    Dictionary<string, fonction> functions = new Dictionary<string, fonction>(); 

    public Services(TabControl control) { 
     container = control; 
     InitFunctions(); 
    } 

    public Delegate Getfunction(string name) { 
     if (functions.ContainsKey(name)) 
      return functions[name]; 
     else 
      throw new NotImplementedException("Failed to instantiate " + name); 
    } 

    // List of all the desired functions 
    // Function example 
    private void ProductLoan(int id) { 
     string name = "Loan"+id.ToString(); 
     Form newForm = new Loan(); 
     newForm.Text = Properties.Resources.MakeLoan; 
     newForm.ShowDialog(); 
    } 
    private void InitFunctions() { 
     fonction f = new fonction(ProductLoan); 
     functions.Add("Loan", f); 
     // For each functions 
     // f = new fonction(name); 
     // functions.Add(name, f); 
    } 
} 

이 클래스는 인스턴스화 할 것 :

나는이처럼 보이는 Services라는 이름의 클래스를 가질 것이다. 이런 식으로 진행하는 것은 잘못되었지만 TabControl의 인스턴스가 있어야하고 함수 목록을 초기화해야하기 때문에 Services 클래스를 정적으로 만들지 않았습니다.

나는 이것이 좋은 생각인지 실마리가 없기 때문에 약간의 조언을 부탁드립니다.

+1

로드시 정적으로 'TabControl'을 할당 할 수 있습니다. 정적 멤버가 "generic things"을 선호합니다. – lcssanches

+0

흥미 롭지 만 여전히 함수 목록을 초기화해야합니다. 'Services' 클래스는 매개 변수가 필요 없으므로 정적 일 수 있습니다. 필자가 염려하는 점은 TabControl을 지정하지 않아도 모든 프로그래머가 함수를 가져올 수 있다는 것입니다. TabControl 인스턴스/참조와 함수 목록을 초기화 할 때'Services '를 사용하는 유일한 방법이 있는지 확인하고 싶습니다. –

+1

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

답변

1

어떤 프로그래밍 환경을 사용하고 있습니까? Visual Studio에서 동일한 메서드를 사용하는 여러 컨트롤을 사용하는 경우 클릭 이벤트 중 하나에서 메서드를 만들 수 있으며 동일한 메서드가 필요한 각 컨트롤에 대해 컨트롤을 실제로 바인딩함으로써 바인딩 할 수 있음을 알고 있습니다. 해당 컨트롤을 추가 한 첫 번째 컨트롤의 click 이벤트에 전달합니다. 지금까지 필요한 각 함수가 들어있는 저장소를 만들 때마다 개별 클릭 이벤트를 만드는 것이 더 좋았습니다. 함수를 보유하고 정적으로 만드는 클래스를 만드는 것이 좋습니다. 서비스는 먼저 다른 인스턴스가 필요하기 때문에 TabControl을 인스턴스화 한 다음 메서드를 보유하고있는 정적 클래스를 인스턴스화하면됩니다.

+0

사실 내가 사용하는 Visual Studio입니다. 클릭 이벤트를 바인딩하는 첫 번째 컨트롤은'ToolStripMenu'입니다. 나는 dynamicaly를 생성하는 다른 컨트롤에서이 함수를 어떻게 사용할 수 있을지 아직 나에게는 수수께끼입니다. 아마도 프로그램 전체에 메뉴를 전달해야 할 것입니다. –

+0

메소드가 수행해야하는 작업에 _depending_ 사용하면 안됩니다.할 수있는 일은 그래픽 편집기에서 코딩 한 첫 번째 '컨트롤'과 동일한 방법을 사용하는 '컨트롤'을 클릭하는 것입니다. 그런 다음 측면의 이벤트 메뉴에서 'OnClick'방법을 클릭하면 먼저 프로그래밍 한 '제어'에 대한 원래의 클릭 방법을 선택할 수있는 드롭 다운이 있어야합니다. – David

+0

것은 내 메뉴와 내 컨트롤이 동적으로 생성되므로 메뉴가 유지 될 기능이나 프로그램이 실행될 때까지의 위치를 ​​알 수 없습니다. –

1

탭과 양식을 각각 생성하기위한 public 인스턴스 메소드를 사용하여 TabControllerPopupController과 같은 것을 만들 수 있습니다. TabController은 아마도 TabControl에 대한 의존성을 가지며 PopupContorller은 (필요한 경우) 상위 형식에 대한 종속성을 갖습니다. 모든 Control에는 TabControllerPopupController의 메서드가 호출되는 자체 이벤트 처리기가 있습니다.

UPD :

Controls가 동적으로 생성되기 때문에, 이벤트 핸들러를 배선을위한 공통 설비가 좋은 생각이있을 수 있습니다. 그러나 와이어 링 로직은 이벤트 핸들러 구현 로직과 분리되어보다 읽기 쉽고 유지 보수가 용이해야합니다. 예를 들어 IntelligentEventHandlerWiringManagerTabControllerPopupController에 대한 종속성을 가질 수 있습니다.

+0

나는 TabControl과 새로운 Forms에 대한 두 가지 서비스를 제공 할 클래스를 원했다. 그래서 나는 두 개의 컨트롤러로'Services'를 갖게 될 것입니다. –

+0

기본 아이디어는 인스턴스 메서드를 직접 호출 할 수있는 경우 대리자가 포함 된 사전이 필요 없다는 것입니다. TabController와 PopupController의 분리에 관해서는 다른 책임이있는 것처럼 보입니다. 두 가지 자연적 종속성은 하나의 복합성과 완전히 부자연 스러움보다 나를 잘 보입니다. – OpenMinded

관련 문제