簡體   English   中英

用戶控件從另一個用戶控件的訪問方法

[英]Access method of an usercontrol from another usercontrol

在我的表單上,我有2個繼承FadeControl的UserControls(ButtonDiscount,ButtonAdvertisment)。 FadeControl繼承UserControl類,用於對控件進行自定義操作,例如淡出。

我的2個UserControl都只有一個按鈕,因此只有兩個按鈕。

在一個用戶控件上單擊該按鈕時,我需要從另一個用戶控件訪問FadeControl中的方法。 另一個按鈕則相反。

我完成了以下操作,在事件中,單擊UserControl ButtonDiscount:

private void button1_Click(object sender, EventArgs e)
{
    ButtonAdvertisment ba = (ButtonAdvertisment)this.Parent.Controls.Find("buttonAdvertisment1", true)[0];
    ba.FadeOut(true);
}

它像一種魅力一樣工作,但是我認為這不是正確的方法,是否還有另一種方法可以從另一個UserControl的父類訪問該方法?

我無法通過UserControl構造函數傳遞它,設計器每次都會崩潰。

您有2個彼此不認識的單獨的用戶控件,這很不錯,並且可以使您的代碼保持松散耦合。 現在,您想要做的就是讓他們以某種方式彼此了解並進行交流。 使他們彼此了解會破壞松散耦合,這是一個糟糕的設計。

我建議創建一個第三個控件,它將第三個控件放在一起並處理它們之間的所有通信。 您的每個原始控件都將具有公共事件,父控件可以對其進行適當的訂閱和處理。

檢查介體模式以獲取更多信息: http : //en.wikipedia.org/wiki/Mediator_pattern

您所做的一切很好-您可以通過以下方式來實現:暴露那些單擊這些控件中的按鈕時觸發的事件,然后相互傳遞引用(訂閱這些控件,編寫代碼以淡化“ this”控件)。

但是,對於一個簡單的解決方案而言,這可能會花費太多精力。

關於您的解決方案,我要說的是,如果您要更改控件的名稱,則它將停止工作。 您可以改為:

var ba = this.Parent.Controls.OfType<ButtonAdvertisement>().FirstOrDefault();

這樣,你不再依賴於該控件的名稱 - 但控件的類型。 您將需要using System.Linq; 在您的代碼文件中可以正常工作。 當然,這依賴於這樣的事實,即在父級中只有該控件類型的另一個實例。

如果您對我提到的第一個解決方案感興趣-那么此代碼段應有助於演示:

public class FadeControl {
  public event EventHandler Clicked;

  public void FadeOut(bool b){

  }

  public void AttachTo(FadeControl other){
    //splitting this operation to a public and private allows us to 
    //initiate an attach publicly, but then recurse privately without 
    //causing a stack overflow
    AttachToInternal(other);
    other.AttachToInternal(this);
  }

  private void AttachToInternal(FadeControl other){
    other.Clicked += Attached_Clicked;
  }

  protected virtual void Attached_Clicked(object sender, EventArgs e)
  {
    //fade me out
    FadeOut(true);
  }

  // provides a way for the deriving class to raise the Clicked event
  protected void OnButtonClicked(){
    if(Clicked != null) Clicked(this, null);
  }
}

public class ButtonDiscount : FadeControl {
  Button _button;

  //omitted: designer code

  //this is your handler for the _button clicked event 

  private void _button_Clicked(object sender, EventArgs e){
    //call the base class' OnButtonClicked method - to raise the event
    OnButtonClicked();
    //TODO: do work.
  }
}

//omitted - code for the ButtonAdvertisement class

完成此操作后-在您的表單中,假設您的表單中有_buttonAdvertisement_buttonDiscount成員,並且它們初始化之后-您只需執行以下操作:

_buttonAdvertisement.AttachTo(_buttonDiscount);

這將立即將兩個控件相互綁定。

注意-為了響應下面的評論-我在FadeControl為另一個FadeControl的Clicked事件設置了事件處理程序, FadeControl受到保護和虛擬化-因此您可以覆蓋它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM