繁体   English   中英

表单接受块多行文本框输入键事件

[英]form accept blocks multiline textbox enter key event

我所有的控件都继承自一个基类,该基类创建OnAccept和OnCancel并将其分配给Enter和ESC键。

private readonly Button _accept, _cancel;

public ViewUserControl()
{
    _accept = new Button();
    _cancel = new Button();

    _accept.Click += (o, e) => OnAccept();
    _cancel.Click += (o, e) => OnCancel();
}

// the base function depends on the child functions to implement a accept/cancel function, if it doesn't then those events will fire to the
// new button and not be used for anything
public virtual IButtonControl GetAcceptButton()
{
    return _accept;
}
public virtual IButtonControl GetCancelButton()
{
    return _cancel;
}

protected virtual void OnAccept() { }
protected virtual void OnCancel()
{
    this.ClosingEvent();
}

但是,当用户在多行文本框中时,Enter键将启动表单的OnAccept,而不是在文本框中添加新行(这是预期的行为)。

当前,要解决此问题,我必须找到窗体的集中控件,如果它是文本框,则手动放入换行符。但是,当我这样做时,光标将重置为文本框的开始。

protected override void OnAccept()
{
    var focused = FindFocusedControl(this);
    if (focused is TextBox)
    {
        focused.Text += Environment.NewLine;
    }
    else
    {
        base.OnAccept();
    }
}

public static Control FindFocusedControl(Control control)
{
    var container = control as ContainerControl;
    while (container != null)
    {
        control = container.ActiveControl;
        container = control as ContainerControl;
    }
    return control;
}

我的问题是:

有没有一种方法可以绕过OnAccept事件,以便文本框可以识别enter事件?

有没有办法手动调用文本框的enter事件?

手动插入换行符后,如何将光标设置在文本框的末尾?

对这些问题中的任何一个的回答都将达到我所追求的结果,优先选择解决方案。

更新:

我确实找到了一种使用RichTextBox.SelectionStart将插入符(不是我在最初的问题中所说的光标)移动到末尾的方法,但是,我更喜欢一种更优雅的解决方案。

更新2:

对于其他有相同问题的人,这是我现在要做的:

从子控件:

txtDetails.GotFocus += (o,e) => AcceptButtonStatus(false);
txtDetails.LostFocus += (o, e) => AcceptButtonStatus(true);

从基本控件中:

protected void AcceptButtonStatus(bool enabled)
{
    this.ParentForm.AcceptButton = enabled?_accept:null;
}

因此,每当文本框获得焦点时,我都会从表单中删除接受按钮。

这是有关如何从外部调用组件事件的文章。

如何在C#中以编程方式生成按键事件?

至于Accept事件,您的对话框在控件看到它之前就已经拦截了它。 唯一可行的方法是添加一个AcceptButton焦点更改的表单事件,如果焦点是多行文本控件,则将表单的AcceptButton控件设置为null(假设您使用的是AcceptButtonCancelButton来生成Accept /取消活动)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM