6

我正在开发一个 Windows 窗体应用程序 (C#),其中用户在表单中输入数据。在编辑表单中的数据时,用户可以随时单击表单上的一个按钮来执行某些操作。默认情况下,焦点转到单击的按钮,因此用户必须重新单击要编辑的控件才能继续修改表单上的数据。我需要做的是在处理完按钮单击事件后将焦点返回到最后编辑的控件。这是一个示例屏幕截图,说明了我在说什么:

示例应用程序屏幕截图

用户可以在 textbox1、textbox2、textbox3 等中输入数据并单击按钮。我需要按钮将焦点返回到单击按钮之前最近获得焦点的控件。

我想知道是否有人有比我想出的更好的方法来实现此功能。这就是我现在正在做的事情:

   public partial class Form1 : Form
    {
        Control _lastEnteredControl;

        private void textBox_Enter(object sender, EventArgs e)
        {
            _lastEnteredControl = (Control)sender;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Do something here");
            _lastEnteredControl.Focus();
        }


    }

所以基本上我们这里有一个类变量,它指向最后输入的控件。表单上的每个文本框都已设置,因此当控件获得焦点时会触发 textBox_Enter 方法。然后,当单击按钮时,焦点将返回到单击按钮之前具有焦点的控件。有人对此有更优雅的解决方案吗?

4

7 回答 7

16

对于一点“简单”,也许可以尝试。

public Form1()
    {
        InitializeComponent();

        foreach (Control ctrl in Controls)
        {
            if (ctrl is TextBox)
            {
                ctrl.Enter += delegate(object sender, EventArgs e)
                              {
                                  _lastEnteredControl = (Control)sender;
                              };
            }
        }
    }

那么您不必担心手动装饰每个文本框(或忘记一个)。

于 2008-09-01T01:11:00.587 回答
2

您可以执行以下操作

将按钮更改为标签并使其看起来像一个按钮。标签永远不会得到关注,您不必进行所有额外的编码。

于 2008-11-06T16:52:01.350 回答
1

我认为你正在做的很好。我唯一能想到的改进它就是在访问每个控件时将它们存储到堆栈中。这将为您提供访问内容的完整时间线。

于 2008-09-01T00:51:33.473 回答
1

你的方法看起来不错。如果您想避免必须将事件处理程序添加到您添加的每个控件,您可以创建一个递归例程来将GotFocus侦听器添加到表单中的每个控件。这适用于表单中的任何类型的控件,但是您可以对其进行调整以满足您的需要。

private void Form_OnLoad(object obj, EventArgs e)
{
    AddGotFocusListener(this);
}

private void AddGotFocusListener(Control ctrl)
{
    foreach(Control c in ctrl.Controls)
    {
        c.GotFocus += new EventHandler(Control_GotFocus);
        if(c.Controls.Count > 0)
        {
            AddGotFocusListener(c);
        }
    }
}

private void Control_GotFocus(object obj, EventArgs e)
{
    // Set focused control here
}
于 2008-09-01T01:07:00.863 回答
0

你的实现看起来足够好——我想知道的是你为什么首先要这样做?焦点循环回到第一个条目不是更可取吗?最后一个文本框中的数据是否具有延展性,以至于一旦他们单击按钮,它就会被“记住”?或者您是否有按钮对特定文本框数据执行的某种操作——在这种情况下,焦点不应该转到后续控件吗?

我有兴趣首先找出您为什么要这样做。

于 2008-09-01T00:51:15.800 回答
0

是的,我承认这个要求有点不寻常。用户将进入此应用程序的一些信息存在于对几个不同存储库中的旧文档的扫描中。这些按钮有助于查找和打开这些旧文档。当用户决定提取包含更多信息的文档以在表单上输入时,很难预测用户将在表单上的哪个位置。尽管存在这些时髦的情况,但目的是使 UI 流畅。

于 2008-09-01T01:13:05.123 回答
0

创建一个继承自 TextBox 的名为 CustomTextBox 的类。它有一个名为 stack 的静态变量。当文本框失去焦点时,推入堆栈。当您想找到最后一个焦点控件时,只需从堆栈中弹出第一项。确保清除静态 Stack 变量。

于 2014-06-18T19:14:17.867 回答