หยุด 'Ding' เมื่อกด Enter


124

ฉันมีแอปพลิเคชัน Windows Forms ที่เรียบง่ายมาก และใน Windows (หรืออย่างน้อย Windows Forms Applications) เมื่อคุณกด Enter ในขณะที่อยู่ในตัวควบคุมกล่องข้อความบรรทัดเดียวคุณจะได้ยิน Ding เป็นเสียงที่ไม่ถูกใจซึ่งบ่งบอกว่าคุณไม่สามารถเข้าสู่การขึ้นบรรทัดใหม่ได้เนื่องจากเป็นกล่องข้อความบรรทัดเดียว

ทั้งหมดนี้ไม่เป็นไร อย่างไรก็ตามในแบบฟอร์มของฉันฉันมีกล่องข้อความ 1 กล่องและปุ่มค้นหา และฉันกำลังอนุญาตให้ผู้ใช้ทำการค้นหาโดยกด Enter หลังจากที่พวกเขาพิมพ์เสร็จแล้วดังนั้นพวกเขาจึงไม่ต้องใช้เมาส์คลิกปุ่มค้นหา

แต่เสียง Ding นี้เกิดขึ้น มันน่ารำคาญมาก

เราจะทำอย่างไรให้เสียงนั้นไม่เล่นเลยในแบบฟอร์มของฉัน

@David H - นี่คือวิธีที่ฉันตรวจจับการกด Enter:

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

คุณตรวจพบได้อย่างไรว่ามีการกด Enter เมื่อโฟกัสอยู่ในกล่องข้อความ
David Heffernan

ในบานหน้าต่างคุณสมบัติคุณดับเบิลคลิกที่ KeyDown หรือ KeyUp Event จากนั้นในมุมมองโค้ดคุณพิมพ์รหัสที่ฉันกำลังจะใส่ในคำถามของฉันสำหรับย่ะ
bendr

2
KeyPress น่าจะเป็นเหตุการณ์ที่ถูกต้องและคุณต้องการตั้งค่า e.Handled = true
David Heffernan

ขอบคุณ
@David

7
ฉันหวังว่าจะมีวิธีใดในการระงับสิ่งที่น่ารำคาญ แต่ปล่อยให้กดปุ่มเพื่อทำให้ฟองขึ้น บางครั้งการกดปุ่มเป็นเพียงการกดปุ่มไม่จำเป็นต้องมีการปลุก
flipdoubt

คำตอบ:


56

ตรวจสอบคุณสมบัติForm.AcceptButton คุณสามารถใช้เพื่อระบุปุ่มเริ่มต้นสำหรับฟอร์มในกรณีนี้สำหรับการกด Enter

จากเอกสาร:

คุณสมบัตินี้ช่วยให้คุณสามารถกำหนดการดำเนินการเริ่มต้นที่จะเกิดขึ้นเมื่อผู้ใช้กดแป้น ENTER ในแอปพลิเคชันของคุณ ปุ่มที่กำหนดให้กับคุณสมบัตินี้ต้องเป็น IButtonControl ที่อยู่บนฟอร์มปัจจุบันหรืออยู่ภายในคอนเทนเนอร์บนฟอร์มปัจจุบัน

นอกจากนี้ยังมีคุณสมบัติCancelButtonเมื่อผู้ใช้กดหนี


1
ขอบคุณ @mdm สิ่งนี้ได้ผลดีที่สุดสำหรับฉัน :) ฉันจะกลับมาโหวตเพิ่มเมื่อฉันมีตัวแทนมากขึ้น
bendr

1
@bendr ฉันมีปัญหาเดียวกัน .. แต่ฉันใช้ UserControl .. มันไม่มี Form.AcceptButton .. จะแก้ไขได้อย่างไร?
Murhaf Sousli

1
Visual Studio ดูเหมือนจะไม่มีฟิลด์ในบานหน้าต่างคุณสมบัติสำหรับสิ่งนี้ ต้องทำในรหัสเห็นได้ชัด this.AcceptButton = buttonOK; this.CancelButton = buttonCancel;
คริส

5
วิธีนี้ใช้ไม่ได้กับ ToolStripButtons หรือถ้าคุณต้องการใช้ปุ่ม ENTER เพื่อตรวจสอบกล่องข้อความหรือ ToolStripTextBox แนวทางที่ดีกว่าคือคำตอบของ Lucio Fonseca ซึ่งเหมาะกับฉันกับ ToolStripTextBox
Robert S.

ฉันไม่เห็นวิธีแก้ปัญหาของคุณคุณไม่มีแบบฝึกหัดภาคปฏิบัติเพื่อให้รู้แจ้งมากขึ้น
Pedro Ávila

198

มันใช้ได้กับฉัน:

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;

     }

 }

SuppressKeyPress เป็นเคล็ดลับจริงๆ ฉันหวังว่าจะช่วยคุณ


30
นี่เป็นคำตอบเดียวที่ถูกต้องในความคิดของฉัน e.Handled = true;ไม่เพียงพอ มันเป็นSuppressKeyPressเคล็ดลับที่ทำ
Jonathon Reinhart

12
textBox1_KeyUp จะตกอยู่ในสถานการณ์นี้โดยไม่คำนึงถึง Handled หรือ SuppressKeyPress
stackuser83

4
ใช้ได้ผลกับToolStripTextBox.KeyDown. ไม่มีวิธีแก้ปัญหาอื่น ๆ ขอบคุณ!
Robert S.

1
มันไม่ได้ทำงานสำหรับฉันฉันtextboxและKeyDownเหตุการณ์
อเล็กซ์โจลิก

7
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ คำตอบที่ยอมรับในปัจจุบันต้องใช้ปุ่มมาตรฐานที่วางอยู่บนแบบฟอร์มซึ่งไม่เป็นที่พอใจ
Javid

56

ลอง

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
    }
}

ถูกต้อง แต่จะใช้ได้ก็ต่อเมื่อโฟกัสยังคงอยู่บนกล่องข้อความ แล้วถ้าผู้ใช้กดTabก่อนล่ะ?
mdm

4
@mdm ขึ้นอยู่กับการออกแบบ UI บางที OP ต้องการการดำเนินการนี้เมื่อโฟกัสอยู่ที่กล่องข้อความเท่านั้น เป็นเรื่องธรรมดา
David Heffernan

2
หากผู้ใช้กด Tab โฟกัสจะไม่อยู่ที่ TextBox อีกต่อไป Contorl ถัดไปที่จะโฟกัสคือ Button Control ซึ่งจะไม่ส่งเสียงนั้นเมื่อคุณกด Enter :-)
bendr

@ เดวิดขอบคุณสำหรับตัวอย่างของคุณ ผมเพิ่งลองทำ และเมื่อใดก็ตามที่ฉันใส่e.Handled = trueในเหตุการณ์. KeyPress ไม่มีโค้ดอื่นใดรัน สิ่งเดียวที่เกิดขึ้นคือข้อความทั้งหมดในกล่องข้อความถูกเลือก (และฉันไม่มีรหัสที่เลือกข้อความใด ๆ ด้วย
ซ้ำ

1
คำตอบของ Lucio Fonseca เป็นเพียงคำตอบเดียวที่ฉันพบว่าสามารถดูแลปัญหาได้
Jonathon Reinhart

15

เพียงเพิ่มe.SuppressKeyPress = true;คำสั่ง "if" ของคุณ

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

คุณสามารถใช้ KeyPress แทน KeyUp หรือ KeyDown ได้ซึ่งมีประสิทธิภาพมากขึ้นและนี่คือวิธีจัดการ

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

และกล่าวสันติภาพกับ 'Ding'


2
สิ่งนี้ใช้ได้ผลอย่างสมบูรณ์สำหรับฉัน e. เห็นได้ชัดว่าการจัดการปิดใช้งาน 'Ding' การทำให้ปุ่ม "ส่ง" เป็นค่าเริ่มต้น (ในกรณีของฉัน) เป็นค่าเริ่มต้นจะไม่ได้ผลสำหรับฉันเพราะฉันต้องการจัดการคีย์ "Enter" ให้แตกต่างจากกล่องข้อความอื่น ๆ ในแบบฟอร์ม <br/> <br/> อย่างไรก็ตาม : สำหรับโครงการนี้ฉันใช้ VB ดังนั้นแทนที่จะแคสต์ e.KeyChar ฉันจะแปลงมัน: ถ้า e.KeyChar = ChrW (Keys.Enter Then ....
Mark Ainsworth

1
ภายในการKeyDownใช้งานe.Handledและe.SuppressKeyPressไม่ได้ผลสำหรับฉัน - ยังคงอยู่ แต่การเปลี่ยนตามที่แนะนำไว้ที่นี่เพื่อใช้KeyPress' event and e.Handled` ทำได้ดีมาก
Jinlye

นี่ควรเป็นคำตอบที่ถูกต้องขอบคุณ
Firas Shrourou

7

ใช้SuppressKeyPressเพื่อหยุดการประมวลผลการกดแป้นพิมพ์ต่อไปหลังจากจัดการแล้ว

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

ฉันสะดุดกับโพสต์นี้ในขณะที่พยายามจัดการ KeyDown ซึ่งใช้ได้ผลกับฉัน

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

การกดปุ่มกดจะหยุดเหตุการณ์ไม่ให้ส่งไปยังตัวควบคุมที่อยู่เบื้องหลัง สิ่งนี้จะได้ผลหากคุณจัดการทุกสิ่งที่แป้น Enter จะทำภายในกล่องข้อความนั้นด้วยตนเอง ขออภัยเกี่ยวกับ Visual Basic


2

มีโอกาสน้อยมากที่ทุกคนจะได้รับคำตอบนี้ แต่คำตอบอื่น ๆ นั้นน่ากลัวอย่างแท้จริง การปราบปรามเหตุการณ์KeyDownฆ่า 2 เหตุการณ์เพิ่มเติมในการโจมตีครั้งเดียว การตั้งค่าe.Handledคุณสมบัติtrueเป็นไม่มีประโยชน์ในบริบทนี้
วิธีที่ดีที่สุดคือการตั้งค่าForm.AcceptButtonคุณสมบัติเป็นปุ่มค้นหาจริง
นอกจากนี้ยังมีอีกวิธีหนึ่งในการใช้Enterคีย์ - บางคนอาจต้องการให้ทำหน้าที่เป็นTABปุ่ม ในการทำเช่นนั้นให้เพิ่มใหม่Buttonตั้งค่าLocationคุณสมบัติภายนอกFormพื้นที่ (เช่น(-100, -100)) - การตั้งค่าVisibleคุณสมบัติเป็นfalseอาจปิดใช้งานButtonตัวจัดการในบางกรณี ตั้งค่าForm.AcceptButtonคุณสมบัติเป็นปุ่มใหม่ของคุณ ในClickตัวจัดการเหตุการณ์ให้เพิ่มรหัสต่อไปนี้
this.SelectNextControl(ActiveControl, true, true, true, true)

ตอนนี้คุณอาจต้องการที่จะถ่ายโอนfocusเฉพาะเมื่อfocusมันเกี่ยวกับTextBoxคุณอาจต้องการที่จะทดสอบทั้งActiveControlประเภทหรือการใช้e.Supressคุณสมบัติในตัวจัดการเหตุการณ์ของการควบคุมไม่ได้หมายถึงการใช้งานEnterในฐานะTAB ที่มัน คุณไม่จำเป็นต้องจับภาพe.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
        }
    });

นี่คือสิ่งที่ฉันกำลังมองหา
Sid

1

ใน WinForms คีย์ Enter ทำให้เกิดเสียง Ding เนื่องจากไม่ได้ระบุคุณสมบัติแบบฟอร์ม AcceptButton หากคุณไม่ต้องการปุ่ม AcceptButton สามารถระงับเสียง ding ได้โดยตั้งค่า KeyPreview แบบฟอร์มเป็น true และป้อนเหตุการณ์ KeyPress ต่อไปนี้:

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

ไม่ว่าจะใช้การควบคุมแบบใดก็ตามจะไม่มีเสียงดังขึ้นอีกเมื่อกดปุ่ม Enter เนื่องจากลำดับการประมวลผลเหตุการณ์สำคัญคือ KeyDown KeyPress และ KeyUp ปุ่ม Enter จะยังคงทำงานสำหรับเหตุการณ์ KeyDown สำหรับตัวควบคุม


0

ตั้งค่าปุ่มค้นหาของคุณIsDefaulttrueคุณสมบัติการ จะทำให้เป็นปุ่มเริ่มต้นและจะคลิกอัตโนมัติเมื่อกด Enter


จากเอกสารที่คุณเชื่อมโยงTo specify the default button of a form, set the AcceptButton property of the form to the desired button.
mdm

ใช่ฉันได้ตรวจสอบเรื่องนี้ด้วยตัวเอง ดูเหมือนทั้งสองวิธีจะใช้แทนกันได้ AcceptButtonดูเหมือนมีสไตล์มากขึ้น แต่ฉันก็ชินกับIsDefaultตัวเอง
Zruty

0

ฉันอยู่กับปัญหานี้มานานพอแล้วและค้นหามันที่นี่

หลังจากคิดถึงเรื่องนี้มาระยะหนึ่งแล้วและต้องการวิธีที่ง่ายที่สุดในการแก้ไขฉันได้หาวิธีที่ง่ายที่สุด แต่ไม่สวยหรูในการแก้ไข

นี่คือสิ่งที่ฉันทำ

  1. ใส่ปุ่มที่มองไม่เห็น 2 ปุ่ม "ตกลง" และ "ยกเลิก" ในแบบฟอร์ม
  2. ตั้งค่าคุณสมบัติ AcceptButton และ CancelButton บนแบบฟอร์มเป็นปุ่มที่มองไม่เห็น
  3. เพิ่มรหัสไม่ให้ปุ่ม!

วิธีนี้ช่วยแก้ปัญหารองทั้งหมดที่แสดงในเธรดนี้รวมถึง ToolStripMenu ข้อร้องเรียนที่ใหญ่ที่สุดของฉันคือ BindingNavigator เมื่อฉันจะป้อนหมายเลขบันทึกลงในตำแหน่งปัจจุบันเพื่อไปที่และกด Enter

ตามคำถามเดิมที่โปรแกรมเมอร์ต้องการฟังก์ชั่นการค้นหาเมื่อกดปุ่ม enter ฉันเพียงแค่ใส่รหัสค้นหาในปุ่ม OK ที่มองไม่เห็น!

จนถึงตอนนี้ดูเหมือนว่าจะแก้ปัญหาทั้งหมดได้ แต่อย่างที่เราทุกคนทราบด้วย Visual Studio อาจมีบางอย่างเกิดขึ้น

วิธีเดียวที่เป็นไปได้ที่สวยงามที่ฉันคิดได้คือการเขียนคลาสการจัดการการกดแป้นพิมพ์ใหม่ซึ่งเป็นวิธีที่ได้ผลมากสำหรับโครงการส่วนใหญ่ของฉัน


0

คุณสามารถตั้งค่าหลายบรรทัดกล่องข้อความของคุณเป็นจริงจากนั้นจัดการกับการกดปุ่ม Enter

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

ฉันเปลี่ยนคุณสมบัติกล่องข้อความสำหรับกล่องข้อความหลายบรรทัดและมันก็ใช้ได้สำหรับฉัน


คำตอบได้ระบุไว้แล้วด้านล่างเมื่อ 22 ก.พ. คุณต้องดูแล [ป้อน] ด้วย;)
สารพัด

-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
นี่เป็นคำตอบซ้ำซ้อนที่มีเพียงรหัสไม่มีคำอธิบาย นอกจากนี้Multilineรหัสทั้งหมดยังไม่เกี่ยวข้องทั้งหมด
Jonathon Reinhart
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.