当前位置:编程学习 > C#/ASP.NET >>

C# Winform 如何阻止事件继续,急.急.急

我有一个页面上做资料编辑的,如果用户编辑资料后未保存,就点击其他功能按钮(如Button2~Button99),便提示是否保存的对话框,如果用户选择"取消",则应继续停留在该界面.

我的问题是,当用户点击Button2~Button99中的某一个时,如果用户选择了"取消",我如何能不执行Button2~Button99的事件呢?
--------------------编程问答-------------------- return; --------------------编程问答-------------------- javascript:return confirm('您确实要删除此项吗?'); --------------------编程问答--------------------
引用 2 楼 fantasy_song 的回复:
javascript:return confirm('您确实要删除此项吗?');


我这是winform --------------------编程问答--------------------
引用 1 楼 hch126163 的回复:
return;


在哪里写return,我不可能在Button2~Button99的处理事件中,都对这个资料编辑窗体结果做一个判断. --------------------编程问答-------------------- 不知道可不可以用Form自身的Validating事件来阻止,但Form的Validating事件总是不触发,怎样能触发这个事件呢? --------------------编程问答-------------------- 我感觉不是用 Form 的事件吧,另外你试试看 Deactive 事件,这个东西“设计器”里面没有,你要手写 += ,试试行么
--------------------编程问答--------------------
                if (MessageBox.Show("确定要打印吗?", "询问", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {}
--------------------编程问答--------------------
引用 7 楼 cxs861226 的回复:
C# code

                if (MessageBox.Show("确定要打印吗?", "询问", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {}


我也是这个方法
DialogResult dlgResult = MessageBox.Show("您确定要继续吗?", "确认信息", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); ;
                if (dlgResult == DialogResult.OK)
                {
                     //继续
                }
                else
                {
                     //不继续
                   } --------------------编程问答--------------------

                if (MessageBox.Show("确定要打印吗?", "询问", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
//继续
}else
{
//不继续
}

--------------------编程问答-------------------- 你怎么调用的 Button2~Button99 的,在调用之前return。 --------------------编程问答-------------------- return --------------------编程问答-------------------- 哦认为在对应的事件处理方法中个对应事件的 e参数,如这个
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;

        }

搞这个e的一些属性,应该可以完成你的要求。

哦的思路是这样的~~

欢迎讨论!!!! --------------------编程问答--------------------
引用 10 楼 fangxinggood 的回复:
你怎么调用的 Button2~Button99 的,在调用之前return。


return并不能阻止其它button的事件继续 --------------------编程问答-------------------- 哦,明白你的意思。你想统一处理,还不想在每个Button里加代码。

--------------------编程问答--------------------
引用 13 楼 xiaoxia201314 的回复:
引用 10 楼 fangxinggood 的回复:

你怎么调用的 Button2~Button99 的,在调用之前return。


return并不能阻止其它button的事件继续

啥意思?每个button里都应该有return。代码怎么写的贴出来看看。 --------------------编程问答--------------------
引用 13 楼 xiaoxia201314 的回复:
引用 10 楼 fangxinggood 的回复:

你怎么调用的 Button2~Button99 的,在调用之前return。


return并不能阻止其它button的事件继续

楼主还有问题吗? --------------------编程问答-------------------- 简单得说,我希望在离开当前窗体(其实只是隐藏)前,弹出一个选择对话框:是/否/取消,如果选择"是" 或者 "否" ,则执行相关保存或不保存操作,然后继续执行后面所点击的按钮的事件,如果选择"取消",要求停留在当前窗体,也不执行后面点击的按钮的事件. --------------------编程问答-------------------- 有取消,全局变量为false,其他的判断是flase,return掉 --------------------编程问答-------------------- 你是怎么离开当前窗体的,如果取消了,就把离开当前窗体的代码不执行就好了 --------------------编程问答--------------------
引用 14 楼 fangxinggood 的回复:
哦,明白你的意思。你想统一处理,还不想在每个Button里加代码。


是的. --------------------编程问答--------------------
引用 19 楼 jbnbear 的回复:
你是怎么离开当前窗体的,如果取消了,就把离开当前窗体的代码不执行就好了


用Validating事件的e.Cancel=true,确实可以实现停留在当前窗体的效果.但是如果选择了"是"或者"否",它似乎不知道后续事件是什么了,执行完Validating后,就不执行了.除非再次点击另一个Button --------------------编程问答-------------------- 对按钮事件进行退订,以后再进行订阅。
如this.Button1.Click -= new System.EventHandler(this.Button1_Click);
--------------------编程问答-------------------- 贴上一小段代码吧:

 private void Form2_Validating(object sender, CancelEventArgs e)
 {
       //下面这句话很关键,如果无此代码,点击Button3,button3_Click会顺利执行,但是如果有此代码,button3_Click不会执行,为什么????
       DialogResult result = MessageBox.Show("Test", "Info", MessageBoxButtons.YesNoCancel);
 }

--------------------------------------------------
private void button3_Click(object sender, EventArgs e)
{
       form2.Hide();
       form3.Show();
}


--------------------编程问答-------------------- 好像弹出的对话框,阻断了Form2_Validating和button3_Click之间的连贯性 --------------------编程问答-------------------- 刚做了个小实验,页面上只放一个TextBox和一个Button,写了如下测试代码:

private void textBox1_Validating(object sender, CancelEventArgs e)
        {
            Console.WriteLine("textBox1_Validating");
            MessageBox.Show("textBox1_Validating");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("button1_Click");
        }

如果把光标从TextBox离开,并点击Button,会输出"textBox1_Validating"并弹出"textBox1_Validating"对话框,不会弹出"button1_Click"对话框;

如果注释掉MessageBox.Show("textBox1_Validating"); 执行相同的测试,会输出"textBox1_Validating"并弹出"button1_Click"对话框.

我要的效果是两个对话框都要弹出,有什么办法吗? --------------------编程问答-------------------- 22楼的这样写,按钮就不起作用了,要调用的时候还得加回去 --------------------编程问答-------------------- 可以使用一个变量啊!如果保存了算一个状态,没保存的时候算一个状态,那你现在在点击button2-button99的时候判断下这个变量的状态就可以了啊!不知道能不能满足楼主的要求 --------------------编程问答--------------------
引用 17 楼 xiaoxia201314 的回复:
简单得说,我希望在离开当前窗体(其实只是隐藏)前,弹出一个选择对话框:是/否/取消,如果选择"是" 或者 "否" ,则执行相关保存或不保存操作,然后继续执行后面所点击的按钮的事件,如果选择"取消",要求停留在当前窗体,也不执行后面点击的按钮的事件.

是关闭的时候吧?

private bool isExit = false;
        private void Form_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!isExit)
            {
                DialogResult re = MessageBox.Show("确定要退出本系统吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                if (re == DialogResult.Yes)
                {
                    e.Cancel = true;
                    isExit = true;
                    //隐藏窗体代码
                }
                else
                {
                    e.Cancel = true;
                }
            }
        }

不知道楼主是不是要这样的效果 我猜的~~ --------------------编程问答--------------------
引用 24 楼 xiaoxia201314 的回复:
好像弹出的对话框,阻断了Form2_Validating和button3_Click之间的连贯性


要取消事件就将CancelEventArgs.Cancel设置为true
如果 CausesValidation 属性设置为 false,则将取消 Validating 和 Validated 事件。
如果在 Validating 事件委托中,CancelEventArgs 的 Cancel 属性设置为 true,则正常情况下将在 Validating 事件之后发生的所有事件均被取消。
http://msdn.microsoft.com/zh-cn/library/9ws52wzb(v=VS.80).aspx
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,