You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Winforms跨类事件编写与调用问题:登录成功控件切换失效

问题分析与解决方案

你的核心问题是Form里的LoginControl_LoginSuccessChanged方法从未被执行,导致事件绑定代码根本没运行,自然接收不到LoginControl触发的事件。另外你的事件定义也可以更规范,下面一步步修正:

1. 修正LoginControl的事件定义

把public EventHandler boolIsChanged;改成标准的事件声明,用event关键字,这是.NET的规范写法:

public partial class LoginControl : UserControl
{
    public LoginControl()
    {
        InitializeComponent();
    }

    // 规范的事件声明,用event关键字
    public event EventHandler LoginSuccess;

    // 触发事件的方法,通常命名为OnXXX,保护级别设为virtual更灵活
    protected virtual void OnLoginSuccess()
    {
        LoginSuccess?.Invoke(this, EventArgs.Empty);
    }

    private void btn_SubmitLogin_Click(object sender, EventArgs e)
    {
        string password = txtbx_Password.Text;
        string username = txtbx_Username.Text;

        bool loginSuccessful = AuthenticateUser(username, password);

        if (loginSuccessful)
        {
            MessageBox.Show("Login successful!");
            // 触发登录成功事件
            OnLoginSuccess();
        }
        else
        {
            MessageBox.Show("Login failed. Please try again.");
        }
    }

    // 你的AuthenticateUser方法实现
    private bool AuthenticateUser(string username, string password)
    {
        // 这里写你的SQLite验证逻辑,当前示例是判断非空
        return !string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password);
    }
}

2. 修正Form的事件绑定逻辑

直接在Form的构造函数里绑定LoginControl的事件,不需要单独写一个没被调用的方法:

public partial class Form1 : Form
{
    private LoginControl loginControl;
    private AddFilesControl addFilesControl;

    public Form1()
    {
        InitializeComponent();

        // 初始化登录控件并添加到窗体
        loginControl = new LoginControl();
        loginControl.Dock = DockStyle.Fill;
        this.Controls.Add(loginControl);

        // 直接绑定登录成功事件,这里写控件切换逻辑
        loginControl.LoginSuccess += LoginControl_OnLoginSuccess;

        // 初始化主控件
        addFilesControl = new AddFilesControl();
        addFilesControl.Dock = DockStyle.Fill;
        addFilesControl.Visible = false;
        this.Controls.Add(addFilesControl);
    }

    // 登录成功后的处理方法
    private void LoginControl_OnLoginSuccess(object sender, EventArgs e)
    {
        // 隐藏登录控件,显示主控件
        loginControl.Visible = false;
        addFilesControl.Visible = true;

        // 如果需要彻底移除登录控件,可以用:
        // this.Controls.Remove(loginControl);
        // loginControl.Dispose();
    }
}

关键说明

  • 之前的LoginControl_LoginSuccessChanged方法只是定义了但没被调用,所以事件绑定代码根本没执行,事件自然触发不了。
  • 用event关键字声明事件是.NET的标准做法,能防止外部直接触发事件,保证封装性。
  • 事件绑定要在控件初始化完成后就做,比如Form的构造函数里,这样事件触发时才能接收到。

内容的提问来源于stack exchange,提问作者BenClites

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 19:37:43