C# windows窗体中的默认按钮命中(试图找到最佳解决方案)

C# windows窗体中的默认按钮命中(试图找到最佳解决方案),c#,.net,windows,winforms,C#,.net,Windows,Winforms,问题是:例如,当插入符号位于文本框中且多行属性设置为true时,如何使默认按钮聚焦于窗体焦点并在“Enter”点击时响应,但不聚焦?。我知道我可以在代码中执行一些例外情况,但可能有一些“最佳实践”我现在不知道:( 谢谢你也许我误解了你,但我要做的是: 设置表单的“AcceptButton” 单击要响应的按钮 “输入” 设置的“AcceptsReturn” 多行为true的文本框 et voilaWindows窗体有两个属性:AcceptButton和CancelButton。您可以将它们设置为引

问题是:例如,当插入符号位于文本框中且多行属性设置为true时,如何使默认按钮聚焦于窗体焦点并在“Enter”点击时响应,但不聚焦?。我知道我可以在代码中执行一些例外情况,但可能有一些“最佳实践”我现在不知道:(
谢谢你

也许我误解了你,但我要做的是:

  • 设置表单的“AcceptButton” 单击要响应的按钮 “输入”
  • 设置的“AcceptsReturn” 多行为true的文本框

  • et voila

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

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

    (编辑-答案非常适合
    文本框
    ;此模式可能适用于缺少
    接受返回
    或等效项的其他控件)

    您可以使用
    GotFocus
    LostFocus
    事件相当轻松地更改
    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);
        }
    }
    

    或者,您可以在文本框的取消焦点事件中执行此操作,如中所示

    _targetForm.AcceptButton = _targetForm.btnAccept;
    
    然后在另一个文本框中使用多行

    在Form\u Load,set

    this.AcceptButton = buttonName;
    
    按以下步骤进行:

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

    多么好的一种构建简单表单的方法!@Rune-一定很喜欢集合/对象初始值设定项。狡猾的一点是“(varName=[initializer])”因此,您可以将变量挂接到事件等;-p是否可以在初始值设定项中设置事件处理程序?因此,您可以在对象初始值设定项中执行委托操作,而不是在对象初始值设定项中执行委托操作?@Rune-no,没有用于此操作的语法。这会很好,并且已经提出了建议(大概有点类似于集合初始值设定项)-但还没有什么乐趣。我也不会为C#4.0屏住呼吸。@Marc:太糟糕了,但它仍然是创建表单的一种非常优雅的方式。谢谢:)我认为这个主题的第一个答案是最好和最简单的(请注意,我在回答中回答了你的问题;这个评论正好出现在你的“回复”选项卡上)