neurotix正在朝着正確的軌道前進,但那不會在子容器中捕獲您的文本框,也不會處理調用正確的函數,以設置正確的文本框的屬性。在沒有用戶控件的情況下處理它的最好方法是使用遞歸函數來分配事件處理程序。
public void SetTextBoxClickHandler(Control control)
{
foreach (Control childControl in control.Controls)
{
if (childControl is TextBox)
{
childControl.Click += this.MyClickHandler;
continue;
}
if (item.Controls == null)
continue;
SetTextBoxClickHandler(childControl);
}
}
private void MyClickHandler(object sender, MouseEventArgs e)
{
typeof(Form).InvokeMember(string.Format("{0}s", ((Control)sender).Name), BindingFlags.InvokeMethod | BindingFlags.NonPublic, null, null, new object[] { Clipboard.GetText() });
}
private void Form1_Load(object sender, EventArgs e)
{
SetTextBoxClickHandler(this.Controls);
}
如果您使用用戶控件,那真的很簡單,只需從TextBox繼承,並將所有設置設置爲使用新控件。
public class ClickableTextBox : TextBox
{
public ClickableTextBox()
{
this.Click += MyClickHandler;
}
void setText(string input)
{
this.ForeColor = Color.Black;
this.Text = input;
}
private void MyClickHandler(object sender, MouseEventArgs e)
{
setText(Clipboard.GetText());
}
}
我建議創建以下原因,客戶的用戶控件:
- 避免使用反射來調用一個方法動態地根據名字
- 的性能損失,避免轉換的性能損失在每次點擊時將對象發件人設置爲控件
- 避免在檢查每個控件的初始化循環期間以及窗體上的子控件(無論它是否爲TextBox)時性能降低
- 較少的代碼維護
- 如果您需要在不同的項目或不同的表單上重複使用,那麼表單代碼必須存在較高的可重用性,如果您需要在不同的項目或不同的表單上重複使用它,定製用戶控制,而不是將代碼複製/粘貼到每個可能需要更改的表單上
當然,如果您只需要設置文本,並且沒有其他功能,您可以簡化它bit ...
public void SetTextBoxClickHandler(Control control)
{
foreach (Control childControl in control.Controls)
{
if (childControl is TextBox)
{
childControl.Click += this.MyClickHandler;
continue;
}
if (item.Controls == null)
continue;
SetTextBoxClickHandler(childControl);
}
}
private void MyClickHandler(object sender, MouseEventArgs e)
{
TextBox textBox = sender as Textbox;
if (textBox == null)
return;
textBox.ForeColor = Color.Black;
textBox.Text = Clipboard.GetText();
}
private void Form1_Load(object sender, EventArgs e)
{
SetTextBoxClickHandler(this.Controls);
}
或使用用戶控件:
public class ClickableTextBox : TextBox
{
public ClickableTextBox()
{
this.Click += MyClickHandler;
}
private void MyClickHandler(object sender, MouseEventArgs e)
{
this.ForeColor = Color.Black;
this.Text = input;
}
}
由於上述原因,我仍然建議使用自定義用戶控件。
應用程序的示例屏幕截圖會有幫助。你需要清除複選框檢查/取消選中事件的文本框或只是文本框單擊事件 – reggie
只是一些建議,如果你的應用程序有85個文本框,那麼你可能會做錯了什麼。 –
@Ramhound我認爲他正在試圖建立一個GridView的自我 – Burimi