كيف تحدد ما إذا كان Textchanged قد تم تشغيله بواسطة لوحة المفاتيح في C#؟
-
26-09-2019 - |
سؤال
لدي طريقة
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" من القائمة ، فأنت تقوم بتعيين مربع النص على "الاسم التجريبي". سيؤدي ذلك إلى تحديد مربع القائمة "الاسم التجريبي". لذلك يجب الاحتفاظ بالاختيار. عليك فقط كسر العودة.