c# - 为什么 Event 在 C# 中多次触发?

标签 c# winforms

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

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

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) 中的 even handeler 被执行了多次,因为我在 UserControl 之间切换时多次单击“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
    }
}

用户控件 1:

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 时,您都会再次绑定(bind)事件。这意味着当引发/调用 UserControl1Event 事件时。 HandleTheEvent 被多次调用。事件是处理程序的列表。

private void ShowUserControl1_Click(object sender, EventArgs e)
{


    ShowUC(UC1); //show User Control1


    UC1.UserControl1Event += new EventHandler(HandleTheEvent);


}

你应该在构造函数中绑定(bind)事件:

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);
}

关于c# - 为什么 Event 在 C# 中多次触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34006027/

相关文章:

c# - 简单的 Windows 窗体数据绑定(bind)

c# - 防止 Visual Studio 作为设计器加载自定义分部类

c# - 使用 LINQ to SQL 查询中的数据填充 Excel

c# - 如果 itemsource 中不存在值,则 Combobox 分配 null

c# - C# 中的套接字问题

c# - 如何使用异步持续更新 GUI

c# - 如何生成局部变量?

c# - 运行 Roslyn 脚本时在运行时找不到程序集

c# - 使用 jquery 在 asp.net winforms 中设置隐藏字段的问题

c# - 从表中检索数据以确认记录是否存在时如何修复 "Specified Cast Is Not Valid"错误?