解决VS在设计时无法生成窗体设计器的Controls.Add()代码
作者:C/S框架网  发布日期:2011/08/27 10:54:38
解决VS在设计时无法生成窗体设计器的Controls.Add()代码



在写《设计时在窗体设计器文件内生成组件的代码》一文时遇到问题,当第一次拖CSFrameworkComponent组件到窗体上,右键菜单新增一个按钮,这时查看XXX.Designer.cs文件可以看到button1的相关代码,但是在Form代码段内没有看到this.Controls.Add(button1); 没有这行代码后果很严重!!! 意味着下次打开窗体按钮组件不会在窗体上呈现!


《设计时在窗体设计器文件内生成组件的代码》
http://www.csframework.com/archive/2/arc-2-20110826-1804.htm


摸着石头过河是痛苦的,只能求助google, 哎,终于在codeproject找到一文里面有相关介绍:
http://www.codeproject.com/KB/cs/collcontrolsrichdes.aspx


如果要生成Controls.Add代码,必须使用IComponentChangeService组件改变服务通知主窗体正在更改组件。

代码如下:

C# Code:

c.OnComponentChanging(form, null);//通知窗体正在新增控件服务

form.Controls.Add(button);//Form.Controls.Add, 生成持久化代码

c.OnComponentChanged(form, null, null, null);//通知窗体修改服务已完成



完整代码:

C# Code:

private void OnGenerateButtonCode(object sender, EventArgs e)
{
   //
   //在窗体上加入一个Button组件,host.RootComponent=Form
   //
   //取出窗体设计器
   IDesignerHost host = (IDesignerHost)this.GetService(typeof(IDesignerHost));
   IComponentChangeService c = (IComponentChangeService)this.GetService(typeof(IComponentChangeService));
   
   Form form = (Form)host.RootComponent;//RootComponent: 根组件,指Form
   DesignerTransaction tran = host.CreateTransaction();//创建事务
   
   //创建按钮组件
   Button button = (Button)host.CreateComponent(typeof(Button));
   button.Text = "www.CSFramework.com";
   button.Location = new Point(50, 50);
   button.Size = new Size(150, 30);
   
   c.OnComponentChanging(form, null);//通知窗体正在新增控件服务
   form.Controls.Add(button);//Form.Controls.Add, 生成持久化代码
   c.OnComponentChanged(form, null, null, null);//通知窗体修改服务已完成
   
   tran.Commit();//提交事务
   
   MessageBox.Show("已生成" button.Name "的代码!请打开frmTester.Designer.cs文件查看.");
}


//来源:C/S框架网(www.csframework.com) QQ:1980854898





 



C/S框架网|原创精神.创造价值.打造精品


扫一扫加作者微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务


上一篇 下一篇