如何控制异步文本框事件

时间:2014-12-05 06:53:15

标签: c# winforms event-handling

我有一个文本框,其Leave事件是这样的:

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);
}

我尝试了显而易见的使用全局bool变量并在click事件中将其设置为false并在离开时检查它但它不起作用..我怀疑这与异步有关吗?

其他信息:

我尝试创建一个bool变量needTxtValidation并尝试在按钮点击,文本框按键,按钮mousedown等各个位置将其设置为false,但它没有用。

1 个答案:

答案 0 :(得分: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;
    }
    ...
}

这有效,但我不保证它会一直继续工作。您可能需要解决一些我错过的角落案例或明显的事情。这是一个非常hacky的代码,你最好重新设计逻辑。