我有25个文本框。我有一个按钮可以将信息粘贴到"选定"文本框(聚焦的那个)中。这是我使用过的代码:
foreach (Control z in this.Controls)
{
if (z is TextBox)
{
((TextBox)(z)).Paste();
}
}
当我使用它时,所有文本框都会被粘贴进来。我只需要专注的那个。我完全被难住了。如何解决此问题?
这个怎么样?
foreach (Control z in this.Controls)
{
if (z is TextBox && z.Focused)
{
((TextBox)(z)).Paste();
}
}
根据 MSDN 控件。如果控件具有焦点,则焦点为真,否则为假
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focused.aspx
可以使用 LINQ 获取焦点文本框并粘贴。
TextBox focusedTextBox = this.Controls.OfType<TextBox>().FirstOrDefault(tb => tb.IsFocused);
if (focusedTextBox != null)
{
focusedTextBox.Paste();
}
对于 WPF/Silverlight,应使用 IsFocused
属性。如果您使用的是 winforms,则应使用 Focused
属性。
您可以尝试测试控件集合的 Focus 属性
foreach (Control z in this.Controls)
{
if (z is TextBox && z.Focused)
((TextBox)(z)).Paste();
}
但是,如果文本框包含在不同的分组框或其他控件容器中,则这可能会变得更加复杂。
在这种情况下,您需要一个递归函数
private void PasteInFocusedTextBox(ControlCollection ctrls)
{
foreach (Control z in ctrls)
{
if(z.Controls != null && z.Controls.Count > 1)
PasteInFocusedTextBox(z.Controls);
if (z is TextBox && z.Focused)
((TextBox)(z)).Paste();
}
}
编辑:重读你的问题,我有一个疑问。如果单击按钮以执行粘贴操作,则焦点将切换到该按钮,并且不能再使用焦点属性
在这种情况下,您需要在全局变量中保存最后一个带有焦点的文本框,然后再单击命令按钮
private TextBox _txtLastFocused = null
private void txtCommon_Leave(object sender, EventArgs e)
{
_txtLastFocused = (TextBox)sender;
}
private void cmdPasteButton_Click(object sender, EventArgs e)
{
if(_txtLastFocused != null) _txtLastFocused.Paste();
}