Stoppen Sie das Ding, wenn Sie die Eingabetaste drücken


124

Ich habe eine sehr einfache Windows Forms-Anwendung. Wenn Sie in Windows (oder zumindest in Windows Forms-Anwendungen) in einem einzeiligen TextBox-Steuerelement die Eingabetaste drücken, hören Sie ein Ding. Es ist ein unangenehmer Sound, der anzeigt, dass Sie keine neue Zeile eingeben können, da es sich um eine einzeilige TextBox handelt.

Das ist alles in Ordnung. In meinem Formular habe ich jedoch 1 Textfeld und eine Suchschaltfläche. Und ich bin so dass der Benutzer eine Suche durchführen , indem Sie eingeben , nachdem sie den Befehl eingegeben hat, so dass sie nicht haben , um mit der Maus auf die Schaltfläche Suchen klicken.

Aber dieser Ding-Sound tritt auf. Es ist sehr nervig.

Wie können wir es so machen, dass der Sound in meiner Form überhaupt nicht abgespielt wird?

@ David H - So erkenne ich die Eingabetaste:

private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // Perform search now.
    }
}

Wie erkennen Sie, dass die Eingabetaste gedrückt wurde, wenn sich der Fokus im Textfeld befindet?
David Heffernan

Doppelklicken Sie im Eigenschaftenbereich auf das KeyDown- oder KeyUp-Ereignis. Dann geben Sie in der Codeansicht den Code ein, den ich in meine Frage für yah einfügen werde.
Bendr

2
KeyPress ist wahrscheinlich das richtige Ereignis, und Sie möchten e.Handled = true setzen
David Heffernan

Vielen Dank, @ David, ich wusste das nicht :)
Bendr

7
Ich wünschte, es gäbe eine Möglichkeit, das nervige Klingeln zu unterdrücken, aber den Tastendruck in die Luft sprudeln zu lassen. Manchmal ist ein Tastendruck nur ein Tastendruck, ohne dass ein Alarm erforderlich ist.
Flipdoubt

Antworten:


56

Überprüfen Sie die Form.AcceptButton- Eigenschaft. Sie können damit eine Standardschaltfläche für ein Formular angeben, in diesem Fall die Eingabetaste.

Aus den Dokumenten:

Mit dieser Eigenschaft können Sie eine Standardaktion festlegen, die ausgeführt wird, wenn der Benutzer in Ihrer Anwendung die EINGABETASTE drückt. Die dieser Eigenschaft zugewiesene Schaltfläche muss ein IButtonControl sein, das sich im aktuellen Formular befindet oder sich in einem Container im aktuellen Formular befindet.

Es gibt auch eine CancelButton- Eigenschaft, wenn der Benutzer die Escape- Taste drückt.


1
Danke @mdm, das hat bei mir am besten funktioniert. :) Ich werde zurückkommen, um zu stimmen, wenn ich mehr Wiederholungen habe.
Bendr

1
@ Bendr Ich habe das gleiche Problem .. aber ich benutze UserControl .. es hat nicht Form.AcceptButton .. Wie kann ich es beheben?
Murhaf Sousli

1
Visual Studio scheint hierfür kein Feld im Eigenschaftenbereich zu haben. Es muss anscheinend im Code erfolgen. this.AcceptButton = buttonOK; this.CancelButton = buttonCancel;
Chris

5
Dies funktioniert nicht für ToolStripButtons oder wenn Sie die ENTER-Taste zum Überprüfen einer TextBox oder ToolStripTextBox verwenden möchten. Der bessere Ansatz wäre die Antwort von Lucio Fonseca, der für mich mit ToolStripTextBox funktioniert hat.
Robert S.

Ich kann Ihre Lösung nicht sehen, Sie haben keine praktische Übung, um aufgeklärter zu sein
Pedro Ávila

197

Für mich geht das:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{

    //Se apertou o enter
    if (e.KeyCode == Keys.Enter)
    {
        //enter key is down

        this.doSomething();

        e.Handled = true;
        e.SuppressKeyPress = true;

     }

 }

Die SuppressKeyPress ist der wahre Trick. Ich hoffe das hilft dir.


30
Dies ist meiner Meinung nach die einzig gültige Antwort. e.Handled = true;war unzureichend; es war das SuppressKeyPress, was den Trick tat.
Jonathon Reinhart

12
textBox1_KeyUp wird in dieser Situation unabhängig von Handled oder SuppressKeyPress
stackuser83

4
Funktioniert für mich mit ToolStripTextBox.KeyDown. Keine andere Lösung hat es getan. Vielen Dank!
Robert S.

1
Es hat für mich nicht auf meine Arbeit textboxund KeyDownEreignis
Alex Jolig

7
Dies sollte die akzeptierte Antwort sein. Die aktuell akzeptierte Antwort erfordert eine Standardschaltfläche auf dem Formular, die unangenehm ist.
Javid

56

Versuchen

textBox.KeyPress += new KeyPressEventHandler(keypressed);

private void keypressed(Object o, KeyPressEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        e.Handled = true; //this line will do the trick
    }
}

Richtig, aber es funktioniert nur, wenn der Fokus noch auf der TextBox liegt. Was ist, wenn der Benutzer Tabzuerst drückt ?
Mdm

4
@mdm Hängt vom UI-Design ab. Vielleicht möchte OP diese Aktion nur, wenn der Fokus auf dem Textfeld liegt. Das ist ziemlich häufig.
David Heffernan

2
Wenn der Benutzer die Tabulatortaste gedrückt hat, liegt der Fokus nicht mehr auf der Textbox. Das nächste Contorl, das fokussiert wird, ist die Tastensteuerung, die diesen Ton nicht erzeugt, wenn Sie die Eingabetaste drücken. :-)
Bendr

@ David, danke für dein Beispiel. Ich habe es gerade versucht. Und wann immer ich e.Handled = true in das .KeyPress-Ereignis setze, wird keiner der anderen Codes ausgeführt. Das einzige, was passiert, ist, dass der gesamte Text in der TextBox ausgewählt wird (und ich habe nicht einmal Code, der Text auswählt)
Bendr

1
Lucio Fonsecas Antwort war die einzige, die sich um das Problem kümmerte.
Jonathon Reinhart

15

Fügen e.SuppressKeyPress = true;Sie einfach Ihre "if" -Anweisung hinzu.

private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        //If true, do not pass the key event to the underlying control.
        e.SuppressKeyPress = true;  //This will suppress the "ding" sound.*/

        // Perform search now.
    }
}

13

Sie können KeyPress anstelle von KeyUp oder KeyDown verwenden, es ist effizienter und hier erfahren Sie, wie Sie damit umgehen

  private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.Enter)
        {
            e.Handled = true;
            button1.PerformClick();
        }
    }

und sag Frieden zu dem 'Ding'


2
Das hat bei mir perfekt funktioniert. e.Handled deaktiviert anscheinend das 'Ding'. Die Schaltfläche "Senden" (in meinem Fall) als Standard festzulegen, hätte bei mir nicht funktioniert, da ich die Eingabetaste für andere Textfelder im Formular anders behandeln wollte. <br/> <br/> Übrigens : Für dieses Projekt verwende ich VB. Anstatt e.KeyChar zu wirken, konvertiere ich es: wenn e.KeyChar = ChrW (Keys.Enter Then ....
Mark Ainsworth

1
Innerhalb der KeyDown, mit e.Handledund e.SuppressKeyPressnicht für mich gearbeitet - immer noch dinging. Aber es wie hier vorgeschlagen zu KeyPress' event and ändern , um das e.Handled` zu verwenden, hat es gut gemacht.
Jinlye

Dies sollte die richtige Antwort sein, danke
Firas Shrourou

7

Verwenden Sie SuppressKeyPressdiese Option , um die weitere Verarbeitung des Tastenanschlags nach der Handhabung zu beenden.

public class EntryForm: Form
{
   public EntryForm()
   {
   }

   private void EntryTextBox_KeyDown(object sender, KeyEventArgs e)
   {
      if(e.KeyCode == Keys.Enter)
      {
         e.Handled = true;
         e.SuppressKeyPress = true;
         // do some stuff

      }
      else if(e.KeyCode == Keys.Escape)
      {
          e.Handled = true;
          e.SuppressKeyPress = true;
          // do some stuff

      }
   }

   private void EntryTextBox_KeyUp(object sender, KeyEventArgs e)
   {
      if(e.KeyCode == Keys.Enter)
      {
         // do some stuff

      }
      else if(e.KeyCode == Keys.Escape)
      {
         // do some stuff

      }
   }
}

2

Ich bin über diesen Beitrag gestolpert, als ich versucht habe, mit einem KeyDown umzugehen, der für mich funktioniert hat.

If e.KeyCode = Keys.Enter Then
   e.SuppressKeyPress = True
   btnLogIn.PerformClick()
End If

Durch Unterdrücken des Tastendrucks wird verhindert, dass das Ereignis an das zugrunde liegende Steuerelement gesendet wird. Dies sollte funktionieren, wenn Sie alles, was die Eingabetaste in diesem Textfeld tut, manuell verarbeiten. Entschuldigung für das Visual Basic.


2

Es gibt nur eine sehr geringe Chance, dass jemand auf diese Antwort kommt, aber einige andere Antworten sind wirklich beängstigend. Das Unterdrücken eines Ereignisses bei KeyDownTötung von 2 zusätzlichen Ereignissen in einem Schlag. Das Setzen der e.HandledEigenschaft auf trueist in diesem Zusammenhang nutzlos.
Am besten setzen Sie die Form.AcceptButtonEigenschaft auf die eigentliche Suchschaltfläche.
Es gibt auch eine andere Möglichkeit, den EnterSchlüssel zu verwenden - einige Leute möchten möglicherweise, dass er als TABKnopf fungiert. Fügen Sie dazu eine neue hinzu Button, setzen Sie ihre LocationEigenschaft außerhalb des FormBereichs (dh (-100, -100)). Wenn Sie die VisibleEigenschaft so einstellen false, dass ButtonHandler in einigen Fällen deaktiviert werden. Setzen Sie die Form.AcceptButtonEigenschaft auf Ihre neue Schaltfläche. ClickFügen Sie im Ereignishandler den folgenden Code hinzu
this.SelectNextControl(ActiveControl, true, true, true, true)

Jetzt möchten Sie möglicherweise focusnur dann übertragen , wenn focusSie TextBoxentweder den ActiveControlTyp testen oder die e.SupressEigenschaft in Ereignishandlern von Steuerelementen verwenden möchten, die nicht Enterals " TAB Das ist es" verwendet werden sollen. Sie müssen nicht einmal erfassene.KeyCode


1
$("#txtSomething").keypress(function (e) {
        if (e.which == 13) {

            e.Handled = true; //This will prevent the "ding" sound

            //Write the rest of your code
        }
    });

Das suche ich.
Sid

1

In WinForms verursacht die Eingabetaste einen Ding-Sound, da die Formulareigenschaft AcceptButton nicht angegeben ist. Wenn Sie keinen AcceptButton benötigen, kann der Klingelton unterdrückt werden, indem Sie das Formular KeyPreview auf true setzen und das folgende KeyPress-Ereignis eingeben:

private void Form_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '\r')
        e.Handled = true;
}

Unabhängig davon, welche Steuerung aktiv ist, ertönt beim Drücken der Eingabetaste kein Klingelton mehr. Da die Reihenfolge für die Verarbeitung von Schlüsselereignissen KeyDown, KeyPress und KeyUp lautet, funktioniert die Eingabetaste weiterhin für die KeyDown-Ereignisse für die Steuerelemente.


0

Setzen Sie die IsDefault- Eigenschaft Ihrer Suchschaltfläche auf true. Dies macht es zu einer Standardschaltfläche und wird automatisch angeklickt, wenn die Eingabetaste gedrückt wird.


Aus den Dokumenten, die Sie mitTo specify the default button of a form, set the AcceptButton property of the form to the desired button.
mdm

Ja, ich habe das selbst untersucht. Es scheint, dass beide Ansätze austauschbar sind. AcceptButtonscheint stilvoller, aber ich bin an IsDefaultmich selbst gewöhnt.
Zruty

0

Nun, ich habe lange genug mit diesem Problem gelebt und es hier nachgeschlagen.

Nachdem ich einige Zeit darüber nachgedacht hatte und den einfachsten Weg wollte, es zu reparieren, fand ich den einfachsten, aber nicht so eleganten Weg, es zu reparieren.

Hier ist was ich getan habe.

  1. Fügen Sie 2 unsichtbare Schaltflächen "Ok" und "Abbrechen" in das Formular ein.
  2. Setzen Sie die Eigenschaften AcceptButton und CancelButton im Formular auf die unsichtbaren Schaltflächen.
  3. Den Schaltflächen wurde kein Code hinzugefügt!

Dies löste alle in diesem Thread aufgeführten sekundären Probleme, einschließlich des ToolStripMenu. Meine größte Beschwerde war der BindingNavigator, bei dem ich eine Datensatznummer an der aktuellen Position eingegeben habe, um zu navigieren, und die Eingabetaste gedrückt habe.

Gemäß der ursprünglichen Frage, in der der Programmierer eine Suchfunktion wünschte, als die Eingabetaste gedrückt wurde, habe ich einfach den Suchcode in die unsichtbare OK-Taste eingegeben!

Bisher scheint dies alle Probleme zu lösen, aber wie wir alle mit Visual Studio wissen, wird wahrscheinlich etwas auftauchen.

Die einzig andere elegante Möglichkeit, die ich mir vorstellen könnte, wäre das Schreiben einer neuen Klasse für die Handhabung von Tastenanschlägen, die für die meisten meiner Projekte viel zu viel Arbeit bedeutet.


0

Sie können Ihr Textfeld mehrzeilig auf true setzen und dann die Eingabetaste drücken.

private void yourForm_Load(object sender, EventArgs e)
    {
        textBox1.Multiline = true;
    }

//then write your TextBox codes
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // doSomething();
    }
}

0

Ich habe die Eigenschaften des Textfelds für ein mehrzeiliges Textfeld geändert und es funktioniert für mich.


Die Antwort wurde bereits am 22. Februar unten angegeben. Du musst dich auch um [eintreten] kümmern;)
Goodies

-2
void RTextBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyData == Keys.Enter)
    {
        //do ...
        bool temp = Multiline;
        Multiline = true;
        e.Handled = true;
        Multiline = temp;
    }
}

1
Dies ist eine redundante Antwort mit nur Code, keine Erklärung. Außerdem ist der gesamte MultilineCode völlig irrelevant.
Jonathon Reinhart
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.