我有25个文本框。我有一个按钮可以将信息粘贴到选定的文本框中(聚焦的那个)。这里是我使用的代码:在C#中获取焦点文本框?
foreach (Control z in this.Controls)
{
if (z is TextBox)
{
((TextBox)(z)).Paste();
}
}
当我使用这个,所有的文本框被粘贴。我只需要集中的一个。我完全难倒了。我如何解决这个问题?
我有25个文本框。我有一个按钮可以将信息粘贴到选定的文本框中(聚焦的那个)。这里是我使用的代码:在C#中获取焦点文本框?
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 Control.Focused是如果控件具有焦点,否则为false
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
属性。
你可以尝试测试控件集合
foreach (Control z in this.Controls)
{
if (z is TextBox && z.Focused)
((TextBox)(z)).Paste();
}
的聚焦特性然而,如果文本框包含不同GroupBoxes或其他控件容器内,这可能变得更加复杂。
在这种情况下,你需要一个递归函数
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();
}
使您的按钮成为ToolStripButton,它不会在您点击它时窃取焦点。现在你可以使用ActiveControl属性。 –
进一步来自@HansPassant的评论这个问题已经涵盖了你需要什么http://stackoverflow.com/questions/435433/what-is-the-preferred-way-to-find-focused-control-in-winforms-app –