Visual Studio不断创建已定义的事件处理程序

时间:2012-05-04 16:10:26

标签: c# winforms visual-studio

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

void myButton_Click(...) { }

如果您转到Designer并双击控件或在属性网格中分配事件(并且您将注意到它未在属性网格中标识),Visual Studio将在InitializeComponent中创建一个完全附加的条目( )和主表单代码文件:

void myButton_Click1(...) { }

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

答案 1 :(得分:2)

我在将大型(旧版)表单拆分为部分类并向其添加新部分后,今天遇到了此问题。 尽管这是一个老问题,我发布的原始问题的答案很多都是不正确的。具体来说,他们中的许多人声称,如果不双击,Visual Studio就无法生成这些内容。我想确认VS 在某些情况下执行此操作。

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

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

由于每次都会生成所有3个,并且由于它们位于一个标签上,当我添加一个测试控件时,它隐藏在主窗体后面(所以没有双击的机会,当然没有机会双击全部3个),我可以肯定地说这个 IS 是一个Visual Studio错误(在我的案例中是VS 2013)。

2015年9月24日更新:在厌倦了删除处理程序后,我做了一些搜索,并找到了解决问题的方法。下面是来自MS论坛(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)的mustiy解决方案的文本。这个修复对我有用,虽然点击创建事件仍然在错误的类中创建它们,但在移动它们之后,它们正常工作。它还可以防止创建无效的事件处理程序。

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.

答案 2 :(得分:1)

显然,需要做的是清理解决方案。显然,这会删除幕后所做的所有序列化。 (我不是Visual Studio如何进行序列化的专家,所以我的术语可能不对。)

Visual Studio (2008) 'Clean Solution' Option

看,我的妈妈不会没有傻瓜。