如何将现有表单添加到新项目?
Posted
技术标签:
【中文标题】如何将现有表单添加到新项目?【英文标题】:How do you add an existing form to a new project? 【发布时间】:2012-05-06 04:42:03 【问题描述】:我从来没有成功地将现有文件中的Form
添加到新项目中。
我在博客上读到,您只添加了 *.cs 文件并且依赖项进来了。好吧,我尝试了这个,文件确实拖动并关联了 *.designer 和 *.resx 文件。 但是,表单图标不显示。相反,该文件看起来像一个普通的 *.cs 文件图像。而且,当我双击文件时,我得到的是后面的代码而不是表单对象。
是否可以添加现有表单并使其正确识别?
【问题讨论】:
看看实际的csproj
文件本身。它是 XML,可以手动编辑 - 查看现有表单在其中的结构并复制新表单的结构。
这一直对我有用,从来没有任何问题,你可能想在控制台项目中添加一个表单吗?似乎很奇怪,它不起作用。
我可以说,在 VS2012 中,唯一对我有用的解决方案是编辑 .csproj
文件并手动创建依赖项(不太难)。否则,.Designer.cs
和 .resx
文件永远不会在解决方案资源管理器中正确显示在表单下方。 @MatthewRadford 的解决方案是唯一对我有用的解决方案。
Copying winforms between projects in Visual Studio的可能重复
通过单击添加现有项目来添加表单。将添加没有表单图标的表单。关闭解决方案并重新打开它。表单将使用默认图标加载。这在 VS 2015 中对我有用。
【参考方案1】:
这是一种不涉及关闭项目并重新打开它的方法:
-
添加 3 个现有的表单文件(cs、Designer.cs 和 resx)。
现在,从项目中排除您刚刚添加的 3 个文件。
打开添加现有项目资源管理器窗口并转到您的项目目录。
选择cs文件并添加。
多田。一切顺利
【讨论】:
太棒了。这是最简单的方法。 有效,但需要注意一点:一次只为一个表单执行第 4 步。如果您为不同的表单选择多个 .cs 文件,则无法正确添加它们。 在 VS 2017 上工作 适用于 VS 2013 在 VS 2019 上工作【参考方案2】:经过更多研究,我发现了问题的根源。正确的是,只需导入*.cs
文件。需要注意的是项目类型。如果在类库项目中工作,则必须执行另一个步骤。
-
添加对
System.Windows.Forms.dll
和System.Drawing
的引用。
导入*.cs
文件
注意事项:
A.只有在我执行了这些步骤并尝试打开文件后才能正确识别这些文件。突然VS“醒来”并修复了文件。
B. 步骤的顺序无关紧要。如果您已经导入了 *.cs 文件,只需修复引用即可。
C.如果缺少其他参考,例如DevExpress 或其他 3rd 方控件导入),*.cs 文件在此问题解决之前将无法正确显示。
【讨论】:
我还必须在添加引用后关闭并重新打开我的解决方案。然后重新添加 .cs 文件 由于实际上有两个文件名为*.cs
,因此澄清它不是*.designer.cs
文件。【参考方案3】:
抱歉 P.Brian.Mackey,您的解决方案对我不起作用。它确实通过让 VS 识别它是一个表单而不是一个代码文件来改进它,即给它是 Icon(想象它添加了表单)
但我设法完全解决问题的唯一方法是在文本编辑器中手动编辑 csproj 文件。我不太相信这是一个很好的解决方案并且可能非常危险,特别是考虑到我犯了两个打字错误并完全破坏了项目,但一旦我做对了它就可以工作。也很难发现没有正确关闭标签或忘记文件扩展名等错误。
因此,在通过“添加 --> 现有项目”添加文件后,该项目从这些条目开始:(Ps 我确定您不必先将文件复制到项目文件夹中,只需导航到它们存储在项目之外,VS会将它们复制到您右键单击的文件夹中。当然也可以提前复制。)
<Compile Include="Reports\GBudget1Report.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Reports\GBudget1Report.Designer.cs" />
<Compile Include="Reports\GBudget2Report.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Reports\GBudget2Report.Designer.cs" />
<Compile Include="Reports\LASHForm.cs">
<SubType>Form</SubType>
</Compile>
在文件的更下方:
<EmbeddedResource Include="Reports\GBudget1Report.resx" />
<EmbeddedResource Include="Reports\GBudget2Report.resx" />
将这些与项目中工作正常的现有表单进行比较(另一个选项是,如果您没有,则在 Visual Studio 中创建一个新表单,它会为您提供正确的标记以进行复制) 我发现 DependentUpon 标记没有将子文件关联到主表单代码文件。
所以我手动编辑它以匹配:
<Compile Include="Reports\GBudget1Report.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Reports\GBudget1Report.Designer.cs">
<DependentUpon>GBudget1Report.cs</DependentUpon>
</Compile>
<Compile Include="Reports\GBudget2Report.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Reports\GBudget2Report.Designer.cs">
<DependentUpon>GBudget2Report.cs</DependentUpon>
</Compile>
再次深入文件:
<EmbeddedResource Include="Reports\GBudget1Report.resx">
<DependentUpon>GBudget1Report.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Reports\GBudget2Report.resx">
<DependentUpon>GBudget2Report.cs</DependentUpon>
</EmbeddedResource>
这不是我喜欢的解决方案,但它有效。如果有人有更好的解决方案,我很乐意倾听。
【讨论】:
这是我发现在 VS2012 中工作的唯一解决方案,用于在将现有表单复制并添加到项目后将其添加到新项目。【参考方案4】:您可以将现有表单导入到项目中。需要导入的文件取决于用于创建表单的 Visual Studio 版本。
我假设你有两个独立的项目,Foo 和 Bar,在不同的解决方案中:
C:\
Projects\
Foo\
Foo.sln
Foo.vcproj
Program.cs
Foo.cs
Foo.Designer.cs
Foo.Designer.resx
和
C:\
Projects\
Bar\
Bar.sln
Bar.vcproj
Program.cs
Bar.cs
Bar.Designer.cs
Bar.Designer.resx
现在,假设您需要从 Foo 导入 fhe 到项目 Bar。首先,您需要将 Foo 附带的所有文件复制到 Bar 项目文件夹中:
C:\
Projects\
Bar\
Bar.sln
Bar.vcproj
Program.cs
Bar.cs
Bar.Designer.cs
Bar.Designer.resx
Foo.cs
Foo.Designer.cs
Foo.Designer.resx
然后,在 Visual Studio 中打开 Bar.sln 并在解决方案资源管理器中右键单击 Bar 项目。选择 [添加现有项目] 并在打开的对话框中选择您为 Foo 表单复制的所有文件。确认后,您应该可以在解决方案资源管理器中正确看到新导入的表单。
【讨论】:
在我的例子中,也有三个文件,但命名有点不同。我在 VS2010 Ultimate 上,文件名是:MyForm1.cs
、MyForm1.Designer.cs
、MyForm1.resx
。据我所知,任何地方都没有MyForm1.Designer.resx
。那是错字吗?你用的是什么版本的VS?
似乎他们在 VS 2010 中删除了 .resx 文件名中的“.Designer”部分。无论如何,这应该仍然有效。
为什么,当然是这样。非常清晰的文件树布局也是 +1。我只是好奇您使用 那些 文件名的版本。可能很高兴知道以防万一。我不是故意要批评的——如果听起来像那样,我很抱歉。
目录布局是 VS 2008 的。我忘了说,对不起。【参考方案5】:
我刚刚在升级 VisualBasic 表单时遇到了类似的问题,从 VisualStudio 2010 升级到 VisualStudio 2013。似乎有两种方法可以添加现有项目。
问题:如果我选择主窗口->项目->添加现有项目并仅拉入文件 formname.vb,结果似乎被解释为仅代码(无设计器),指向原始文件(而不是复制到新项目)并有其他问题。
解决方案:如果相反,我转到解决方案资源管理器窗口,单击以选择项目(与树中较低级别的对象相反),然后在窗口中单击鼠标右键,结果菜单提供添加->现有项目.使用此版本按预期工作,只需要我找到 formname.vb 文件。没有手动复制文件,没有指向多个文件,没有编辑脚本等。我猜这同样适用于用 C 编写的表单。
【讨论】:
【参考方案6】:您实际上需要 2 个文件: - Form1.cs - Form1.Designer.cs
复制 - 将它们粘贴到您的新项目中(只需确保新项目中不存在同名的此类表单)
【讨论】:
不要忘记 Form1.Designer.resx。缺少图标看起来不太好。 ;)【参考方案7】:转到解决方案资源管理器并右键单击它然后添加现有项目,这里选择现有表单路径。现在,这很重要,在您要使用现有表单的页面上,您必须添加头文件:
using "your existing project name";
【讨论】:
作为测试的一部分,我喜欢在自己的测试解决方案上创建一个用户控件。一旦我对它感到满意,我就会将用户控制文件(*.cs、*.resx、*.designer.cs)复制到目标文件夹。然后我使用 NtePad++ 编辑 Designer.cs 文件来更改命名空间。例如,假设我的 testProject 是 Tester,我的目标项目是 Boo。在designer.cs 文件中,我将namespace testProject
更改为namespace Boo
。【参考方案8】:
如果您想创建一个 Windows 窗体库,最好创建一个 Windows 窗体应用程序项目。然后删除默认窗体(Form1),进入项目属性,将输出类型(或项目类型)从 Windows 窗体应用程序更改为类库。
这样,输出将是一个 DLL,但它会包含 Windows 窗体项目所需的引用。正如您所指出的,在添加现有项目时,不要添加它们对应的 .Designer 和 .resx 文件,只需添加它们的***/主文件。
【讨论】:
【参考方案9】:可能是因为使用了 Visual Studio 2012,但所有这些解决方案都不起作用。 AtConway 提示编辑 csproj 文件。这个提示奏效了。
-
打开包含您要添加三个文件的项目的解决方案。
假设您要添加 MyForm.cs / MyForm.Designer.cs 和 MyForm.resX。确保它们在您的项目文件夹中
添加一个具有虚拟名称的虚拟表单(或用户控件):MyTempForm。
保存解决方案并在 Developer Studio 中将其关闭
在 Windows 资源管理器中删除三个 MyTempForm 文件
重命名 MyTempForm 中的三个 MyForm 文件,扩展名相同。
在 Developer Studio 2012 中再次打开您的解决方案
看到您的 MyForm 现在完全可以作为 MyTempForm 使用
在解决方案资源管理器中将 MyTempForm 重命名为 MyForm
【讨论】:
【参考方案10】:假设您要导入名为 YourFormName 的表单。然后您应该只将 YourFormName.cs 添加到项目中 - 其余部分(YourFormName.designer.cs 和 YourFormName.resx)将自动添加。
步骤:
在 VS2013 中创建 WinForms 项目(在我的情况下 .Net Framework 是 4.5.1) 右键单击项目 -> 添加 -> 现有项目... 将您要导入的 winform 复制到项目的文件夹中。如果要将其添加到新文件夹,请先创建一个文件夹然后添加。 搜索任何带有控件的 WinForm(我添加了两个在 VS2010 中为 .NET framework 4 创建的表单) 在不到 10 秒的时间内,visual studio 添加了所有剩余的文件,我可以在设计模式下打开它。
【讨论】:
【参考方案11】:在尝试了几种方法后,我发现使用现有 WinForm 的最简单方法是:(类似于 HaraldDuch 的回答)并且仅在 VS2013 上进行了测试:
1) 在将现有 WinForm 移动到目标项目的源文件夹之前,使用与源 WinForm 相同的名称创建一个虚拟 WinForm。
2) 保存时关闭 VS 解决方案。
3) 从 Windows 资源管理器(关闭 VS IDE)中删除/替换新创建的 WinForm 虚拟文件集(*.cs、*.Designer.cs 和 *.resx),并使用您要使用的现有 WinForm 文件。
4) 打开 VS 找到您现有的 WinForm,如果您愿意,可以从 VS IDE 重命名它,您需要更改旧 WinForm 的命名空间以匹配您的新项目。
【讨论】:
这在 VS2015 中对我有用。必须在 Designer 中进行一些编辑才能更改项目名称。【参考方案12】:在进行大量测试并且在添加时未能正确识别表单后,即使在导入 .vb 时 .designer 和 .resx 正在复制,我发现 Vidar's solution 是最好的,最少的 hacky 修复。
如果项目中还没有这些引用(如果还没有表单),则该表单不会被识别为表单,而是作为代码模块导入。
System.Drawing System.Windows.Forms这些可以根据上面的解决方案手动添加,也可以简单地添加
-
向项目添加一个新的空白表单(这会自动添加上面的引用)
添加要导入的现有表单 .vb/.cs(它现在将在解决方案资源管理器中显示表单图标,并且可以从上下文中使用“视图设计器”)
删除空白表格或将其用于其他用途
这不需要编辑任何 VS 配置文件,如问题的其他答案所示。
【讨论】:
【参考方案13】:就我而言,我还注意到我一次只能广告一种形式。如果您尝试同时添加多个表单,您将看到这些表单是单独的项目。
【讨论】:
【参考方案14】:Visual Studio 2012 中所需的一切如下:
-
将表单的三个文件复制到项目文件夹(.cs、.designer.cs 和 .resx)中
转到项目并添加现有对象。
选择 .CS 文件
它将导入并看起来像一个标准代码文件。如上所述,双击它不会打开设计器。但是,只需单击保存所有文件,然后关闭并重新打开项目,现在它被识别为表单并且可以正常工作。
【讨论】:
您的答案不包含至少其他答案之一尚未提供的任何信息。【参考方案15】:您仍然可以使用“添加现有 iTem”
“添加现有iTem”,选择三个文件(.cs .resx .Designer.cs)
确保 .cs 文件中的“命名空间应用程序”与项目相同
现在您可以使用自动完成刚刚添加的表单。
【讨论】:
【参考方案16】:这对我刚刚有用(我和你有同样的问题)。 1.创建新的同名winform,添加一些东西(因此创建resx文件),保存并关闭。 2. 用您原来的表格替换新创建的文件。 3. 完成
【讨论】:
【参考方案17】:将 .cs 文件从文件系统拖放到解决方案资源管理器中的项目树(例如):
mainForm.cs mainForm.Designer.cs如果不是 Windows 窗体项目,请不要忘记引用。
【讨论】:
【参考方案18】:虽然这是一篇旧帖子,但我遇到了与上述@MatthewRadford 完全相同的问题。我的解决方法是只添加 .CS 文件(不要添加 .resx 文件),并允许 Visual Studio 在添加 .cs 文件后立即自动生成 .resx 文件。
但是,我找到了一个永久解决方案。如果您在升级到新版本的 Visual Studio 后立即开始遇到此问题,则可能是在升级过程中,Active Reports 没有正确注册。解决方案是停用您的 Active Reports(使用 GrapeCity License Manager),卸载 Active Reports,从头开始重新安装 Active Reports,然后重新激活您的许可证。您现在应该能够同时添加 ReportName.cs 和 ReportName.resx 以及 Designer.cs 文件,同时让 Visual Studio 正确处理它们的依赖关系。
【讨论】:
【参考方案19】:只需添加表单文件(form.vb 或 form.cs),其他文件将自动创建。
【讨论】:
【参考方案20】:对我来说最简单的解决方案是,
如果 Visual Studio 打开,则关闭它
将所有 3 个文件(.cs、.designer.cs、.resx)复制到所有其他表单所在的项目文件夹中。
现在使用 Visual Studio 打开项目。
构建项目
右键单击表单并选择视图设计器打开表单,这将为表单生成正确的 Designer.cs。如果您不这样做,有时可能会出现错误提示
InitializeComponent 在当前上下文中不存在。
-
现在您可以打开和编辑 .cs 代码文件了
之后,新表单将在解决方案资源管理器中显示为正常表单。
【讨论】:
【参考方案21】:您所要做的就是传递 .cs 文件。 (代码文件)
【讨论】:
以上是关于如何将现有表单添加到新项目?的主要内容,如果未能解决你的问题,请参考以下文章
重命名项目路径后如何将现有项目添加到 Visual Studio 2012
如何将 Spring WebSecurityConfig 添加到现有项目