winform窗体获得焦点事件

stiff_neck 2013-07-02 04:02:51
在窗体A获得焦点时,判断窗体B的必须项,如果为空弹出msg,返回画面B
代码如下

public Boolean bolActive = true;
private void formA_Activated(object sender, EventArgs e)
{
if (bolActive)
{
if (string.IsNullOrEmpty(formB.txt1.Text))
{
bolActive = false;
MessageBox.Show("123");
frmB.BringToFront();
}
}
}

问题是如果鼠标点击窗体A的标题栏,formA_Activated事件会运行两次,弹出两次msg,而点击窗体A的客户区就没问题,求教为什么?有什么好的解决办法?
...全文
1025 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Self_Impro_Xiang 2013-07-03
  • 打赏
  • 举报
回复
Form1.cs: public Boolean bolActive = true; Form3 frm3 = new Form3(); private void Form1_Activated(object sender, EventArgs e) { if (string.IsNullOrEmpty(frm3.getValue())) { if (bolActive) { bolActive = false; MessageBox.Show("123"); frm3.Show(); } } else lbl1.Text = frm3.getValue(); } Form3.cs: private string str; public string getValue() { return str; } private void button1_Click(object sender, EventArgs e) { str = this.txtBox1.Text.ToString(); MessageBox.Show(str); }
stiff_neck 2013-07-03
  • 打赏
  • 举报
回复
引用 14 楼 aia009 的回复:
Form1.cs: public Boolean bolActive = true; Form3 frm3 = new Form3(); private void Form1_Activated(object sender, EventArgs e) { if (string.IsNullOrEmpty(frm3.getValue())) { if (bolActive) { bolActive = false; MessageBox.Show("123"); frm3.Show(); } } else lbl1.Text = frm3.getValue(); } Form3.cs: private string str; public string getValue() { return str; } private void button1_Click(object sender, EventArgs e) { str = this.txtBox1.Text.ToString(); MessageBox.Show(str); }
tks,不过有点偏差,我的问题是AB两个画面都已经打开的情况下,焦点从A画面转换到B画面时,如果点击的是B画面的标题栏,Form1_Activated会执行两次,也就是弹出了两次msg
hn_tzy 2013-07-02
  • 打赏
  • 举报
回复
试试Form的Enter事件
stiff_neck 2013-07-02
  • 打赏
  • 举报
回复
楼上的意思我懂了,实际上窗体加载的时候我做了判断,只是这里没写出来,不好意思 现在的情况是两个窗体都已激活,当焦点从窗体B转换到窗体A时,出现的问题
Regan-lin 2013-07-02
  • 打赏
  • 举报
回复
引用 10 楼 stiff_neck 的回复:
[quote=引用 9 楼 u011130289 的回复:] [quote=引用 8 楼 stiff_neck 的回复:] [quote=引用 7 楼 u011130289 的回复:] 你这个事件是每当窗体被激活是发生的,你连续点当然一直激活会一直弹出你下面的mesg,你加载窗体一次点击text又一次不就两次了···
不明觉厉。。[/quote] 什么意思,语文老师水平有限没教太多就被炒了![/quote] 扯这些就没意思了,说点实在的,我都没看懂。[/quote] 意思是窗体加载就已经激活窗体,就已经执行了一次 private void formA_Activated(object sender, EventArgs e) { if (bolActive) { if (string.IsNullOrEmpty(formB.txt1.Text)) { bolActive = false; MessageBox.Show("123"); formB.BringToFront(); bolActive = true; } } 因为你这个判断string.IsNullOrEmpty(formB.txt1.Text)是成立的,而你再点一次当然又在激活了,你自己判断都这样判断,你要改改这个 if (string.IsNullOrEmpty(formB.txt1.Text))判断就可以解决你的问题了吧,不知道这样说行不?
stiff_neck 2013-07-02
  • 打赏
  • 举报
回复
引用 9 楼 u011130289 的回复:
[quote=引用 8 楼 stiff_neck 的回复:] [quote=引用 7 楼 u011130289 的回复:] 你这个事件是每当窗体被激活是发生的,你连续点当然一直激活会一直弹出你下面的mesg,你加载窗体一次点击text又一次不就两次了···
不明觉厉。。[/quote] 什么意思,语文老师水平有限没教太多就被炒了![/quote] 扯这些就没意思了,说点实在的,我都没看懂。
Regan-lin 2013-07-02
  • 打赏
  • 举报
回复
引用 8 楼 stiff_neck 的回复:
[quote=引用 7 楼 u011130289 的回复:] 你这个事件是每当窗体被激活是发生的,你连续点当然一直激活会一直弹出你下面的mesg,你加载窗体一次点击text又一次不就两次了···
不明觉厉。。[/quote] 什么意思,语文老师水平有限没教太多就被炒了!
stiff_neck 2013-07-02
  • 打赏
  • 举报
回复
引用 7 楼 u011130289 的回复:
你这个事件是每当窗体被激活是发生的,你连续点当然一直激活会一直弹出你下面的mesg,你加载窗体一次点击text又一次不就两次了···
不明觉厉。。
Regan-lin 2013-07-02
  • 打赏
  • 举报
回复
你这个事件是每当窗体被激活是发生的,你连续点当然一直激活会一直弹出你下面的mesg,你加载窗体一次点击text又一次不就两次了···
stiff_neck 2013-07-02
  • 打赏
  • 举报
回复
引用 5 楼 FoxDave 的回复:
你直接让B窗体的必填项都填完之后再返回A不就好了吗?
设计问题,不能用button控制,就只能这样了
Justin-Liu 2013-07-02
  • 打赏
  • 举报
回复
你直接让B窗体的必填项都填完之后再返回A不就好了吗?
吴青峰 2013-07-02
  • 打赏
  • 举报
回复
如果真是这样,你注销和再次注册formA_Activated事件,来弥补这个缺陷。 或者你把代码部分部分的注释掉,一步一步的再调试,看看是那部分的代码出了问题。
stiff_neck 2013-07-02
  • 打赏
  • 举报
回复
刚才疏忽了,实际的代码是这样

        public Boolean bolActive = true;
        private void formA_Activated(object sender, EventArgs e)
        {
            if (bolActive)
            {
                if (string.IsNullOrEmpty(formB.txt1.Text))
                {
                    bolActive = false;
                    MessageBox.Show("123");
                    formB.BringToFront();
                    bolActive = true;
                }
            }
        }
ps:A,B两个窗体都未关闭
stiff_neck 2013-07-02
  • 打赏
  • 举报
回复
引用 1 楼 qingfeng_wu 的回复:
先把public Boolean bolActive = false; 设置为false,然后根据如下代码: foreach (DockContent form in formsDockPanel.Contents) { if (form is formB) { form.Activate(); bolActive = true; return; } } 将public Boolean bolActive = true;设置为true; formsDockPanel这个是个容器Panel,不用解释了吧! 再试试看看。
不好意思,bolActive = true 的代码我也设置了,这不是重点,现在如果点击窗体的客户区是可以正常实现必须项的check,并且弹出msg,问题是如果点击的是窗体的标题栏,就会实现两次formA_Activated事件,不是messagebox引起的,所以设置bolActive解决不了,可能是windows消息机制导致的,求解?
吴青峰 2013-07-02
  • 打赏
  • 举报
回复
先把public Boolean bolActive = false; 设置为false,然后根据如下代码: foreach (DockContent form in formsDockPanel.Contents) { if (form is formB) { form.Activate(); bolActive = true; return; } } 将public Boolean bolActive = true;设置为true; formsDockPanel这个是个容器Panel,不用解释了吧! 再试试看看。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧