c# - 每次更改 ComboBox(使用 SelectedIndexChanged)时,如果打开,则以其他形式显示具有新值的消息

标签 c# winforms visual-studio combobox .net-3.5

我想从 Form1 组合框中获取所选语言并启用其他表单来查看该语言。组合框有大约 20 种语言,所以是的,您可以说很多!我有一个名为 ComboBoxLang_SelectedIndexChanged 的​​方法(在更改组合框中的语言时发生):

// Works fine in Form1.cs
private void ComboBoxLang_SelectedIndexChanged(object sender, EventArgs e)
{
    string selectedItem = this.comboBoxLang.GetItemText(this.comboBoxLang.SelectedItem);

    comboBox2.Items.Clear();

    if (selectedItem == "English")
    {
        ToEnglish();
    }

    else if (selectedItem == "French")
    {
        ToFrench();
    }

    // And so on...
}

目前,为了测试它是否有效,我只想以另一种形式显示所选语言的消息。我已经研究并尝试了多种方法,但显然我在某处出错了!我认为可能使用 getset 方法最有用,但我真的不确定。我希望 MessageBox 说“英语”或任何选择。

再举个例子,我知道用

Form1 f1 = new Form1();

...在第二种试图检索值的形式中是不正确的,因为它只是获取硬编码文本,而我只想要已输入的实际值。所以我不确定我是否应该使用

private Form1 f1;

...改为第二种形式。我真的很困惑。

我知道这是一个常见问题,但我似乎找不到解决方案。

最佳答案

让我们通过观察者来做

public static class LanguageChangeObserver
{
    private static object _lock = new object();
    public delegate void LanguageHandler(string lang);

    public static event LanguageHandler LanguageChanged;

    public static void  Notify(string lang)
    {
        lock (_lock)
        {
            if (LanguageChanged != null)
                LanguageChanged(lang);
        }
    }

}

这样,所有表单都可以订阅事件 LanguageChanged 并且表单 Form1 可以“通知” - 所有其他表单都将获得信息

编辑

观察者模式是指您拥有“观察”其他类中变化的类。在 .net 中,观察者是使用事件和委托(delegate)实现的。听起来很可怕,但实际上这很简单。您订阅类(class)事件并观察您想要观察的变化。在这种情况下,当 Form1 中的语言发生变化时,您应该调用 LanguageChangeObserver.Notify(...)。其他表单在创建时应订阅 LanguageChanged 事件。

LanguageChangeObserver.LanguageChanged += <form_method_with_signature_of_LanguageHandler>; 

如果表单已关闭并即将被处理,您应该取消订阅观察,因为有线和非无线处理程序是 .Net 中内存泄漏的常见方法

LanguageChangeObserver.LanguageChanged -= <form_method_with_signature_of_LanguageHandler>; 

Lock 将同步您的代码并确保您一次更改一种语言。 我希望这会有所帮助。

关于c# - 每次更改 ComboBox(使用 SelectedIndexChanged)时,如果打开,则以其他形式显示具有新值的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20620796/

相关文章:

c# - 如何删除字符串?

c# - Azure Linux Zip 部署无法正常工作 : Azure Functions App

c# - 如何获取内部文件夹的路径?

c# - Ms Access密码存储

c# - 在 Winforms 自定义 UserControl 上启用设计界面

c# - 使用字符串目录填充 TreeView

c# - 防止 Visual Studio 在多行注释中输入时添加额外的星号

sql-server - SQL 编辑器窗口始终连接到 (localdb\ProjectsV13)。在哪里更改此默认值?

jquery - Visual Studio 2019 - 添加客户端库(TypeScript、JQuery 等)的正确方法

c# - 进入 Visual Studio 2015 链接项目中的 (F11) 异步代码不起作用 - 如何修复