C#在form1初始化后,调用了this.button1.PerformClick,结果没有触发按钮,问题出在哪儿?
this.button1.PerformClick();//没有触发按钮
this.button1_Click(null,null);//可以触发按钮
问题出在什么地方? 展开
您好。先来回答您的问题。
我们知道,按钮点击后,会触发一个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”这种不明其意的操作。代码的可读性更好。
明白了吗?谢谢采纳。
绑定的事件this.button1.Click+=new System.EventHandler(this.button1_Click);
2013-11-05
绑定的事件this.button1.Click+=new System.EventHandler(this.button1_Click);
绑定的事件this.button1.Click+=new System.EventHandler(PerformClick());
还有一种情况会无效的
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 这个时候就不会触发点击效果了
比如按钮样式是不可选
按钮本身被禁用, 或不可见, 或按钮的父控件被禁用或不可见 等等