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

疯狗550

我在开发 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从另一个用户控件更改用户控件的标签颜色?C#.NET Framework

来自分类Dev

C#Winforms-将生存状态从一个用户控件切换到另一个用户控件?

来自分类Dev

更改用户控件嵌套元素的属性:WPF/C#

来自分类Dev

当用户启动另一个exe文件/程序时,在c#winforms程序中检测

来自分类Dev

C# WPF - 发生另一个控件事件时更改控件内容

来自分类Dev

关闭子窗体,然后单击C#.net中的用户控件中的按钮,打开另一个窗体?

来自分类Dev

C#Winforms中面板与用户控件的性能

来自分类Dev

是否可以在另一个用户控件上看到一个用户控件?

来自分类Dev

创建一个使用另一个用户控件的用户控件

来自分类Dev

如何从另一个ComboBox(C#,Winforms)更改形状的颜色

来自分类Dev

绑定到另一个用户控件

来自分类Dev

WPF C#Databind:在C#中,突出显示另一个控件时更改控件颜色

来自分类Dev

WPF C#Databind:在C#中,突出显示另一个控件时更改控件颜色

来自分类Dev

将数据发送到另一个用户控件内的用户控件

来自分类Dev

使用 c#/WinForms 将数据绑定到重复用户控件中的控件

来自分类Dev

c#设置/从另一个线程/从另一个线程获取控件的属性

来自分类Dev

停止键盘定向导航从一个用户控件跳到另一个用户控件

来自分类Dev

订单更改事件上的 C# WinForms 控件

来自分类Dev

单击时如何将用户控件置于另一个控件的前面

来自分类Dev

如何在循环中动态更改用户控件的属性

来自分类Dev

众多Winforms用户控件的共享基类?

来自分类Dev

如何在WPF中将对象从一个窗口绑定到另一个窗口中的另一个控件?(C#)

来自分类Dev

我需要从另一个类(C#)访问表单控件

来自分类Dev

如何创建可在设计时订阅另一个WinForm控件的C#属性?

来自分类Dev

C#Webbrowser控件无法导航到另一个页面

来自分类Dev

我如何使用mvvm将数据从用户控件传递到另一个用户控件

来自分类Dev

按钮单击事件未在用户控件中触发,而是在另一个用户控件中动态创建

来自分类Dev

通过位于另一个用户控件中的按钮将用户控件置于前面

来自分类Dev

如何在Winforms C#中将值传递给用户控件

Related 相关文章

  1. 1

    如何从另一个用户控件更改用户控件的标签颜色?C#.NET Framework

  2. 2

    C#Winforms-将生存状态从一个用户控件切换到另一个用户控件?

  3. 3

    更改用户控件嵌套元素的属性:WPF/C#

  4. 4

    当用户启动另一个exe文件/程序时,在c#winforms程序中检测

  5. 5

    C# WPF - 发生另一个控件事件时更改控件内容

  6. 6

    关闭子窗体,然后单击C#.net中的用户控件中的按钮,打开另一个窗体?

  7. 7

    C#Winforms中面板与用户控件的性能

  8. 8

    是否可以在另一个用户控件上看到一个用户控件?

  9. 9

    创建一个使用另一个用户控件的用户控件

  10. 10

    如何从另一个ComboBox(C#,Winforms)更改形状的颜色

  11. 11

    绑定到另一个用户控件

  12. 12

    WPF C#Databind:在C#中,突出显示另一个控件时更改控件颜色

  13. 13

    WPF C#Databind:在C#中,突出显示另一个控件时更改控件颜色

  14. 14

    将数据发送到另一个用户控件内的用户控件

  15. 15

    使用 c#/WinForms 将数据绑定到重复用户控件中的控件

  16. 16

    c#设置/从另一个线程/从另一个线程获取控件的属性

  17. 17

    停止键盘定向导航从一个用户控件跳到另一个用户控件

  18. 18

    订单更改事件上的 C# WinForms 控件

  19. 19

    单击时如何将用户控件置于另一个控件的前面

  20. 20

    如何在循环中动态更改用户控件的属性

  21. 21

    众多Winforms用户控件的共享基类?

  22. 22

    如何在WPF中将对象从一个窗口绑定到另一个窗口中的另一个控件?(C#)

  23. 23

    我需要从另一个类(C#)访问表单控件

  24. 24

    如何创建可在设计时订阅另一个WinForm控件的C#属性?

  25. 25

    C#Webbrowser控件无法导航到另一个页面

  26. 26

    我如何使用mvvm将数据从用户控件传递到另一个用户控件

  27. 27

    按钮单击事件未在用户控件中触发,而是在另一个用户控件中动态创建

  28. 28

    通过位于另一个用户控件中的按钮将用户控件置于前面

  29. 29

    如何在Winforms C#中将值传递给用户控件

热门标签

归档