C#在form1初始化后,调用了this.button1.PerformClick,结果没有触发按钮,问题出在哪儿?

InitializeComponent();this.button1.PerformClick();//没有触发按钮this.button1_Click(null,nul... InitializeComponent();
this.button1.PerformClick();//没有触发按钮
this.button1_Click(null,null);//可以触发按钮

问题出在什么地方?
展开
 我来答
fujie724
2013-11-05 · TA获得超过1187个赞
知道小有建树答主
回答量:154
采纳率:100%
帮助的人:275万
展开全部

您好。先来回答您的问题。


我们知道,按钮点击后,会触发一个click事件。

当你将事件关联到一个函数的时候,程序就会执行你想做的事。


比如。界面上有个button1。它的click事件,关联到了button_Click()函数。

这个函数本身的名字是无所谓的,你也可以让它叫做funTest()

然后在将click事件关联的时候改成这个名字

this.button1.Click += new System.EventHandler(this.funTest);


所以,我们回头来看问题里的两种方式。


1、PerformClick()这种方式,是模拟你点击了button1。将点击这个动作传递到按钮。

按照道理,此时应该触发button1_Click(),然后执行里面的语句。

为什么没反应呢?因为你的这句代码写在了窗体的构造函数里。


即使已经执行完毕InitializeComponent(),完成了初始化。但此时,整个窗口并没有被show出来。

所有的定义和属性都还保存在内存之中,窗口没有被生成图形,生成控件图像,因为没有被show出来。所以此时对按钮进行点击是没有作用的。时机太早了。


2、button1_Click(null,null)而这种方式,属于你强行调用了本来应该由按钮触发的事件函数。

你跳过了按钮click触发的这一层,就相当于你调用普通的一个函数一样。所以他当然能够被执行。

但是这种方式并不被推荐,因为原本事件函数中应该正常的接收到sender和e两个参数。这样的代码容易产生空引用错误的隐患。

至少也应该写成 button1_Click(button1,EventArgs.Empty)


那如果要用PerformClick(),在什么时机下用才能有效果呢?


比如:

        protected override void OnLoad(EventArgs e)
        {            
            base.OnLoad(e);
            button1.PerformClick();
        }

你只需要写在OnLoad里,就可以有效果。

因为此时窗口已经接收到Show。


================================题外话==================================


楼主,我看到你的问题,意识到你可能犯了一个新手容易犯的误解。

我猜想,大概是你希望窗体打开的时候,也顺便做一次按钮点击事件里的事。


对于这个问题,一般的解决思路是,将要做的事重构成一个专门的函数进行调用。比如:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            ShowName();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ShowName();
        }

        private static void ShowName()
        {
            string name = "小明";
            MessageBox.Show("我是" + name + "!");
        }
    }
}

假设ShowName()这个函数就是你要做的事情。

那么你只需要把它独立出来。

在构造函数末尾,和按钮Click事件函数里都调用它,就可以解决了。


而且,这样一来,当别人阅读代码,阅读到

        public Form1()
        {
            InitializeComponent();
            ShowName();
        }

这里的时候,他看到这个函数名,他也能够理解你想做的是“显示名字”

而不是“点击按钮1”这种不明其意的操作。代码的可读性更好。


明白了吗?谢谢采纳。

问心剑阁238
2013-11-05
知道答主
回答量:23
采纳率:0%
帮助的人:10.2万
展开全部
可能是没有绑定事件到按钮,在属性窗口再看下按钮的事件
追问
绑定的事件this.button1.Click+=new System.EventHandler(this.button1_Click);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
阳光的雷咩咩
2013-11-05 · TA获得超过1.4万个赞
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:7785万
展开全部
PerformClick()的内容贴出来检查一下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-11-05
展开全部
绑定了事件否
追问
绑定的事件this.button1.Click+=new System.EventHandler(this.button1_Click);
追答
绑定的事件this.button1.Click+=new System.EventHandler(PerformClick());
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
冰麟轻武
2018-04-21 · TA获得超过603个赞
知道小有建树答主
回答量:360
采纳率:0%
帮助的人:290万
展开全部

还有一种情况会无效的

public void PerformClick() {
if (CanSelect) {
bool validatedControlAllowsFocusChange;
bool validate = ValidateActiveControl(out validatedControlAllowsFocusChange);
if (!ValidationCancelled && (validate || validatedControlAllowsFocusChange))
{
//Paint in raised state...
//
ResetFlagsandPaint();
OnClick(EventArgs.Empty);
}
}
}

仔细看第一行有一个 CanSelect 判断
那么这个判断又是什么呢, 继续往下

public bool CanSelect {
// We implement this to allow only AxHost to override canSelectCore, but still
// expose the method publicly
//
get {
return CanSelectCore();
}
}

好吧继续看 CanSelectCore

internal virtual bool CanSelectCore() {
if ((controlStyle & ControlStyles.Selectable) != ControlStyles.Selectable) {
return false;
}

for (Control ctl = this; ctl != null; ctl = ctl.parent) {
if (!ctl.Enabled || !ctl.Visible) {
return false;
}
}

return true;
}

再看就会发现 很多情况下这个会返回false 这个时候就不会触发点击效果了

比如按钮样式是不可选 

按钮本身被禁用, 或不可见, 或按钮的父控件被禁用或不可见 等等

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式