我在开发SDI Windows窗体应用程序时遇到问题。我正在使用单个窗口和不同的用户控件,当用户在应用程序中前进时,这些控件会被换出。
问题:我有一个名为Login的用户控件来处理登录过程。用户成功登录后,用户控件应该消失,并且主页用户控件应该在前面。
登录用户控件需要自行删除并将控制权转移到主页用户控件。
我尝试将所需的用户控件作为参数发送到MainForm中的方法,尽管它不会更改用户控件。
我怎样才能做到这一点?我使用这种方法错了吗?
请原谅我是一名有用户控件的初学者。
答案 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
}
}
}
}