【问题标题】:Getting focused textbox in C#?在 C# 中获得焦点文本框?
【发布时间】:2012-06-23 17:12:09
【问题描述】:

我有 25 个文本框。我有一个按钮,可以将信息粘贴到选定的文本框中(聚焦的那个)。这是我使用的代码:

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

当我使用它时,所有的文本框都会被粘贴进去。我只需要集中的那个。我完全被难住了。我该如何解决这个问题?

【问题讨论】:

  • 让你的按钮成为一个ToolStripButton,当你点击它时它不会窃取焦点。现在您可以使用 ActiveControl 属性了。
  • 在@HansPassant 的评论之外,这个问题已经涵盖了你需要的东西stackoverflow.com/questions/435433/…

标签: c# visual-c#-express-2010


【解决方案1】:

这个怎么样?

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

根据 MSDN Control.Focused 如果控件有焦点则为真,否则为假

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focused.aspx

【讨论】:

    【解决方案2】:

    您可以使用 LINQ 获取焦点文本框并粘贴。

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

    对于 WPF/Silverlight,应使用 IsFocused 属性。如果您使用的是 winforms,则应使用 Focused 属性。

    【讨论】:

      【解决方案3】:

      您可以尝试测试控件集合的 Focused 属性

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

      但是,如果 TextBox 包含在不同的 GroupBox 或其他控件容器中,这可能会变得更加复杂。
      在这种情况下,您需要一个递归函数

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

      编辑:重读您的问题我有疑问。如果单击按钮执行粘贴操作,则焦点将切换到该按钮,您将无法再使用focused属性

      在这种情况下,您需要在单击命令按钮之前将最后一个具有焦点的文本框保存在全局变量中

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多