如何控制异步文本框事件



我有一个文本框,其中的 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% 的时间我需要这个事件像这样工作。

但是我只需要在特定按钮单击"不"时触发它。

按钮点击:

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

我尝试使用全局布尔变量并在单击事件中将其设置为 false 并在离开时检查它,但它不起作用。我怀疑这与异步有关?

附加信息:

我尝试创建一个布尔变量needTxtValidation并尝试在按钮单击、文本框按键、按钮鼠标向下等各个地方将其设置为 false,但它不起作用。

好吧,这是我设法找到的肮脏方法。您需要继承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;
    }
    ...
}

这有效,但我不能保证它会一直有效。您可能需要解决一些我错过的极端情况或明显的事情。这是一个非常黑客的代码,你最好重新设计逻辑。

相关内容

  • 没有找到相关文章