在窗口上动态启用和禁用按钮

本文关键字:按钮 启用 窗口 动态 | 更新日期: 2023-09-27 18:12:35

我正在尝试更新我制作的自定义消息框(从窗口继承)

我试图找到的解决方案是显示消息框禁用按钮,直到条件发生变化,然后再次启用它们以允许程序继续。

我尝试使用"show"方法来代替显示对话框,但是上下文不显示。

请参阅下面我目前的方法:

TPromptWindow w_continue;
bool b_enableBtn = false;
do {
w_continue = new TPromptWindow("Please Wait", "OK", "Cancel", b_enableBtn);
w_continue.ShowDialog();
} 
while ( conditionBoolean );
w_continue.Close(); // I know this doesnt work, but just tryign to show my intentions
b_enableBtn = true;
w_continue = new TPromptWindow("Please Wait", "OK", "Cancel", b_enableBtn);
w_continue.ShowDialog();

我的解决方案的第一个问题是,显示的第一条消息不会自毁,它总是等待用户输入。我试着在do while语句之后调用"Close",但这不会关闭第一个对话框以显示下一个启用按钮的对话框。

有谁能给我一些指导吗?

在窗口上动态启用和禁用按钮

您的对话框将停止代码工作,直到您确认它。我认为对于你想要做的,你需要启动一个线程,用对话框阻塞当前输入,当线程与"工作要做"已经完成关闭对话框或继续。

使用您编写的代码,您不能退出do while循环。

试着看看这个:https://msdn.microsoft.com/en-us/library/aa645740 (v = vs.71) . aspx

我有一个程序,我在后台做一些事情,我用一个进度对话框显示用户应该等待。您可以用任何您想要的对话框替换这个progressdialog。你只需要创建一个表单,让它成为模态,这样它就能阻止输入。这是用locked属性完成的。下面是我如何做的一个例子:

//This is a bool to see if some other process is already running.
if (isProcessRunning)
{
     MessageBox.Show("Currently someone else is working!!!");
     return;
}`var progressDialog = new ProgressDialog();
    //if you don't have a maximum value because you don't know how long it will take you should set indeterminate to true.
    progressDialog.setMaximum(<maximum value>);
    progressDialog.Text = "<what are you doing>";
    var backgroundThread = new Thread(() =>
            {
                isProcessRunning = true;
                //this does not have to be a loop, you can also do other stuff you just have to set you bar to indeterminate then.
                foreach (<do my stuff>)
                {
                    <do stuff here that takes time>
                    progressDialog.IncrementProgress();
                }
                //Close the progressdialog threadsave.
                if (progressDialog.InvokeRequired)
                    progressDialog.BeginInvoke(new Action(() => progressDialog.Close()));
                isProcessRunning = false;
            });
        backgroundThread.Start();
        progressDialog.ShowDialog();

这应该能解决你的问题。如果你需要progressdialog。不要忘记,当您访问您的对话框时,您需要注意它是threadsave。例如,要增加进度,您可以这样做:

public void IncrementProgress()
    {
        if (progressBar1.InvokeRequired)
        {
            progressBar1.BeginInvoke(
                new Action(() =>
                {
                    progressBar1.Value++;
                }
                    ));
        }
        else
        {
            progressBar1.Value++;
        }
    }
我希望我能帮到你。