[C#] [Thắc mắc] Tạo sự kiện ấn phím trong C#

Em đang viết thử chương trình tách họ tên trên Windowns Forms.
Trong chương trình có button Tách để thực hiện tách họ tên khi có sự kiện Click. Giờ em muốn sau khi nhập họ tên xong, nhấn Enter thì chương trình sẽ thực hiện tách. Em thiết lập thuộc tính KeyPreview=true cho form và viết sự kiện KeyDown:

private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btn_Tach.PerformClick();
        }

Nhưng mỗi lần nhấn phím thì nó lại phát ra âm thanh như báo lỗi (mặc dù vẫn thực hiện tách). Có cách nào để chỉnh lại không ạ?

[QUOTE=11520215;70771]Em đang viết thử chương trình tách họ tên trên Windowns Forms.
Trong chương trình có button Tách để thực hiện tách họ tên khi có sự kiện Click. Giờ em muốn sau khi nhập họ tên xong, nhấn Enter thì chương trình sẽ thực hiện tách. Em thiết lập thuộc tính KeyPreview=true cho form và viết sự kiện KeyDown:

private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btn_Tach.PerformClick();
        }

Nhưng mỗi lần nhấn phím thì nó lại phát ra âm thanh như báo lỗi (mặc dù vẫn thực hiện tách). Có cách nào để chỉnh lại không ạ?[/QUOTE]
Bạn vào properties của form (phần design ấy), chỗ thuộc tính AcceptButton bạn chọn tên cái button thực hiện tách là ok.

Thực hiện trên nhiều button được không anh? những nút khác khi ấn vẫn phát ra âm thanh đó

[QUOTE=11520215;70777]Thực hiện trên nhiều button được không anh? những nút khác khi ấn vẫn phát ra âm thanh đó[/QUOTE]
mỗi Form chỉ có một acceptbutton thôi bạn ah

 protected override bool ProcessCmdKey(ref Message msg, Keys keydata)
        {
            if (keydata == Keys.Enter)
            {
                btn_Tach.PerformClick()
                return true;
            }
            return false;
        }

Bạn thử code này xem sao :slight_smile:

chỉ cần thêm câu lệnh this.AcceptButton = cái button ảnh hướng đến trong chỗ Form_Load là dc mà

 private void Form_Load(object sender, EventArgs e)
        {
            ..........
            this.AcceptButton = button ảnh hưởng đến;
        }

[QUOTE=11520215;70777]Thực hiện trên nhiều button được không anh? những nút khác khi ấn vẫn phát ra âm thanh đó[/QUOTE]
nếu nhiều nút như vậy thì khi nhấn Enter thì nút nào sẽ đc thực hiện đây em? :slight_smile:
em chọn cái nút nào muốn là nút chính để gán vào thuộc tính accept button đó

[QUOTE=11520215;70771]Em đang viết thử chương trình tách họ tên trên Windowns Forms.
Trong chương trình có button Tách để thực hiện tách họ tên khi có sự kiện Click. Giờ em muốn sau khi nhập họ tên xong, nhấn Enter thì chương trình sẽ thực hiện tách. Em thiết lập thuộc tính KeyPreview=true cho form và viết sự kiện KeyDown:

private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btn_Tach.PerformClick();
        }

Nhưng mỗi lần nhấn phím thì nó lại phát ra âm thanh như báo lỗi (mặc dù vẫn thực hiện tách). Có cách nào để chỉnh lại không ạ?[/QUOTE]

Mình thấy bạn nên bắt sự kiện KeyPress cho cái textbox họ tên thì hay hơn.

[QUOTE=09520133;70808]nếu nhiều nút như vậy thì khi nhấn Enter thì nút nào sẽ đc thực hiện đây em? :slight_smile:
em chọn cái nút nào muốn là nút chính để gán vào thuộc tính accept button đó[/QUOTE]
Ý em là mình tạo nhiều sự kiện nhấn phím, như là phím Enter để thực hiện tách, phím ESC để thoát chương trình.
[QUOTE=11520185;70839]Mình thấy bạn nên bắt sự kiện KeyPress cho cái textbox họ tên thì hay hơn.[/QUOTE]
Bạn nói cụ thể hơn được không?

nếu chỉ có 2 nút vậy thì gán this.AcceptButton cho button Tách, còn this.CancelButton cho button thoát là dc mà? mình nghĩ thế
[QUOTE=11520215;70863]Ý em là mình tạo nhiều sự kiện nhấn phím, như là phím Enter để thực hiện tách, phím ESC để thoát chương trình.[/QUOTE]

[QUOTE=11520215;70863]Ý em là mình tạo nhiều sự kiện nhấn phím, như là phím Enter để thực hiện tách, phím ESC để thoát chương trình.

Bạn nói cụ thể hơn được không?[/QUOTE]
Bạn nên xác định là đang làm việc với control cụ thể hay là với cả cái Form luôn. Ở đây nếu bạn chỉ làm việc với cái TextBox thì bạn tìm hiểu các sự kiện Key của textBox đó, còn làm việc với cả Form thì xem các sự kiện Key trên Form.

Tất nhiên là được chứ em. Em thích làm sao chả được. Cứ if (sự kiện đó) rồi thực hiện thôi.
Xem thêm về overridelại sự kiện keydown.
Ví dụ đơn giản như thế này:

//
        //HotKey
        //

        protected override bool ProcessDialogKey(Keys keyData)
        {
            if (keyData == Keys.F2)
            {
                NewMDI();
                return true;
            }
            else if (keyData == (Keys.Control | Keys.Alt | Keys.F4))
            {
                foreach (Form f in this.MdiChildren)
                {
                    f.Close();
                }
                return true;
            }
            else if (keyData == Keys.F1)
            {
                Help.ShowHelp(this,"huongdan.chm");
                return true;
            }
            else return false;
        }

[QUOTE=11520215;70863]Ý em là mình tạo nhiều sự kiện nhấn phím, như là phím Enter để thực hiện tách, phím ESC để thoát chương trình.

Bạn nói cụ thể hơn được không?[/QUOTE]