2

我有一个在多个部分类文件中定义的 Windows 窗体。在其中一个文件 (xxx.Query.cs) 中,我为 DataGridView 定义了所有事件处理程序。但是,有时,Visual Studio 决定要在表单 (xxx.cs) 的主文件中为其中四个事件处理程序创建存根。我最终得到了四个错误,这些错误说明了“类型'xxx'已经定义了一个名为'dataGridView1_ColumnHeaderMouseClick'的成员具有相同的参数类型”。

如何让 Visual Studio 退出尝试为这些创建存根?是最让人头疼的。

4

3 回答 3

4

我今天在将大型(旧版)表单拆分为部分类同时添加新部分后遇到了这个问题。尽管这是一个老问题,但我发布的许多原始问题的答案都是不正确的。具体来说,他们中的许多人声称 Visual Studio 无法在不双击的情况下生成这些。我想确认 VS在某些情况下确实这样做了。

在我的特殊情况下,我向选项卡控件添加了一个新选项卡,并将新选项卡事件和代码放在新类中。最初,我将这段代码(包括事件)放在主窗体的末尾,这可能与问题有关。移动代码后,如果我将控件添加到主窗体的任何部分(例如,单独的选项卡),VS 会为我在新部分类中的 3 个事件生成空事件处理程序,尽管在此有完整的事件处理程序班级。

我现在唯一的解决方案是在出现问题时从我的主表单代码底部删除空处理程序。解决方案清理不会删除这些空白处理程序。

由于所有 3 个每次都一致生成,并且由于它们位于一个选项卡上,当我添加测试控件时它们隐藏在主窗体后面(所以没有机会双击,当然没有机会双击所有 3 个),我可以说相信这一个 Visual Studio 错误(在我的例子中是 VS 2013)。

24/9/15 更新:在厌倦了删除处理程序后,我进行了更多搜索,并找到了解决该问题的方法。这是来自 MS 论坛的 Mustiy 解决方案的文本(https://social.msdn.microsoft.com/Forums/windows/en-US/79910eaa-84e7-472d-95ee-4b8ddfbf99f0/multiple-partial-class-files-cause -problems-with-forms-designer?forum=winforms&prof=required)。这个修复对我有用,虽然单击创建事件仍然会在错误的类中创建它们,但是在移动它们之后,它们可以正常工作。它还可以防止创建无效的事件处理程序。

i had same problem and came accross your post, but i wasn't sattisfied. It had to be a solution for this because VS IDE does it.
Here is the solution :
Open the .csproj project file with notepad and let's say for a Form1.cs file you will see a configuration like
<Compile Include="Form1.cs">
  <SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
  <DependentUpon>Form1.cs</DependentUpon>
</Compile>
If you create a new file called Form1Events.cs and put another partial class of Form1 and move the events to the new partial class. In the new .csproj file you the new file like this below
<Compile Include="Form1Events.cs">
  <SubType>Form</SubType>
</Compile>
Something is missing you have to tell the VS IDE that this Form1Events.cs file is dependent to Form1.cs. As the IDE do this for Form1.Designer.cs file make the same with Form1Events.cs and put a "DependentUpon" tag into Form1Events.cs. Last the .csproj file look like this below
<Compile Include="Form1.cs">
  <SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
  <DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="Form1Events.cs">
  <DependentUpon>Form1.cs</DependentUpon>
  <SubType>Form</SubType>
</Compile>
And if you save the .csproj file the IDE reloads the project and on the Solution exlorer tree you see that the new partial class is put below Form1.cs file. And if you open the designer and double click a previous decalred and moved event it will navigate to the new file.
于 2015-09-22T05:15:43.020 回答
2

在评论中,您声称:“如果我双击一个已经定义了事件处理程序的控件,它将带我到该事件处理程序,而不是创建一个新的。”

如果您手动挂钩事件,则情况并非如此。

public Form1() {
    InitializeComponent();
    myButton.Click += new EventHandler(myButton_Click);
}

void myButton_Click(...) { }

如果您转到设计器并双击控件或在属性网格中分配事件(您会注意到它未在属性网格中标识),Visual Studio 将在 InitializeComponent() 和主窗体代码文件:

void myButton_Click1(...) { }

如果您不以某种方式参与设计器,Visual Studio 将永远不会自动创建控件事件处理程序。不幸的是,很容易让 VS Designer 认为你双击了 - 最容易在第一次加载表单时的长时间停顿期间。

于 2012-05-04T16:27:18.603 回答
1

显然,需要做的是清洁溶液。显然,这抹去了所有在幕后完成的序列化。(我不是 Visual Studio 如何进行序列化的专家,所以我的术语可能有误。)

Visual Studio (2008)“干净的解决方案”选项

看,我妈妈不养假人。

于 2012-05-07T18:01:05.720 回答