c# - 使用 EnvDTE 创建表单后不会保存

标签 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) 在尝试查看我的 funky 按钮和我手动添加的按钮的区别时,我尝试了一些我以前没有使用编程创建的表单的东西:实例化并运行它。

这是我的做法:

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

它在屏幕上闪烁(显然我的两个按钮都没有),然后执行结束。即使我尝试在它的 Form_load 上做一些事情,它也会被执行,然后窗体闪烁,然后执行结束(窗体关闭,调试结束),就像我调用了 Close() 方法一样。

那么另一个问题是:我在添加表单时是否跳过了一个步骤,还是我根本没有正确创建它?

最佳答案

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

我不知道该怎么做,从未尝试过自己,找到了这个,希望它有帮助:

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

关于c# - 使用 EnvDTE 创建表单后不会保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5194336/

相关文章:

c# - asp.net 将行从一个数据表复制到另一个

visual-studio-2010 - 每次构建前清除 "Error List"警告的 Visual Studio 2010 插件/代码

c++ - OpenGL:未定义 VBO 函数

c# - Visual Studio 2010 未在工具箱中显示打印选项卡的 Crystal Report Viewer?

c# - 无法使用 VS Debugger Interop 执行语句

c++ - 如何从命令行 C++ VSPackage 获取 DTE 对象

c# - 插入符号停止 TextBox WPF 中的闪烁事件

c# - 将有条件构建的 SQL where 子句转换为 LINQ

visual-studio-2010 - 如何以编程方式创建空的 Visual C++ 项目?

c# - IAsyncEnumerable<T> 与 IEnumerable<Task<T>> 之间有什么区别?