比如一系列输入后,最后有个“确认”按钮,按下后程序检查输入的完整性如果输入不完整,我用MessageBox.Show来弹出一个对话框,只有一个OK键,提示用户信息输入错误,但这时候用户还能点击前面那个窗口的“确认”按钮,这会导致程序错误。怎样才能让客户非得按下对话框的OK键,否则不能按其他按钮?

解决方案 »

  1.   

    1.在确认按钮事件中检查完整性
    或者
    1.不要用MessageBox弹出对话框,自己设计form弹出,判断form的返回值。
      

  2.   

    我记得messageBox的show的形式就是类似于窗口那个ShowDialog的方式吧,本来就是不点击确认就不能点击触发他的窗体的控件的啊,你的确定按钮和你触发messageBox的判断的控件难道不是在一个窗体中么?
    实在不行就是向上边说的,做一个form,里边加上对外可见的属性,弹出的时候赋值(showDialog),根据属性的值判断下一步骤。
      

  3.   

    ShowDialog好像要自己来定义一个form的。很不方便我现在的想法是用show前先把this.enabled=false, 然后messageBox.Show,完了后再this.enabled=true.但我是在线程里,所以不能跨线程访问控件
    于是我用了MethodInvoker但MethodInvoker又不能传递参数!!! 怎么办?这么简单的一个功能,怎么这么麻烦
      

  4.   

     跨线程没有关系,调用control.Invoke(Delegate method,Object[] args),或调用BeginInvoke(...) 
    object参数类型随便你传什么
      

  5.   

    我猜想楼主是不是用的多线程?
    两个线程里面,一个线程显示了窗体,另一个线程里面弹出了一个MsgBox,这样会导致楼主说的问题。解决的方法就是用Invoke来显示MsgBox。
      

  6.   

    不管是多线程还是单线程,将信息统一写个方法来处理:
    当上一个信息没有处理完,那么下个信息不处理~~~具体思路:
    (本人没有调试,LZ 自己调试一下,思路是这样的~~)
    bool b = false;private void MessageShow(string message)
            {
                if (b == true)
                    return;
                b = true;
                if (MessageBox.Show(message, "错误", MessageBoxButtons.YesNo) != DialogResult.None)
                    b = false;
            }
      

  7.   

    谢谢大家的帮助,aimeast说的对,谢谢。我的程序简化一下如下
    private void button1_Click(object sender, EventArgs e)
    {
        if (textBox1.Text.Trim() == "")
        {
             MessageBox.Show("填写保存的文件名", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
             return;
        }
        backgroundWorker1.RunWorkerAsync(RPI);
    }
    private void backgroundWorker1_DoWork_1(object sender, DoWorkEventArgs e)
    {
         roadProcessInfo RPI = e.Argument as roadProcessInfo;
             if (MessageBox.Show("asdfasdfasdf", "错误", MessageBoxButtons.YesNo) != DialogResult.None)
             {
    //
     }
    }
    在button1_Click里的那个MessageBox.Show没问题,除非按OK,否则不能继续;但在线程中的那个不行,提示框和主Form好像互相独立,即使不按OK,也可以继续Form的操作。
    感谢whslovexyp、windxx、netcoder、jhkemail、stan0714,为我提供了不少建议和例子,我自己去好好学习消化一下。