2 回答
TA貢獻1856條經驗 獲得超11個贊
控件之間的交互有多種解決方案??丶穷?,并且與任何其他類一樣,它們可以使用其公共屬性和方法或使用某些中介來相互交互。
在這種情況下,您的控件不需要相互了解,也不需要直接相互交互:
他們可以要求另一個知道這兩個控件的對象來為他們完成這項工作。
或者他們可以提出他們的請求通知,訂閱該通知的人將提供它。
要讓另一個對象為他們做這項工作,您有多種解決方案。例如,您可以在父窗體和子控件中實現特定接口,將父級強制轉換為該特定接口并調用為您完成工作的特定方法。
為了提高請求通知,一個簡單的解決方案是依賴事件。您可以在子控件中創建一個事件,并在您需要父控件為您做某事時引發它。然后在父母中訂閱該事件并完成工作。
示例 - 使用事件
我假設你有UserControl1內部Button1并且你已經處理Click了Button1. 然后您可以創建Button1Clicked事件并在單擊時引發它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
}
示例 - 使用界面
我假設,您有一個具有一些標準方法的接口:
public interface IDoSomething
{
void DoSomething();
void DoSomethingElse();
}
你已經在你的父表單中實現了接口:
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條經驗 獲得超5個贊
我想稍微擴展一下 Reza Aghaei 的回答。我認為它可以變得比現在更好。
第一種方法
如果我是你,我會有一些接口ICheckedView,它至少有 1 種方法來實現,如下所示:
ICheckedView{
void Continue();}現在,我們可以將此接口應用于解決方案中的任何類,但最有可能是視圖。接下來,我會讓你的主窗體實現這個接口并實現所需的方法。在這種情況下,我們希望我們的主窗體從面板中刪除控件并添加一個新控件。坦率地說,我們的安全檢查控件不需要(也許不應該)知道其他控件或接下來會發生什么。它僅用于控制流。
最后,您需要為 Safety_Check添加一個公共屬性,甚至可能是一個參數,ICheckedView其中包含一個參數。當您的安全檢查控件被點擊時,它可以告訴任何被傳遞給它的人(我們會說客戶端)它必須繼續。
第二種方法
它可以通過動作委托來完成。
如果您Action在安全檢查中添加一個委托,您可以直接彈出簽名與該委托匹配的任何方法 ( void methodName())。您的 Safety_Check 控件的構造函數應包含一個 Action,并且該 Action 將被分配給該類的私有字段。然后,當需要調用時,可以直接調用該操作。
此方法的注意事項
因為我們可能首先從 UI 線程調用,所以我們可能沒問題,但是您需要在這里考慮線程安全。調用所需模式可以幫助您解決這個問題。
- 2 回答
- 0 關注
- 129 瀏覽
添加回答
舉報
