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还有一种情况会无效的
if (CanSelect)
bool validatedControlAllowsFocusChange;
bool validate = ValidateActiveControl(out validatedControlAllowsFocusChange);
if (!ValidationCancelled && (validate || validatedControlAllowsFocusChange))
//Paint in raised state...
//
ResetFlagsandPaint();
OnClick(EventArgs.Empty);
仔细看第一行有一个 CanSelect 判断
那么这个判断又是什么呢, 继续往下
// We implement this to allow only AxHost to override canSelectCore, but still
// expose the method publicly
//
get
return CanSelectCore();
好吧继续看 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,结果没有触发按钮,问题出在哪儿?的主要内容,如果未能解决你的问题,请参考以下文章