我想為 Windows 創建一堆簡單的復選框,并讓它們更改布林值。因為它們很多,我想我可以跳過撰寫一堆 CheckedChanged 處理程式并擁有一個像這樣的通用“創建者”函式
static CheckBox CreateCheckBox(ref bool binding, string name)
{
var box = new CheckBox();
box.Checked = binding;
box.CheckedChanged = (object sender, EventArgs e) => { binding = !binding; };
box.Text = name;
return box;
}
然后創建我的盒子,如:
ParentForm.Controls.Add(CreateCheckBox(ref prop1, nameof(prop1));
ParentForm.Controls.Add(CreateCheckBox(ref prop2, nameof(prop2));
.....
我顯然得到了“不能在 lambda 運算式或匿名函式中使用 ref”。我讀了它,這是有道理的。但是有沒有辦法讓這種簡單的創建者函式一般添加處理程式?
我知道這里永遠不會洗掉處理程式會有一個問題,但這是一個除錯模式功能,僅供開發人員用于除錯和改進非常具體的演算法。也許我只是懶得寫和添加所有的處理程式,但我也覺得更干凈。
uj5u.com熱心網友回復:
您不需要通過參考傳遞任何內容,使用以下選項之一:
- 傳遞一個 getter Func 和一個 setter Action
- 設定資料系結
示例 1 - 傳遞 getter Func 或 setter Action
將 getter 和 setter 作為 func/action 傳遞:
public CheckBox CreateCheckBox(string name, Func<bool> get, Action<bool> set)
{
var c = new CheckBox();
c.Name = name;
c.Text = name;
c.Checked = get();
c.CheckedChanged = (obj, args) => set(!get());
return c;
}
并像這樣使用它,例如:
CreateCheckBox("checkBox1", () => textBox1.Enabled, (x) => textBox1.Enabled = x);
CreateCheckBox("checkBox2", () => textBox2.Enabled, (x) => textBox2.Enabled = x);
示例 2 - 設定資料系結
您嘗試實作的是通過設定資料系結可以實作的目標:
public CheckBox CreateCheckBox(string name, object dataSource, string dataMember)
{
var c = this.Controls[name] as CheckBox;
c.Name = name;
c.Text = name;
c.DataBindings.Add("Checked", dataSource,
dataMember, false, DataSourceUpdateMode.OnPropertyChanged);
return c;
}
并像這樣使用它:
CreateCheckBox("checkBox1", textBox1, "Enabled");
CreateCheckBox("checkBox2", textBox2, "Enabled");
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/428038.html
上一篇:處理在WinForms桌面應用程式中使用鍵盤上的箭頭按鈕觸發的KeyDown和KeyUp事件
下一篇:如何獲得當天的前10名C#
