在Windows表单中点击默认按钮(试图找到最佳解决方案)

9
问题是:如何使默认按钮在表单聚焦时具有重点,并在按下“Enter”键时响应,但不在文本框中的插入符处具有多行属性设置为true的情况下具有重点?..我知道我可以在代码中做一些例外处理,但也许现在还有一些我不知道的“最佳实践”:(谢谢
6个回答

15

也许我理解错了,但我会这样做:

  1. 将表单的“AcceptButton”设置为您想要在“Enter”键响应的按钮。
  2. 将多行文本框的“AcceptsReturn”设置为true。

et voila


5
(编辑 - 答案在这里非常适用于TextBox; 这种模式可能对其他缺乏AcceptsReturn或等效的控件有用)
您可以使用GotFocusLostFocus事件相对容易地更改AcceptButton,例如:
[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    TextBox multi, single;
    Button btn;
    using(Form form = new Form {
            Controls = {
                (multi= new TextBox { Multiline = true, Dock = DockStyle.Fill}),
                (btn = new Button { Text = "OK", Dock = DockStyle.Bottom,
                    DialogResult = DialogResult.OK}),
                (single = new TextBox { Multiline = false, Dock = DockStyle.Top}),
            }, AcceptButton = btn                
        })
    {
        multi.GotFocus += delegate { form.AcceptButton = null; };
        multi.LostFocus += delegate { form.AcceptButton = btn; };
        btn.Click += delegate { form.Close(); };
        Application.Run(form);
    }
}

1
构建简单表单的好方法! - Rune Grimstad
@Rune - 真是喜欢集合/对象初始化器。诡计在于"(varName = [initializer])",这样你就可以将变量钩到事件等上面了 ;-p - Marc Gravell
你能在初始化器中设置事件处理程序吗?这样,你就可以在对象初始化器中添加委托,而不是在 using 语句内部添加。 - Rune Grimstad
@Rune - 不好意思,目前还没有这样的语法。虽然有人提出过类似于集合初始化器的建议,但尚未得到认可。我也不指望在C# 4.0中能实现。 - Marc Gravell
@Marc:太遗憾了,但这仍然是一种非常优雅的创建表单的方式。 - Rune Grimstad

4

Windows窗体有两个属性:AcceptButton和CancelButton,您可以将它们设置为引用表单上的按钮控件。 AcceptButton告诉用户按下回车键时应单击哪个按钮,而CancelButton则告诉用户按下ESC键时应单击哪个按钮。

通常,您会将AcceptButton的DialogResult设置为DialogResult.OK或DialogResult.Yes,并将CancelButton的DialogResult设置为DialogResult.Cancel或DialogResult.No。这样可以确保在以模态方式显示窗体时,轻松检查单击了哪个按钮。


请提供需要翻译的英文内容。 - Marc Gravell

1

或者你可以在文本框的焦点事件中这样做

_targetForm.AcceptButton = _targetForm.btnAccept;

然后将其解绑并在另一个多行文本框中显示


谢谢 :) 我认为这个主题的第一个答案是最好和最简单的。 - 0x49D1

0

在Form_Load事件中,设置

this.AcceptButton = buttonName;

0

请按照以下步骤进行:

private void Login_Load(object sender, EventArgs e)
{
    this.AcceptButton = btnLogin;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接