使用EnvDTE创建表单后,表单将无法保存

时间:2011-03-04 13:29:55

标签: c# visual-studio-2010 envdte

我创建了一个Visual Studio加载项,它在已打开的解决方案中将表单添加到现有项目中。

这就是我创建表单的方式:

string templatePath = sol.GetProjectItemTemplate("Form.zip", "csproj");
//sol is an EnvDTE80.Solution2

proj.ProjectItems.AddFromTemplate(templatePath, formName);
//proj is an EnvDTE.Project

之后我可以成功获取对添加的表单的ProjectItem的引用,然后我可以获得对System.Windows.Forms.Form的引用,并通过此引用我可以向表单添加一个按钮,如下所示:

Button btn = new Button();

btn.Text = "my funky button";
btn.Name = "newButton";
btn.Size = new Size(150, 23);
btn.Location = new Point(30, 30);

frmNewForm.Controls.Add(btn);
//frmNewForm is a System.Windows.Forms.Form

然后按钮成功添加到表单中:

enter image description here

然而,当我尝试保存此表单时,它只是不会保存。我单击Visual Studio的[保存]按钮,它不会变为灰色。即使单击[全部保存],也不会保存表单。然后我关闭Visual Studio,重新打开它,然后打开我用加载项添加新表单的项目,而新按钮就不存在了。只是一个空的表格。

我甚至尝试通过以下代码以编程方式保存项目和解决方案:

itemForm.Save(itemForm.Name);
//itemFrom is an EnvDTE.ProjectItem

proj.Save(proj.FullName);
//proj is an EnvDTE.Project

我认为这是因为我用来测试加载项的Visual Studio实例是一个调试实例,在我运行加载项后立即打开。但我尝试使用已安装的加载项(运行后自动保留),问题仍然存在。


更新
我刚注意到两件事:

1)该按钮仅出现在表单的设计中,而不是其他地方。它甚至不让我选择它来看它的属性。

它的名称不出现在Intellisense,对象列表中,甚至出现在表单的设计文档中。

作为测试,我手动添加了一个按钮,我可以选择并与之交互:

enter image description here

我能从中得到的是我没有正确添加按钮。

然后关于按钮的新问题将是:如何在设计时以我能与之交互的方式向通过EnvDTE创建的表单添加新按钮?

2)在尝试查看与我的时髦按钮和手动添加按钮的不同之处时,我尝试了以前没有使用过编程创建的表单的方法:实例化并运行它。

以下是我的表现:

MyFunkyForm frm = new MyFunkyForm ();
frm.Show();

它在屏幕上闪烁(显然没有我的两个按钮),执行结束。即使我尝试在Form_load上执行某些操作,它也会执行,然后表单闪烁,执行结束(表单关闭,调试结束),就像我调用了Close()方法一样。

然后另外一个问题是:我在添加表单时是否跳过了一步,或者我根本没有正确创建它?

1 个答案:

答案 0 :(得分:1)

您正在向c#项目添加表单,我认为您不应该像您一样单独实例化表单,但如果您想看到它,则应该执行该应用程序。

我不知道该怎么做,从未尝试过自己,发现了这个,希望它有用:

http://www.mztools.com/articles/2006/mz2006016.aspx