从另一个用户控件Winforms C#更改用户控件

时间:2017-09-01 12:06:27

标签: c# winforms user-controls

我在开发SDI Windows窗体应用程序时遇到问题。我正在使用单个窗口和不同的用户控件,当用户在应用程序中前进时,这些控件会被换出。

问题:我有一个名为Login的用户控件来处理登录过程。用户成功登录后,用户控件应该消失,并且主页用户控件应该在前面。

登录用户控件需要自行删除并将控制权转移到主页用户控件。

我尝试将所需的用户控件作为参数发送到MainForm中的方法,尽管它不会更改用户控件。

我怎样才能做到这一点?我使用这种方法错了吗?

请原谅我是一名有用户控件的初学者。

1 个答案:

答案 0 :(得分:1)

您需要从表单中删除旧控件并添加新控件。

public class MainForm: Form {
    //...
    private Control currentControl;

    public void ChangeControl(Control newControl) {
        if(newControl == null) {
            throw new ArgumentNullException("newControl");
        }
        if(currentControl != null) {
            Me.Controls.Remove(currentControl);
        }
        Me.Controls.Add(newControl);
        currentControl = newControl;
    }

    public void ShowHomePage() {
        // You could use a previously created control
        this.ChangeControl(this.homePageControl);
        // Or create a new one.
        // this.ChangeControl(new HomePageControl());
    }
    //...
}

public class LoginControl: Control {
    private void LoginButton_Click(Object sender, EventArgs e) {
        if(DoLogin(...)) {
            ((MainForm)this.Parent).ShowHomePage()
        }
        else {
            // Show some error message
        }
    }
}

就我个人而言,我更喜欢只通过事件与MainForm通信,而不是一个人控制另一个:

public class MainForm: Form {
    private Control currentControl;

    public void ChangeControl(Control newControl) {
        if(newControl == null) {
            throw new ArgumentNullException("newControl");
        }
        if(currentControl != null) {
            Me.Controls.Remove(currentControl);
            // Optionally you could dispose old control
            // currentControl.Dispose();
        }         
        Me.Controls.Add(newControl);
        currentControl = newControl;
    }

    // Optional generic method
    public void ChangeControl<TControl>() where TControl: Control, new() {
        this.Changecontrol(new TControl());
    }

    private void OnLoggedIn(Object sender, LoggedInEventArgs e) {
       this.ChangeControl<HomePageControl>();
    }

    private Login_ParentChanged(Object sender, EventArgs e) {
        var control = sender as LoginControl;
        if(control != null && control.Parent == null) {
            control.LoggedIn -= OnLoggedIn;
            control.ParentChanged -= Login_ParentChanged
        }
    }

    private void LogOut_Click(Object sender, EventArgs e) {
       var control = new LoginControl();
       control.LoggedIn += OnLoggedIn;
       this.ChangeControl(control);
       control.ParentChanged += Login_ParentChanged
    }
}

public class LoginControl: Control {
    public event EventHandler<LoggedInEventArgs> LoggedIn;

    private void LoginButton_Click(Object sender, EventArgs e) {
        if(DoLogin(...)) {
            if(LoggedIn != null) {
               LoggedIn(this, new LoggedInEventArgs(...))
            }
            else {
               // Show some error message
            }
        }
    }
}