C# 方法执行多次,即使只调用一次

C# 方法执行多次,即使只调用一次,c#,C#,我正在做一个项目,包括从WinForm创建和删除动态控件, 所以我决定在一个小测试项目中完成这一部分。 测试项目有两个文件Form1.cs和NewControls.cs。每当用户单击表单上已有的添加按钮时,此程序将创建其他按钮。当用户单击新创建的按钮时,此程序将删除该按钮(自删除按钮)。此外,在删除按钮后,其他按钮的名称、文本及其位置也会根据局部变量(controlIndex)进行更改 表格1.cs 这个程序几乎和预期的一样。问题是我在RemoveButton()的form1.cs中使用的Mes

我正在做一个项目,包括从WinForm创建和删除动态控件, 所以我决定在一个小测试项目中完成这一部分。 测试项目有两个文件Form1.cs和NewControls.cs。每当用户单击表单上已有的添加按钮时,此程序将创建其他按钮。当用户单击新创建的按钮时,此程序将删除该按钮(自删除按钮)。此外,在删除按钮后,其他按钮的名称、文本及其位置也会根据局部变量(controlIndex)进行更改

表格1.cs 这个程序几乎和预期的一样。问题是我在RemoveButton()的form1.cs中使用的MessageBox多次触发(而不是只触发一次),这意味着整个方法要执行多次。实际上,我粘贴了那个MessageBox用于调试(有点)

由于我无法在执行“Form1.ActiveForm.Controls.Add(newButton);”语句时调试应用程序,调试器会抛出NullReferenceException,因为调试时没有活动窗体。
我知道这是一个额外的问题,但我想把它放在那里。我是一个初学者,不能同时解决这两个问题。第一个问题对于我的原始项目来说非常重要,因为当添加许多控件时,它会导致问题。

我认为这是因为您从Form1.cs和NewControl类的构造函数中调用PlaceControl,因为您说
newButton.Click+=neweventhandler(Form1.RemoveButton)
您正在添加事件处理程序,因此可以有更多的事件处理程序。

因此,当您多次调用placeControl时,我认为您有多个事件处理程序。

可能事件处理程序没有被RemoveButton删除。(我最近一直在使用java,所以我的术语可能与C#有点不符)建议:在需要时将控件可见性设置为true,否则设置为false,而不是添加和删除按钮。

每次删除按钮时,您都会查看现有的控件列表,并调用“PlaceControl”,它会附加另一个处理程序

foreach (NewControl tempcontrol in newControlsList)
{
    tempcontrol.controlIndex = newControlsList.IndexOf(tempcontrol);
    tempcontrol.PlaceControl(); 
}

RemoveButton
中删除上述代码块,您将看到动态添加的按钮只会触发事件一次。

在RemoveButton事件中,您循环每个按钮并再次调用PlaceControl。
唯一的原因是重新定位其余控件。
我认为最好是调用一个单独的方法来完成这项工作

public void RepositionControl() 
{ 
    newButton.Left = controlIndex * 100; 
} 

这将防止与多次添加的事件处理程序发生冲突

你是认真的吗?我对C#相当缺乏经验。Lol.@Abhishek.130490
foreach (NewControl tempcontrol in newControlsList)
{
    tempcontrol.controlIndex = newControlsList.IndexOf(tempcontrol);
    tempcontrol.PlaceControl(); 
}
public void RepositionControl() 
{ 
    newButton.Left = controlIndex * 100; 
}