2012-06-23 118 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(); 
}