2012-06-23 111 views
0

我有25个文本框。我有一个按钮可以将信息粘贴到选定的文本框中(聚焦的那个)。这里是我使用的代码:在C#中获取焦点文本框?

foreach (Control z in this.Controls) 
     { 
      if (z is TextBox) 
      { 
       ((TextBox)(z)).Paste();   
      } 
     } 

当我使用这个,所有的文本框被粘贴。我只需要集中的一个。我完全难倒了。我如何解决这个问题?

+4

使您的按钮成为ToolStripButton,它不会在您点击它时窃取焦点。现在你可以使用ActiveControl属性。 –

+0

进一步来自@HansPassant的评论这个问题已经涵盖了你需要什么http://stackoverflow.com/questions/435433/what-is-the-preferred-way-to-find-focused-control-in-winforms-app –

回答

2

您可以使用LINQ来获得聚焦文本框和粘贴。

TextBox focusedTextBox = this.Controls.OfType<TextBox>().FirstOrDefault(tb => tb.IsFocused); 
if (focusedTextBox != null) 
{ 
    focusedTextBox.Paste(); 
} 

对于WPF/Silverlight,应该使用IsFocused属性。如果你使用winforms,你应该使用Focused属性。

1

你可以尝试测试控件集合

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(); 
}