[英]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.