订阅事件(+=)的代码在什么地方呢?

procedure123 2010-01-11 10:31:24
平时在winform设计的时候订阅时间,比如订阅按钮单击的事件处理程序(是个方法吧),都是直接在设计器里双击按钮控件,
直接定位到事件处理程序的位置(也就是方法的位置),然后就写处理程序的代码,
今天看到书上说,订阅的代码都是手动编写,写在了构造函数如下:
public MainForm()
{
InitializeComponent();
//这个位置写上了订阅事件的代码.......+=..........

}

那么自动定位事件处理程序并订阅事件的时候,其订阅代码是放在什么地方了呢?我找了下没找到,请指点,



另外:一些用于初始化控件的代码写在构造函数里跟写在窗体载入的方法代码块中有区别吗,如下
private void MainForm_Load(object sender, EventArgs e)
{
LoginForm login = new LoginForm();
login.ShowDialog();
if (LoginForm.result == DialogResult.OK)
{
this.tsbRoomType.Enabled = true;
this.tsbRoomSet.Enabled = true;
this.tsbBusiness.Enabled = true;
this.tsbUserManager.Enabled = true;
this.tsmiBaseSetting.Enabled=true;
this.tsmiManageBusiness.Enabled=true;
this.tsmiUserManage.Enabled = true;
}

类似这些设定控件是否可用的代码如下:(或者事件订阅代码等)
this.tsbBusiness.Enabled = true;
this.tsbUserManager.Enabled = true;
this.tsmiBaseSetting.Enabled=true;
this.tsmiManageBusiness.Enabled=true;
this.tsmiUserManage.Enabled = true;
写在构造函数中可以吗?构造函数应该是实例话对象时候调用的,既然创建了这个窗体的对象了,(在xxxx.Design.cs中实例化的对吧?)那么我想,写在构造函数中跟写在窗体载入方法的代码块中效果一样的吧?请指点了....

...全文
175 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kmddzw77 2010-01-12
  • 打赏
  • 举报
回复
窗体的.Design.cs文件里所有窗体的控件的控件事件的发方法都在这里
rightyeah 2010-01-12
  • 打赏
  • 举报
回复
我觉着vs是太强大了,强大到了把很多细节都隐藏起来,不让设计者知道,以至于还要到这里来问。其实lz可以考虑把vs自动生成的所有文件都细细地阅读一遍,到时候你会发现里面藏了一堆你不知道的东西。
其实我更喜欢用普通文本编辑器来写cs代码,这样可以掌握很多细节,而且也可以不用安装vs那个庞然大物
元宇宙之家 2010-01-12
  • 打赏
  • 举报
回复
简单说:“那另外写在构造函数里跟写在窗体载入的方法里有区别吗?”

Form2 a = new Form2();
a.Show();

第一句发生InitializeComponent();。
第二句发生Form2_Load事件。
wartim 2010-01-12
  • 打赏
  • 举报
回复
我记得当初03的时候InitializeComponent之类的是和自己的代码放在一起的
nixiang12 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sp1234 的回复:]
可能你看的是“古老”的从前,那些作者写的专门针对vs2003的书。或者,是一些不负责任的作者最近几年写,但是是抄袭已经过时的文章的书。

vs随着进化版本,也把许多一成不变的完全可以傻瓜化的东西隐藏起来。以前,由于你从设计视图上设置事件时vs总是自动在源代码视图上产生可见的代码,那么当你修改代码视图时不小心动了代码,然后当你再次调整事件时vs就会出现莫名其妙的故障——因为它不敢轻易删除你手动修改过的注册代码于是也就无法自动确保维护设计视图和代码视图的完整一致。

新的vs版本,将这种设计视图与代码视图自动关联的东西并不显示在从代码视图中,运行时反射再从设计视图的声明中自动产生注册代码,这就简单干净地保证了逻辑一致性。
[/Quote]

sp1234

说的太强大了 UP
  • 打赏
  • 举报
回复
大致有两种,Design.cs是一种,但是当你创建其它类型的界面程序,有时候是反射(因为更准确)。

不论怎样,意思都一样,就是故意让你看不到注册代码,从而不会去破坏它。
  • 打赏
  • 举报
回复
可能你看的是“古老”的从前,那些作者写的专门针对vs2003的书。或者,是一些不负责任的作者最近几年写,但是是抄袭已经过时的文章的书。

vs随着进化版本,也把许多一成不变的完全可以傻瓜化的东西隐藏起来。以前,由于你从设计视图上设置事件时vs总是自动在源代码视图上产生可见的代码,那么当你修改代码视图时不小心动了代码,然后当你再次调整事件时vs就会出现莫名其妙的故障——因为它不敢轻易删除你手动修改过的注册代码于是也就无法自动确保维护设计视图和代码视图的完整一致。

新的vs版本,将这种设计视图与代码视图自动关联的东西并不显示在从代码视图中,运行时反射再从设计视图的声明中自动产生注册代码,这就简单干净地保证了逻辑一致性。
procedure123 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mysword 的回复:]
自动订阅的代码在InitializeComponent()里
[/Quote]


你也没说错,但是归根到底,这个InitializeComponent()方法具体代码还是写在了.Design.cs里了,,谢谢了
procedure123 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 scholarw 的回复:]
C# codeprivatevoid Form1_Load(object sender, EventArgs e)
{
Button btnTest=new Button();
btnTest.Click+=new EventHandler(btnTest_Click);//添加事件处理程序 }//该事件处理程序的实现部分。void btnTest_Click(object sender, EventArgs e)
{
MessageBox.Show("OK,这就是我自己订阅的事件处理程序了。")//throw new Exception("The method or operation is not implemented."); }
懂了没?
[/Quote]

我问的是自动生成的订阅代码位置在何处,不是问如何订阅事件,你这个应该是手写上去的代码,
1楼说的是对的,在.Design.cs文件里,找到了,
那另外写在构造函数里跟写在窗体载入的方法里有区别吗?
scholarw 2010-01-11
  • 打赏
  • 举报
回复

private void Form1_Load(object sender, EventArgs e)
{
Button btnTest = new Button();
btnTest.Click += new EventHandler(btnTest_Click);
//添加事件处理程序
}
//该事件处理程序的实现部分。
void btnTest_Click(object sender, EventArgs e)
{
MessageBox.Show("OK,这就是我自己订阅的事件处理程序了。")
//throw new Exception("The method or operation is not implemented.");
}

懂了没?
sxmny123 2010-01-11
  • 打赏
  • 举报
回复
加这群 交流一下86594082 专门的 C#/.net 群
gnefuil 2010-01-11
  • 打赏
  • 举报
回复
自动订阅的代码在InitializeComponent()里
波导终结者 2010-01-11
  • 打赏
  • 举报
回复
在窗体的.Design.cs文件里

111,120

社区成员

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

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

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