2014-12-05 2 views
0

У меня есть текстовое поле, где его Отпуска событие, как это:Как контролировать асинхронной текстовое поле событие

private async void TxtLotTextLeave(object sender, EventArgs e) 
{ 
    if (!isChecked) 
    { 
     isChecked = true; 
     var mylength = BarcodeUtil.LotStripZeroes(txtLot.Text.Trim()).Length; 
     var strippedLot = BarcodeUtil.LotStripZeroes(txtLot.Text.Trim()); 
     if (mylength > 0) 
     { 
      if (mylength.Between(16, 18) && 
       (strippedLot.StartsWith(AppState.LotOldStandardDigits) || 
       strippedLot.StartsWith(AppState.LotStandardDigits))) 
      { 
       await GetLotData(); 
      } 
      else 
      { 
       ShowAppMessage(AppMessages["WrongLot"], 0, Color.Black, Color.BlanchedAlmond); 
       txtLot.Text = ""; 
       LotFocus(true); 
      } 
     } 
    } 
} 

99% времени, мне нужно это событие, чтобы работать, как это.

НО, но мне нужно только, когда конкретная кнопка нажимает NOT, чтобы ее не запускать.

нажатия кнопок:

private void BtnClearClick(object sender, EventArgs e) 
{ 
    ClearForm(); 
    LotFocus(true); 
} 

Я попытался очевидным использовать глобальную переменную Ьоо и установить его на ложь в случае щелчка и проверить его в отпуске, но оно не work..I подозревают, что должен сделать с асинхронным?

Дополнительная информация:

Что я пытался это создать переменную Ьоо needTxtValidation и попытаться установить его на ложь в различных местах, как нажатие кнопки, текстовое поле нажатием клавиши, кнопка MouseDown, но это не работало.

+1

Опубликовать свою попытку с булевым флагом, который должен работать. И AFAIK нет чистого способа сделать то, что вы пытаетесь достичь. Кроме того, какая структура пользовательского интерфейса? Winforms или ..? –

+0

Я мог бы использовать грязный тоже ... – e4rthdog

ответ

1

Хорошо, вот грязный путь, который мне удалось найти. Вам необходимо наследовать Button, переопределить WndProc и выставить булевое имя, которое говорит, обрабатывает ли он MouseDown.

class ButtonEx : Button 
{ 
    public bool IsInMouseDown { get; set; } 
    protected override void WndProc(ref Message m) 
    { 
     const int WM_LBUTTONDOWN = 0x0201; 
     try 
     { 
      if (m.Msg == WM_LBUTTONDOWN) 
       IsInMouseDown = true; 
      base.WndProc(ref m); 
     } 
     finally //Make sure we set the flag to false whatever happens. 
     { 
      if (m.Msg == WM_LBUTTONDOWN)//Required to fight with reentracy 
       IsInMouseDown = false; 
     } 
    } 
} 

Тогда в вашем методе отпуска

private async void TxtLotTextLeave(object sender, EventArgs e) 
{ 
    if (yourButton.IsInMouseDown) 
    { 
     Console.WriteLine("Ignoring Leave"); 
     return; 
    } 
    ... 
} 

Это работает, но я не гарантирую, что это будет продолжать работать всегда. Возможно, вам придется обратиться к некоторым угловым делам или очевидным вещам, которые я пропустил. Это очень хакерский код, вам лучше перепроектировать логику.

Смежные вопросы