【问题标题】:Disable textbox while process running in button click event在按钮单击事件中运行进程时禁用文本框
【发布时间】:2017-11-07 08:41:45
【问题描述】:

我想在按钮单击事件中运行进程时禁用textbox。 我注意到textbox 在事件发生后被禁用,而groupbox 中的radiobuttons 立即被禁用。 该按钮应该在开始时被禁用,并且根据某些方法的返回值,它应该重新启用或保持禁用状态。

这是我当前的代码:

private async void BtnConfirmClick(object sender, EventArgs e)
{
    try
    {
        textbox.Enabled = false;
        groupbox.Enabled = false;
        await somemethod()
         ... 
    }
}

在按钮事件中更改文本时,我遇到了同样的问题。

【问题讨论】:

  • 这取决于 somemethod 在 UI 线程上同步执行的操作。
  • 有几个“异步”方法,一些更改配置文件,一些导入证书,...我希望在按钮单击事件开始时禁用文本框,就像组框的行为一样。跨度>
  • 它应该被禁用 - 如果你阻止 UI 线程,只有视觉外观不会反映这一点。您可以通过在textbox.Enabled = false; 之后添加textbox.Update(); 来查看。
  • 是的,当然,UI 线程...不,它有效。非常感谢。我可以将此评论标记为答案吗?

标签: c# button textbox


【解决方案1】:
private async void BtnConfirm_Click(object sender, EventArgs e)
{
    try
    {
        // you dont want user to click twice
        BtnConfirm.Enabled = false;

        // ConfigureAwait(false) configures the task so it doesn't need to block caller thread
        await Somemethod().ConfigureAwait(false);
    }

    finally
    {
        // BeginInvoke prevents thread access exceptions
        BeginInvoke((Action)delegate
        {
            BtnConfirm.Enabled = true;
        });
    }
}

private async Task Somemethod()
{
    await Task.Delay(TimeSpan.FromSeconds(5));
}

就是这样。确保在 ConfigureAwait(false) 之后在 BeginInvoke 中进行任何 UI 操作,因为任务可能会在另一个线程上结束。 希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    相关资源
    最近更新 更多