我在开发 SDI Windows 窗体应用程序时遇到问题。我正在使用单个窗口和不同的用户控件,这些控件随着用户在应用程序中的进展而被换出。
问题:我有一个名为 Login 的用户控件,用于处理登录过程。用户成功登录后,Login 用户控件应该消失,而 Homepage 用户控件应该位于前面。
Login 用户控件需要移除自身并将控制权转移到 Homepage 用户控件。
我尝试将所需的用户控件作为参数发送到 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);
}
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
}
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句