كيف تحدد ما إذا كان Textchanged قد تم تشغيله بواسطة لوحة المفاتيح في C#؟

StackOverflow https://stackoverflow.com/questions/3631026

سؤال

لدي طريقة

private void textBoxPilot_TextChanged(object sender, TextChangedEventArgs e)
{ ... }

حيث يأخذ مربع النص المعني سلسلة بحث من المستخدم ويمثال أ ListBox مع النتائج على كل ضغط المفاتيح.

بعد ذلك ، عندما يتم اختيار عنصر من ListBox, ، أود أن ينعكس الخيار في نفس الشيء Textbox. ومع ذلك ، لا أريد تشغيل آلية البحث ، والتي من شأنها أن تسبب Listbox لنسيان اختيارها.

كيف يمكنني تحديد ما إذا كان TextChanged تم تشغيل الحدث من قبل المستخدم (عبر لوحة المفاتيح أو ربما نسخ/لصق) أو بطريقة أخرى باستخدام textBoxPilot.Text = "Pilot name";?

شكرًا.

هل كانت مفيدة؟

المحلول

قليلا من الاختراق ، ولكن ....

public class MyForm : Form
{
    private bool _ignoreTextChanged;

    private void listView1_SelectionChanged( object sender, EventArgs e )
    {
       _ingnoreTextChanged = true;
       textBoxPilot.Text = listView1.SelectedValue.ToString(); // or whatever
    }

    private void textBoxPilot_TextChanged( object sender, TextChangedEventArgs e )
    {
       if( _ignoreTextChanged )
       {
           _ignoreTextChanged = false;
           return;
       }

       // Do what you would normally do.
    }
}

نصائح أخرى

لن يطلق السيطرة المعوقة حدثًا. لذا ، فإن خيارين إما هو تعطيل تحديث النص دائمًا ثم إعادة تمكينه أو إنشاء غلاف فئة مشتق (باستخدام هذه الطريقة ، لا يزال بإمكانك القيام بربط البيانات)

class myClass : TextBox
{
    public virtual string TextWithoutEvents
    {
        get
        {

            return base.Text;
        }
        set
        {
            bool oldState = Enabled;
            Enabled = false;
            base.Text = value;
            Enabled = oldState;
        }
    }
}

إذا قام المستخدم بتحديد "Name Pilot" من القائمة ، فأنت تقوم بتعيين مربع النص على "الاسم التجريبي". سيؤدي ذلك إلى تحديد مربع القائمة "الاسم التجريبي". لذلك يجب الاحتفاظ بالاختيار. عليك فقط كسر العودة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top