Programing

C # 텍스트 상자에 포커스가있는 동안 Enter 키를 눌러 단추를 클릭하려면 어떻게합니까?

lottogame 2020. 11. 23. 07:38
반응형

C # 텍스트 상자에 포커스가있는 동안 Enter 키를 눌러 단추를 클릭하려면 어떻게합니까?


C #에서 WinForm 앱으로 작업 중입니다. 텍스트 상자에 무언가를 입력 한 후 Enter 키를 누르고 싶지만 텍스트 상자에 여전히 포커스가 있습니다 (깜박이는 커서가 여전히 텍스트 상자에 있음). 어떻게해야합니까?


간단한 옵션은 양식의 AcceptButton을 누르려는 버튼 (일반적으로 "OK"등)으로 설정하는 것입니다.

    TextBox tb = new TextBox();
    Button btn = new Button { Dock = DockStyle.Bottom };
    btn.Click += delegate { Debug.WriteLine("Submit: " + tb.Text); };
    Application.Run(new Form { AcceptButton = btn, Controls = { tb, btn } });

이것이 옵션이 아닌 경우 KeyDown 이벤트 등을 볼 수 있지만 더 많은 작업입니다.

    TextBox tb = new TextBox();
    Button btn = new Button { Dock = DockStyle.Bottom };
    btn.Click += delegate { Debug.WriteLine("Submit: " + tb.Text); };
    tb.KeyDown += (sender,args) => {
        if (args.KeyCode == Keys.Return)
        {
            btn.PerformClick();
        }
    };
    Application.Run(new Form { Controls = { tb, btn } });

이 작업을 수행하는 일반적인 방법은 Form's AcceptButton를 "클릭"하려는 버튼 으로 설정하는 것 입니다. VS 디자이너 또는 코드에서이 작업을 수행 AcceptButton할 수 있으며 언제든지 변경할 수 있습니다.

이것은 귀하의 상황에 적용되거나 적용되지 않을 수 있지만 , 사용자가 Enter 키를 누르는 위치에 따라 다른 동작을 활성화하기 위해 양식의 GotFocus다른 이벤트 와 함께 이것을 사용했습니다 TextBox. 예를 들면 :

void TextBox1_GotFocus(object sender, EventArgs e)
{
    this.AcceptButton = ProcessTextBox1;
}

void TextBox2_GotFocus(object sender, EventArgs e)
{
    this.AcceptButton = ProcessTextBox2;
}

이 방법을 사용할 때주의해야 할 한 가지는 초점이 맞춰질 AcceptButton세트를 떠나지 않는다는 것 입니다. 를 설정 하는 es 이벤트를 사용하거나 특정 호출을 사용하지 않는 모든 컨트롤이 있는 메서드를 만드는 것이 좋습니다 .ProcessTextBox1TextBox3LostFocusTextBoxAcceptButtonGotFocusAcceptButton


private void textBox_KeyDown(object sender, KeyEventArgs e)
{
     if (e.KeyCode == Keys.Enter)
     {
         button.PerformClick();
         // these last two lines will stop the beep sound
         e.SuppressKeyPress = true;
         e.Handled = true;
     }
}

이 KeyDown 이벤트를 텍스트 상자에 바인딩하면 키를 누를 때마다이 이벤트가 시작됩니다. 이벤트 내에서 사용자가 "Enter 키"를 눌렀는지 확인합니다. 그렇다면 작업을 수행 할 수 있습니다.


나는 같은 것을 직접 찾고있는 동안 이것을 발견했으며 내가 주목 한 것은 Enter를 누를 때 Form에서 'AcceptButton'을 클릭하고 싶지 않을 때 나열된 답변 중 실제로 해결책을 제공하지 않는다는 것입니다.

간단한 사용 사례는 화면의 텍스트 검색 상자에서 Enter 키를 누르면 양식의 AcceptButton 동작을 실행하지 않고 '검색'버튼을 '클릭'해야합니다.

이 작은 스 니펫이 트릭을 수행합니다.

private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 13)
    {
        if (!textBox.AcceptsReturn)
        {
            button1.PerformClick();
        }
    }
}

필자의 경우이 코드는 TextBox에서 파생 된 사용자 지정 UserControl의 일부이며 컨트롤에는 'ClickThisButtonOnEnter'속성이 있습니다. 그러나 위의 방법이보다 일반적인 솔루션입니다.


Enter 키를 눌러서 원하는 버튼에 " Accept Button "속성을 설정하기 만하면됩니다 . 또는로드 이벤트 쓰기this.acceptbutton = btnName;


가장 초보자 친화적 인 솔루션은 다음과 같습니다.

  1. In your Designer, click on the text field you want this to happen. At the properties Window (default: bottom-right) click on the thunderbolt (Events). This icon is next to the alphabetical sort icon and the properties icon.

  2. Scroll down to keyDown. Click on the Dropdown field right to it. You'll notice there's nothing in there so simply press enter. Visual Studio will write you the following code:

    private void yourNameOfTextbox_KeyDown(object sender, KeyEventArgs e)
    {
    
    }
    
  3. Then simply paste this between the brackets:

    if (e.KeyCode == Keys.Enter)
    {
         yourNameOfButton.PerformClick();
    }
    

This will act as you would have clicked it.


In Visual Studio 2017, using c#, just add the AcceptButton attribute to your button, in my example "btnLogIn":

this.btnLogIn = new System.Windows.Forms.Button();
//....other settings
this.AcceptButton = this.btnLogIn;

Or you can just use this simple 2 liner code :)

if (e.KeyCode == Keys.Enter)
            button1.PerformClick();

Add this to the Form's constructor:

this.textboxName.KeyDown += (sender, args) => {
    if (args.KeyCode == Keys.Return)
    {
        buttonName.PerformClick();
    }
};

YOu can trap it on the keyup event http://www.itjungles.com/dotnet/c-how-to-easily-detect-enter-key-in-textbox-and-execute-a-method


This is very much valid for WinForms. However, in WPF you need to do things differently, and it is easer. Set the IsDefault property of the Button relevant to this text-area as true.

Once you are done capturing the enter key, do not forget to toggle the properties accordingly.


The TextBox wasn't receiving the enter key at all in my situation. The first thing I tried was changing the enter key into an input key, but I was still getting the system beep when enter was pressed. So, I subclassed and overrode the ProcessDialogKey() method and sent my own event that I could bind the click handler to.

public class EnterTextBox : TextBox
{
    [Browsable(true), EditorBrowsable]
    public event EventHandler EnterKeyPressed;

    protected override bool ProcessDialogKey(Keys keyData)
    {
        if (keyData == Keys.Enter)
        {
            EnterKeyPressed?.Invoke(this, EventArgs.Empty);
            return true;
        }
        return base.ProcessDialogKey(keyData);
    }
}

참고URL : https://stackoverflow.com/questions/299086/c-sharp-how-do-i-click-a-button-by-hitting-enter-whilst-textbox-has-focus

반응형