2 回答

TA貢獻1856條經(jīng)驗 獲得超11個贊
控件之間的交互有多種解決方案??丶穷悾⑶遗c任何其他類一樣,它們可以使用其公共屬性和方法或使用某些中介來相互交互。
在這種情況下,您的控件不需要相互了解,也不需要直接相互交互:
他們可以要求另一個知道這兩個控件的對象來為他們完成這項工作。
或者他們可以提出他們的請求通知,訂閱該通知的人將提供它。
要讓另一個對象為他們做這項工作,您有多種解決方案。例如,您可以在父窗體和子控件中實現(xiàn)特定接口,將父級強制轉(zhuǎn)換為該特定接口并調(diào)用為您完成工作的特定方法。
為了提高請求通知,一個簡單的解決方案是依賴事件。您可以在子控件中創(chuàng)建一個事件,并在您需要父控件為您做某事時引發(fā)它。然后在父母中訂閱該事件并完成工作。
示例 - 使用事件
我假設(shè)你有UserControl1
內(nèi)部Button1
并且你已經(jīng)處理Click
了Button1
. 然后您可以創(chuàng)建Button1Clicked
事件并在單擊時引發(fā)它Button1
:
public event EventHandler Button1Clicked;
private void Button1_Click(object sender, EventArgs e)
{
Button1Clicked?.Invoke(this, e);
}
然后在父表單中,訂閱事件并做任何你想做的事情:
private void userControl11_Button1Clicked(object sender, EventArgs e)
{
//Hide userControl11 and show userControl21
}
示例 - 使用界面
我假設(shè),您有一個具有一些標(biāo)準(zhǔn)方法的接口:
public interface IDoSomething
{
void DoSomething();
void DoSomethingElse();
}
你已經(jīng)在你的父表單中實現(xiàn)了接口:
public class Form1: Form, IDoSomething
{
// ...
public void DoSomething()
{
//Hide userControl11 and show userControl21
}
public void DoSomethingElse()
{
// ...
}
}
然后在您的用戶控制中:
private void Button1_Click(object sender, EventArgs e)
{
var f = FindForm() as IDoSomething;
if(f!=null)
f.DoSomething();
}

TA貢獻1836條經(jīng)驗 獲得超5個贊
我想稍微擴展一下 Reza Aghaei 的回答。我認(rèn)為它可以變得比現(xiàn)在更好。
第一種方法
如果我是你,我會有一些接口ICheckedView
,它至少有 1 種方法來實現(xiàn),如下所示:
ICheckedView{ void Continue();}
現(xiàn)在,我們可以將此接口應(yīng)用于解決方案中的任何類,但最有可能是視圖。接下來,我會讓你的主窗體實現(xiàn)這個接口并實現(xiàn)所需的方法。在這種情況下,我們希望我們的主窗體從面板中刪除控件并添加一個新控件。坦率地說,我們的安全檢查控件不需要(也許不應(yīng)該)知道其他控件或接下來會發(fā)生什么。它僅用于控制流。
最后,您需要為 Safety_Check添加一個公共屬性,甚至可能是一個參數(shù),ICheckedView
其中包含一個參數(shù)。當(dāng)您的安全檢查控件被點擊時,它可以告訴任何被傳遞給它的人(我們會說客戶端)它必須繼續(xù)。
第二種方法
它可以通過動作委托來完成。
如果您Action
在安全檢查中添加一個委托,您可以直接彈出簽名與該委托匹配的任何方法 ( void methodName()
)。您的 Safety_Check 控件的構(gòu)造函數(shù)應(yīng)包含一個 Action,并且該 Action 將被分配給該類的私有字段。然后,當(dāng)需要調(diào)用時,可以直接調(diào)用該操作。
此方法的注意事項
因為我們可能首先從 UI 線程調(diào)用,所以我們可能沒問題,但是您需要在這里考慮線程安全。調(diào)用所需模式可以幫助您解決這個問題。
- 2 回答
- 0 關(guān)注
- 112 瀏覽
添加回答
舉報