จะลบโฟกัสออกจากกล่องข้อความใน WinForms ได้อย่างไร


110

ฉันต้องการลบโฟกัสออกจากกล่องข้อความหลาย ๆ อัน ฉันลองใช้:

textBox1.Focused = false;

ของมูลค่าทรัพย์สินเป็นReadOnlytrue

จากนั้นฉันลองตั้งค่าโฟกัสบนแบบฟอร์มเพื่อที่จะลบออกจากกล่องข้อความทั้งหมด แต่ก็ไม่สามารถใช้งานได้:

this.Focus();

และฟังก์ชันจะส่งกลับfalseเมื่อเลือกกล่องข้อความ

ดังนั้นฉันจะลบโฟกัสออกจากกล่องข้อความได้อย่างไร

คำตอบ:


113

คุณต้องการการควบคุมที่โฟกัสได้อื่น ๆ เพื่อย้ายโฟกัสไปที่

โปรดทราบว่าคุณสามารถตั้งโฟกัสเป็นป้ายกำกับได้ คุณอาจต้องการพิจารณาว่าคุณต้องการให้คีย์ [Tab] นำไปที่ใดต่อไป

โปรดทราบว่าคุณไม่สามารถตั้งค่าเป็นแบบฟอร์มได้ การควบคุมคอนเทนเนอร์เช่นฟอร์มและแผงควบคุมจะส่งผ่านโฟกัสไปที่การควบคุมลูกแรก ซึ่งอาจเป็นกล่องข้อความที่คุณต้องการให้ย้ายออกไป


ขอบคุณ; ฉันเพิ่งลองโฟกัสไปที่ป้ายกำกับและตอนนี้กล่องข้อความไม่ได้โฟกัส ดูเหมือนว่าคุณไม่สามารถมุ่งเน้นไปที่ฟอร์มได้ด้วยเหตุผลบางประการ
Callum Rogers

7
การควบคุมคอนเทนเนอร์ (แบบฟอร์มแผงควบคุม) จะส่งผ่านโฟกัสไปที่การควบคุมลูกแรก
Henk Holterman

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

62

การมุ่งเน้นไปที่ฉลากไม่ได้ผลสำหรับฉันการทำสิ่งที่ชอบlabel1.Focus()ใช่ไหม กล่องข้อความยังคงมีโฟกัสเมื่อโหลดแบบฟอร์มอย่างไรก็ตามการลองใช้ คำตอบVelociraptorsได้ผลสำหรับฉันการตั้งค่าการควบคุมที่ใช้งานอยู่ของฟอร์มเป็นป้ายกำกับดังนี้:

private void Form1_Load(object sender, EventArgs e)  
{ 
    this.ActiveControl = label1;       
}

7
ฉันหวังว่าฉันจะมอบลูกศรล้านลูกให้คุณ ฉันลองทุกอย่างที่คนอื่นแนะนำนี่เป็นสิ่งเดียวที่ได้ผล ด้วยเหตุผลบางประการกล่องข้อความมักขโมยโฟกัสไปจากทุกสิ่ง ...
eladyanai

3
สิ่งนี้ใช้ได้กับตัวควบคุมคอนเทนเนอร์เช่นแผงควบคุม ฉันแค่ต้องการลบโฟกัสอย่างสมบูรณ์และได้ผล:this.ActiveControl = panelOnMyForm;
Tim Schmelter

52

คุณสามารถเพิ่มรหัสต่อไปนี้:

this.ActiveControl = null;  //this = form

7
ฉันเชื่อว่านี่คือคำตอบที่ดีที่สุด วิธีการอื่น ๆ อีกมากมายเช่น "โฟกัส" หากคุณอ่าน MSDN แสดงว่าเป็นวิธีการระดับต่ำสำหรับนักออกแบบตัวควบคุม หากคุณต้องการให้ทุกอย่างถูก "ไม่เลือก" สิ่งนี้ดูเหมือนจะเป็นแนวทางที่ง่ายที่สุดเนื่องจากเป็นเพียงเส้นเล็ก ๆ เส้นเดียว
Rostov

1
นี่อาจเป็นครึ่งหนึ่งของเหตุผลที่ Microsoft เพิ่มคุณสมบัตินี้ตั้งแต่แรก
Panzercrisis

นี่ดูเหมือนจะเป็นวิธีแก้ปัญหาที่หรูหราที่สุดมันทำงานได้ดีในกรณีของฉัน
NetWave

ฉันต้องการให้คำตอบนี้ใช้งานได้จริง ๆ เพราะดูเหมือนว่ามันควรจะเป็น แต่ในกรณีของฉันมันใช้ไม่ได้เพราะในขณะที่มันทริกเกอร์เหตุการณ์การลามันไม่ได้ทริกเกอร์เหตุการณ์ที่ตรวจสอบความถูกต้อง / ตรวจสอบความถูกต้อง
Rhys Jones

32

ลองปิดและเปิดใช้งานกล่องข้อความ


5
วิธีนี้ใช้งานได้ค่อนข้างเนียนเนื่องจากจะเลือกตัวควบคุมถัดไปในรายการแท็บโดยอัตโนมัติในระหว่างนี้
นิค

3
ฉันกำลังพัฒนาใน Silverlight โดยใช้ MVVM และใช้สิ่งนี้โดยใช้พฤติกรรมที่กำหนดเป้าหมายกล่องข้อความ เนื่องจากฉันไม่มี UIElement อื่นที่มีประโยชน์ในการกำหนดโฟกัสไปที่โซลูชันปิดใช้งาน / เปิดใช้งานจึงทำงานได้อย่างมหัศจรรย์ ขอบคุณ!
Albert Oldfield

ฉันจะปิดการใช้งานได้อย่างไร?
miguelmpn

1
@miguelmpn textBox1.Enabled = false;จะปิดการใช้งานกล่องข้อความของคุณ และตั้งค่าเป็นtrueจะเปิดใช้งานอีกครั้ง
Raktim Biswas

24

คุณยังสามารถตั้งค่าactivecontrolคุณสมบัติแบบฟอร์มที่nullต้องการ

ActiveControl = null;

7
ฉันหวังว่าผู้คนจะเลื่อนลงมาจนถึงตรงนี้และอย่าเพิ่งใช้วิธีแก้ปัญหาที่ระบุว่าเป็นคำตอบ
makoshichi

ยังคงเป็นคำตอบที่ดีที่สุดสำหรับวันนี้ที่นี่เพื่อนรับคะแนนโหวตของฉัน
xoxel

8

Focusตั้งค่าโฟกัสอินพุตดังนั้นการตั้งค่าเป็นแบบฟอร์มจะไม่ทำงานเนื่องจากแบบฟอร์มไม่ยอมรับอินพุต ลองตั้งค่าActiveControlคุณสมบัติของฟอร์มเป็นตัวควบคุมอื่น คุณยังสามารถใช้Selectเพื่อเลือกตัวควบคุมเฉพาะหรือSelectNextControlเพื่อเลือกตัวควบคุมถัดไปในลำดับแท็บ


1
พยายามอย่างอื่นที่นี่และSelect()ทำงานให้ฉัน
Derek W

8

ลองอันนี้:

ตั้งค่าลำดับแท็บก่อน

จากนั้นในเหตุการณ์โหลดแบบฟอร์มเราสามารถส่งการกดแป้นแท็บโดยใช้โปรแกรมไปยังแอปพลิเคชัน ดังนั้นแอปพลิเคชันดังกล่าวจะให้โฟกัสไปที่ contol ลำดับที่ 1 ตามลำดับแท็บ

ในการโหลดแบบฟอร์มแม้กระทั่งเขียนบรรทัดนี้

SendKeys.Send("{TAB}");

สิ่งนี้ได้ผลสำหรับฉัน


4

โพสต์นี้ทำให้ฉันทำสิ่งนี้:

ActiveControl = null;

สิ่งนี้ทำให้ฉันสามารถจับอินพุตคีย์บอร์ดทั้งหมดที่ระดับบนสุดโดยไม่ต้องใช้การควบคุมอื่น ๆ


3

ฉันพบทางเลือกที่ดี! มันเหมาะกับฉันที่สุดโดยไม่ต้องโฟกัสไปที่อย่างอื่น

ลองดู:

private void richTextBox_KeyDown(object sender, KeyEventArgs e)
{    
    e.SuppressKeyPress = true;
}

3

ฉันทำสิ่งนี้ด้วยการควบคุมแบบกำหนดเองของฉันฉันทำสิ่งนี้บนโฟกัส ()

this.Parent.Focus();

ดังนั้นหากเท็กซ์บ็อกซ์โฟกัส - มันจะโฟกัสกล่องข้อความพาเรนต์ทันที (ฟอร์มหรือพาเนล ... ) นี่เป็นตัวเลือกที่ดีหากคุณต้องการทำสิ่งนี้ด้วยการควบคุมแบบกำหนดเอง


2

ดูเหมือนว่าฉันไม่ต้องตั้งโฟกัสไปที่องค์ประกอบอื่น ๆ ในแอปพลิเคชัน Windows Phone 7 ฉันใช้วิธีโฟกัสเพื่อยกเลิกการตั้งค่าโฟกัสของกล่องข้อความ

การให้คำสั่งต่อไปนี้จะทำให้โฟกัสเป็นอะไร:

void SearchBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        Focus();
    }
}

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx

มันได้ผลสำหรับฉัน แต่ฉันไม่รู้ว่าทำไมมันถึงไม่เหมาะกับคุณ: /


2

วิธีแก้ปัญหาง่ายๆคือการฆ่าโฟกัสเพียงแค่สร้างคลาสของคุณเอง:

public class ViewOnlyTextBox : System.Windows.Forms.TextBox {
    // constants for the message sending
    const int WM_SETFOCUS = 0x0007;
    const int WM_KILLFOCUS = 0x0008;

    protected override void WndProc(ref Message m) {
        if(m.Msg == WM_SETFOCUS) m.Msg = WM_KILLFOCUS;

        base.WndProc (ref m);
    }
}

เป็นวิธีแก้ปัญหาที่ฉันกำลังมองหา ขอบคุณ!
LeftyCoder

1
    //using System;
    //using System.Collections.Generic;
    //using System.Linq;

    private void Form1_Load(object sender, EventArgs e)
    {
        FocusOnOtherControl(Controls.Cast<Control>(), button1);
    }

    private void FocusOnOtherControl<T>(IEnumerable<T> controls, Control focusOnMe) where T : Control
    {
        foreach (var control in controls)
        {
            if (control.GetType().Equals(typeof(TextBox)))
            {
                control.TabStop = false;
                control.LostFocus += new EventHandler((object sender, EventArgs e) =>
                {                     
                    focusOnMe.Focus();
                });
            }
        }
    }

0

วิธีที่ฉันจะหลีกเลี่ยงก็คือวางส่วนควบคุม winform ทั้งหมดของฉัน ฉันสร้างป้ายกำกับทั้งหมดและไม่เลือกตัวควบคุม winform เป็นลำดับแท็บ 0 จากนั้นตัวควบคุมแรกของฉันเป็นลำดับแท็บ 2 จากนั้นเพิ่มลำดับของตัวควบคุมที่เลือกได้ทีละ 1 ดังนั้น 3, 4, 5 และอื่น ๆ ...

ด้วยวิธีนี้เมื่อ Winforms ของฉันเริ่มทำงาน TextBox ตัวแรกจะไม่มีโฟกัส!


0

คุณสามารถทำได้โดยสองวิธี

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

    1. ทำให้มองเห็นได้ซึ่งคุณไม่ต้องการให้ foucus ซึ่งเป็น textbox1
    2. ทำให้รายการที่ 2 มองไม่เห็นและไปที่คุณสมบัติของช่องข้อความนั้นแล้วเลือก

ค่า tabindex เป็น 0 ของ textbox2

  1. และเลือก tabindex ของ textbox1 ถึง 1 ตอนนี้มันจะไม่เน้นที่ textbox1

0

หากสิ่งที่คุณต้องการคือเอฟเฟกต์แสงที่กล่องข้อความไม่มีการเลือกสีน้ำเงินทั่วทั้งเนื้อหาเพียงแค่เลือกไม่มีข้อความ:

textBox_Log.SelectionStart = 0;
textBox_Log.SelectionLength = 0;
textBox_Log.Select();

หลังจากนี้เมื่อเพิ่มเนื้อหาด้วยจะ.Text += "..."ไม่มีการแสดงการเลือกสีน้ำเงิน


0

โปรดลองตั้งค่าTabStopเป็นFalseสำหรับการควบคุมมุมมองของคุณซึ่งไม่ได้เน้น

เช่น:

txtEmpID.TabStop = false;

-1

ในตัวสร้างของฟอร์มหรือ UserControl ถือกล่องข้อความเขียน

SetStyle(ControlStyles.Selectable, false);

หลังจาก InitializeComponent (); ที่มา: https://stackoverflow.com/a/4811938/5750078

ตัวอย่าง:

public partial class Main : UserControl
{

    public Main()
    {
        InitializeComponent();
        SetStyle(ControlStyles.Selectable, false);
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.