Results 1 to 1 of 1

Thread: การบังคับปุ่ม Enter ใน DataGridView มีพฤติกรรม เหมือนกับ Tab

  1. #1
    Junior Member
    Join Date
    Sep 2006
    Location
    Thailand
    Posts
    15


    ขอประกาศเลยครับว่าผมไม่ชอบวัฒนธรรมการ Lock ของ Board นี้เอามากๆ OK ครับถ้าเป็นข้อมูลที่หมิ่นเหม่ต่อการกระทำผิดเช่นข้อมูลการ Hack หรืออื่นๆ ที่สามารถนำไปสร้างความเดือดร้อนได้ จะ Lock ก็ Lock ไปเถอะครับ แต่การแชร์ความรู้ด้านโปรแกรมมิ่งนั้น ผมไม่ทราบจริงๆ ว่าจะ Lock ไปทำไมกัน? ทำไมไม่ส่งเสริมความรู้กันอย่างกว้างขวางล่ะครับ ตอนนี้เรากำลังไล่กวดอินเดียนะครับ

    ขอโทษครับที่กักขฬะไปสักหน่อย แต่ผมว่ามันเป็นสิทธิ์ของสมาชิกที่จะออกความเห็นได้นะครับ

    เริ่มเรืิ่องแล้วครับ!!

    ***ผมได้แนบไฟล์ Project ตัวอย่างมาในบทความนี้ด้วย ลองดาวน์โหลดไปดูประกอบนะครับ***

    ไม่รู้มีใครเหมือนผมหรือเปล่าที่ User จะมีปัญหาเวลา Navigate ข้อมูลใน Datagridview โดยการกดปุ่ม Enter ซึ่ง User ส่วนใหญ่จะคาดหวังว่า ให้ Cursor เลื่อนไป Next Field แต่ผลปรากฏว่า มันกลับเลื่อนไป Next Record

    วิธีแก้ปัญหาของหลายคนก็คงจะไปดัก Events ของ KeyDown (หรือ KeyPress) แล้วใช้ method handle มาจัดการเพื่อไม่ให้ Keys.Enter ทำงานแล้วอาจจะใช้ Method SendKeys.Send("{Tab}") เพื่อให้เวลากด Enter แล้ว Event ดังกล่าวจะทำการส่งปุ่ม Tab แทน

    วิธีนี้ไม่ได้ผลครับ!! ซึ่งเนื่องมาจากสาเหตุดังนี้
    1. ในระบบของ Windows Forms นี้จะมีปุ่มบางปุ่มที่ได้มีการประมวลผลไว้ก่อนแล้ว เช่นปุ่ม Enter, Tab, Escape เป็นต้น ทำให้เมื่อมีการกดปุ่มดังกล่าวแล้ว ถึงแม้ว่าเราจะดักด้วย Events ที่เหมาะสมก็เปล่าประโยชน์เพราะว่า Windows Forms ได้ประมวลผลไปเรียบร้อยแล้ว ซึ่งปุ่มที่ถูกประมวลผลก่อนนี้เราจะเรียกว่า Message Preprocessing

    2. หรือมองอีกมุมหนึ่งก็คือ ใน Windows Form นี้จะมี Method หนึ่งที่ชื่อว่า IsInputKey ซึ่งจะเป็นตัวชี้ว่า Key ใดเป็น Input Key ซึ่งหมายถึง เป็น Key ที่ user input นั่นเอง method นี้จะมี Signature ดังนี้

    protected virtual bool IsInputKey (Keys keyData)

    ถ้าค่า return ของ method นี้เป็น true ก็แปลว่า keyData ดังกล่าวเป็น InputKey แต่ถ้า return false ปุ่มดังกล่าวก็เป็นปุ่มที่ Windows Form ประมวลผลก่อนแล้ว (message preprocessing)

    วิธีแก้ให้ทำดังนี้ครับ

    วิธีที่หนึ่ง (วิธีของผมเอง)

    ให้เราำทำการ สร้าง class ที่ inherited มาจาก DataGridView โดยจะเขียน Code C# ได้ดังนี้
    public class MyDataGridView : DataGridView
    {

    }

    สืบทอด Method ProcessDialogKey มาจาก System.Windows.Forms class (ซึ่งเป็น Parent class ของ DataGridview) ซึ่งเป็น method ที่จะทำงานในช่วงเวลาที่มีการ Message Preprocessing ทำให้เราสามารถจัดการได้ว่าจะจัดการปุ่มใดอย่างไรก็ได้ ดังนี้

    public class MyDataGridView : DataGridView
    {
    protected override bool ProcessDialogKey(Keys keyData)
    {

    }
    }

    จากนั้นก็จะำทำการ "สวมรอย" ของปุ่ม Tab ให้กับ ปุ่ม Enter โดยจะมีการเช็คก่อนว่า keyData นั้นคือ Keys.Enter หรือไม่ ถ้าใช่ให้เปลี่ยน keyData เป็น Keys.Tab แล้วส่งเป็น parameter ใ้ห้กับ base.ProcessDialogKey ดังนี้

    public class MyDataGridView : DataGridView
    {
    protected override bool ProcessDialogKey(Keys keyData)
    {
    switch (keyData)
    {
    case Keys.Enter:
    keyData = Keys.Tab;
    break;
    }
    return base.ProcessDialogKey(keyData);
    }
    }

    ยัังมีอีก Method ที่เราจะต้อง override นั้นคือ ProcessDataGridViewKey ซึ่งก็จะมีหน้าที่คล้ายๆ กับ ProcessDialogKey แต่ต่างกันตรงที่ method นี้จะจัดการกับกระบวนการ key processing ของ DataGridView เท่านั้น

    โดยเราจะตรวจสอบว่ามีการกด enter หรือไม่ ถ้าใช่ ก็ให้เรียก Method ProcessDialogKey แล้วส่ง Parameter ที่เป็น ปุ่ม Enter เข้าไป จากนั้น return false เพื่อบอกว่า ปุ่ม Enter จะเป็นปุ่มที่เราจัดการเอง และก็อย่าลืม return base.ProcessDataGridViewKey เพื่อคงการประมวลผลแบบเดิม สำหรับปุ่มอื่นๅ ด้วย โดย Code C# จะเป็นดังนี้

    public class MyDataGridView : DataGridView
    {
    ...

    protected override bool ProcessDataGridViewKey(KeyEventArgs e)
    {
    switch (e.KeyCode)
    {
    case Keys.Enter:
    ProcessDialogKey(e.KeyCode);
    return false;
    }
    return base.ProcessDataGridViewKey(e);
    }
    }

    แค่นี้ก็เป็นอันเรียบร้อย เราก็จะได้ DataGridView ที่ไม่มีปัญหาสำหรับปุ่ม Enter แล้ว

    วิธีที่สอง (วิธีของ MSDN)

    วิีธีนี้จะแตกต่างในส่วนของรายละเอียดใน Method ทั้งสอง นั่นคือ ProcessDialogKey และ ProcessDataGridViewKey โดยวิธีนี้จะเป็นการเรียก Method ที่ทำหน้าที่โดยตรงจาก library เลย ซึ่งก็คือ Method ProcessTabKey ซึ่งชื่อก็บอกอยู่แล้วว่าเป็นการกด Tab โดยการโปรแกรม ซึ่ง Code จะเป็นดังนี้


    //ที่มา http://msdn2.microsoft.com/en-us/library/system.windows.forms.datagridview.processdatagridviewkey.aspx

    protected override bool ProcessDialogKey(Keys keyData)
    {
    // Extract the key code from the key value.
    Keys key = (keyData & Keys.KeyCode);

    // Handle the ENTER key as if it were a RIGHT ARROW key.
    if (key == Keys.Enter)
    {
    return this.ProcessTabKey(keyData);
    }
    return base.ProcessDialogKey(keyData);
    }

    protected override bool ProcessDataGridViewKey(KeyEventArgs e)
    {
    // Handle the ENTER key as if it were a RIGHT ARROW key.
    if (e.KeyCode == Keys.Enter)
    {
    return this.ProcessRightKey(e.KeyData);
    }
    return base.ProcessDataGridViewKey(e);
    }



    หวังว่าบทความนี้จะเป็นประโยชน์แก่ผู้ที่สนใจบ้่างนะครับ

    สวัสดีครับ
    Tanakorn
    Attached Files Attached Files

Similar Threads

  1. Replies: 1
    Last Post: 04-05-2010, 02:50 PM
  2. Honeywell T-Hawk to enter UK service in September
    By newsbot in forum World Hacking/Security News
    Replies: 3
    Last Post: 22-01-2010, 09:56 PM
  3. Ctrl + Enter ใน IE เดี้ยง!!
    By SleepMan in forum ทิปหรือเคล็ดลับการคอมพิวเตอร์ต่างๆ
    Replies: 0
    Last Post: 26-12-2008, 10:01 AM
  4. [upload.th.la&GS] Enter The Matrix
    By hackerpoom in forum Gaming, Bot, Cheating and Tweaking tool
    Replies: 0
    Last Post: 13-09-2007, 03:14 PM
  5. Enter Sandman??
    By asylu3 in forum Non computer knowledge
    Replies: 3
    Last Post: 24-01-2003, 05:01 PM

Members who have read this thread : 0

Actions : (View-Readers)

There are no names to display.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •