我對 C# 很陌生,我想知道在這里使用委托是否是正確的方法:
我在 Visual Studio Windows 表單設計器中創建了一個 UserControl。在 TableLayoutPanel 中,我有 3 x 3 個這些用戶控制元件。他們每個人都通過建構式獲得一個行和列索引。
現在,在包含 TableLayoutPanel 的表單中,只要單擊其中一個 UserControls 并在該函式呼叫中具有行和列索引,我就想呼叫一個函式。
我知道如何處理 UserControl 中的 Click 事件。但我不知道如何呼叫可以向 UserControl 注冊的某種回呼。所以 UserControl 的 Click 事件處理程式會呼叫類似Callback(Row, Col);
但我不知道如何將我的表單方法放入 UserControl。在 CI 中會使用函式指標。我這里需要代表嗎?
所以在我的 UserControl 部分類中,我會有類似的東西:
public delegate void DoubleClickHandler(int row, int col);
public DoubleClickHandler Callback;
public void On_Click(object sender, EventArgs e)
{
Callback(Row, Col);
}
在創建表單時,我會執行以下操作:
MyControl elem = new MyControl(1, 3);
elem.Callback = delegate (int row, int col) { Console.WriteLine("row {0}, col {1}", row, col); }
它有效,但我不知道這是否是正確的方法。
uj5u.com熱心網友回復:
Winforms 可能會為此使用事件;相同的想法,不同的關鍵字,例如
對于活動道具
//old
public DoubleClickHandler Callback;
//new
public event EventHandler<(int Row, int Col)> SomethingDoubleClicked; //use a past tense name if you raise after, or a "SomethingDoubleClicking" if you raise before - probably hard to raise a click event before but..
OnClick 可能有類似的代碼
var eh = SomethingDoubleClicked;
eh?.Invoke(this, (theRow, theCol));
訂閱可能如下所示:
//"modern"
yourcontrol.SomethingDoubleClicked = (s, e) => Console.WriteLine("row {0}, col {1}", e.Row, e.Col);
//"classic"
yourcontrol.SomethingDoubleClicked = SomeControl_SomethingDoubleClicked;
void SomeControl_SomethingDoubleClicked(object sender, (int Row, int Col) e)
{
Console.WriteLine("row {0}, col {1}", e.Row, e.Col);
}
請注意, =而不是=- anevent在概念上是應以未定義順序呼叫的方法串列
隨意將 EventHandler 中的元組更改為類或其他東西。也可以從 EventArgs 派生,但不是必須的。
如果您沒有要報告的用戶狀態,您可以簡化為使用:
public event EventHandler SomethingDoubleClicked;
//onclick
var eh = SomethingDoubleClicked;
eh?.Invoke(this, EventArgs.Empty);
ourcontrol.SomethingDoubleClicked = (s, e) => ...;
但我可能會避免從 EventArgs 派生來提供自定義用戶狀態,然后使用上面的 EventHandler 表單 - 它會起作用,因為當你這樣做時:
eh?.Invoke(this, new MyCustomEventArgs(...));
MyCustomEventArgs 派生自 EventArgs,因此您可以在父型別中傳遞子類,但這意味著使用它的開發人員必須將其強制轉換:
void SomeControl_SomethingDoubleClicked(object sender, EventArgs e)
{
var mcea = e as MyCustomEventArgs;
}
這有點討厭;更好地EventHandler<MyCustomEvenArgs>使用它來使用 TAB TAB/no cast 事件
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/475051.html
下一篇:基礎設施選定節點
