動態生成了81個textbox,并將它們存入了一個控制元件組,控制元件名為name為txt1至txt81,且每個textbox在生成時都隨機生成了一個1-9的tag。想讓這81個textbox都有textchange事件,當事件發生時檢驗textbox的text,若不等于text.tag,則清空輸入的text。
現在的問題是:1.怎么讓81個textbox共享textchang事件。
2.在共享textchange事件時,怎么表示正在發生textchang事件的textbox的name。
uj5u.com熱心網友回復:
控制元件生成時就忙給控制元件指派相關事件的處理程式事仲處理方法有兩個引數,第一個是發生事件的控制元件物件,第二個是事件相關的環境員引數
uj5u.com熱心網友回復:
所有的 Control 都定義有 TextChanged 事件public event EventHandler TextChanged;你可以這樣注冊自己的委托
EventHandler proc = new EventHandler((sdr, arg) =>
{
if (sdr is TextBox txt && txt.Tag != null && txt.Text == txt.Tag.ToString())
{
txt.Text = string.Empty;
Debug.WriteLine($"我清理了{txt.Name}");
}
});
foreach (var c in yourControls)
c.TextChanged += proc;
uj5u.com熱心網友回復:
當然你也可以寫var proc = new EventHandler((sdr, arg) =>
{
if (sdr is TextBox txt && txt.Tag != null && txt.Text == txt.Tag.ToString())
{
txt.Text = string.Empty;
Debug.WriteLine($"我清理了{txt.Name}");
}
});
foreach (var c in yourControls.OfType<TextBox>())
c.TextChanged += proc;
使用 OfType<> 泛型來過濾控制元件型別,避免給非 TextBox 型別控制元件注冊。
“讓81個textbox共享textchang事件”這個邏輯是錯誤的。事件定義在具體的物件型別上(這里是Control),是具體的物件實體(這里是各個 TextBox 實體)觸發的,并不存在“共享”。這里宣告一個委托,也就是一個程序,它可以注冊給各個控制元件。當各個TextBox的TextChanged事件發生時,事件物件各自獨立,只不過都曾經呼叫了這一個程序,但是呼叫程序所傳入的引數截然不同,客戶(呼叫方)也不同。所以這里不是什么“共享同一個事件”,只不過是共享了一個方法實體而已。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/234088.html
標籤:C#
