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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#在form1初始化后,调用了this.button1.PerformClick,结果没有触发按钮,问题出在哪儿?相关的知识,希望对你有一定的参考价值。

InitializeComponent();
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”这种不明其意的操作。代码的可读性更好。


明白了吗?谢谢采纳。

参考技术A 可能是没有绑定事件到按钮,在属性窗口再看下按钮的事件追问

绑定的事件this.button1.Click+=new System.EventHandler(this.button1_Click);

参考技术B PerformClick()的内容贴出来检查一下。 参考技术C 绑定了事件否追问

绑定的事件this.button1.Click+=new System.EventHandler(this.button1_Click);

追答

绑定的事件this.button1.Click+=new System.EventHandler(PerformClick());

参考技术D

还有一种情况会无效的

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 这个时候就不会触发点击效果了

比如按钮样式是不可选 

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

c# 的窗体form的FormBorderStyle属性设为None 运行后怎么不能拖拽呀??

你设置了窗体边框为none,当然拖动不了了,要是想实现点击窗体里面拖动,可以看下这个http://blog.csdn.net/cleopard/article/details/38900691 参考技术A 试着这样做 思路:
1、在鼠标移动到四个边和四个顶点的时候改变鼠标的图标,提示用户进行拖动操作
2、在这些关键点(边、顶点)地方判断用户是否在鼠标左键按下过程中进行了鼠标移动操作
3、在上一步鼠标移动过程中设置窗体位置和大小。
参考技术B 亲自试验了
//调用API
usingSystem.Runtime.InteropServices;
[DllImport("user32.dll")]
publicstaticexternboolReleaseCapture();
[DllImport("user32.dll")]
publicstaticexternboolSendMessage(IntPtr hwnd, intwMsg, intwParam, intlParam);publicconstintWM_SYSCOMMAND = 0x0112;
publicconstintSC_MOVE = 0xF010;publicconstintHTCAPTION = 0x0002;
在空间的_MouseDown中加入如下代码:如:
privatevoidForm1_MouseDown(objectsender, System.Windows.Forms.MouseEventArgs e)ReleaseCapture();SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);本回答被提问者和网友采纳

以上是关于C#在form1初始化后,调用了this.button1.PerformClick,结果没有触发按钮,问题出在哪儿?的主要内容,如果未能解决你的问题,请参考以下文章

C# 先显示窗体,后运行form_load程序

C# form2如何用form1中的数据

showdialog()的窗体点击message的按钮后,窗体也关闭了?

在C#中怎么调用别的窗体的控件属性

c#用toolstripbutton打开子窗体

C#中如何在另一个类中调用Form1窗体控件的方法呢?