我在这里检查了类似的问题,但答案与我的问题无关。

我是C#的新手,正在使用Windows窗体。

c# - 为什么事件在C#中多次触发?-LMLPHP

如ScreenShot中所示,我具有form1,UserControl1和UserControl2。


Form1有2个按钮(ShowUserControl1和ShowUserControl2)和DataGridView。
UserControl1具有“ AddRow”按钮和文本框。
UserControl2没有任何内容。


单击“ ShowUserControl2”按钮ShowUserControl2,然后单击“ ShowUserControl1”按钮ShowUserControl1,然后在UserControl1的texBox中输入文本,然后单击“ AddRow”,添加新行,即可正常工作。

现在的问题是:

当我单击“ ShowUserControl1”,然后单击“ ShowUserControl2”,然后再次单击“ ShowUserControl1”,然后输入文本,然后单击“ AddRow”一次,一次在DataGridView中添加2行。单击“ ShowUserControl1” 3次,然后单击“ AddRow”,一次添加3行,依此类推。

我认为Form1(HandleTheEvent)中的均匀处理程序被执行了多次,因为在UserControls之间进行切换后,我多次单击“ ShowUserControl1”。如何防止偶数形式多次触发?请帮忙。
谢谢

表格1:

public partial class Form1 : Form
{

    UserControl1 UC1 = new UserControl1();
    UserControl2 UC2 = new UserControl2();

    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        //add user controls when form loads
        Controls.Add(UC1);
        Controls.Add(UC2);
    }


    private void ShowUC(Control value)   // Show/hide User Controls
    {
        UC1.Visible = false;
        UC2.Visible = false;

        value.Visible = true;

     }


    public void HandleTheEvent(object sender, EventArgs e) //deal with the event
    {

        dataGridView1.Rows.Add(1, UC1.ReturnData, 3);

    }


    private void ShowUserControl1_Click(object sender, EventArgs e)
    {


        ShowUC(UC1); //show User Control1
        UC1.UserControl1Event += new EventHandler(HandleTheEvent);


    }

    private void ShowUserControl2_Click(object sender, EventArgs e)
    {
        ShowUC(UC2); //show User Control2
    }
}


UserControl1:

public partial class UserControl1 : UserControl
{

    public event EventHandler UserControl1Event;

    public UserControl1()
    {
        InitializeComponent();
    }


    public string ReturnData
    {
        get { return textBox1.Text; }

    }
    private void AddRow_Click(object sender, EventArgs e)
    {
        UserControl1Event(this, e);

    }
}

最佳答案

该控件是创建的,但是每次调用ShowUserControl1_Click时,您都将再次绑定该事件。这意味着UserControl1Event事件被引发/调用。 HandleTheEvent被多次调用。事件是处理程序列表。

private void ShowUserControl1_Click(object sender, EventArgs e)
{


    ShowUC(UC1); //show User Control1


    UC1.UserControl1Event += new EventHandler(HandleTheEvent);


}


您应该将事件绑定到构造函数中:

public partial class Form1 : Form
{

    UserControl1 UC1 = new UserControl1();
    UserControl2 UC2 = new UserControl2();

    public Form1()
    {
        InitializeComponent();

        UC1.UserControl1Event += new EventHandler(HandleTheEvent);
    }




不要忘记检查是否在这里分配了UserControl1Event

private void AddRow_Click(object sender, EventArgs e)
{
    // here!
    if(UserControl1Event != null)
        UserControl1Event(this, e);
}

08-15 23:20