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
- 需要维护的代码更少
- 更高的可重用性,表单代码,必须出现在每个表单上,如果您需要在不同的项目或不同的表单上重用它,重用自定义用户控件比复制要容易得多/将代码粘贴到可能需要更改的每个表单中
当然,如果您需要做的只是设置文本,而该函数中没有其他内容,您可以稍微简化一下...
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;
}
}
由于上述许多原因,我仍然推荐自定义用户控件。