我想从 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...
}
目前,为了测试它是否有效,我只想以另一种形式显示所选语言的消息。我研究并尝试了多种方法,但显然我在某个地方出错了!我想可能会使用get and set方法将是最有用的,但我真的不确定。我希望消息框显示“英语”或任何选择。
另一个例子,我知道使用
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
可以“通知”-所有其他形式都会获取信息
Edit
观察者模式是指您的类可以“观察”其他类的变化。在.net中,观察者是使用事件和委托来实现的。听起来很可怕,但实际上它使它变得简单。您订阅班级事件并观察您想要观察的变化。在这种情况下,当 Form1 中的语言发生更改时,您应该调用LanguageChangeObserver.Notify(...)
。其他表单在创建时应订阅LanguageChanged
event.
LanguageChangeObserver.LanguageChanged += <form_method_with_signature_of_LanguageHandler>;
如果表单已关闭并即将被处理,您应该取消订阅观察,因为有线处理程序而不是未连接处理程序是 .Net 中内存泄漏的常见方法
LanguageChangeObserver.LanguageChanged -= <form_method_with_signature_of_LanguageHandler>;
Lock
将同步您的代码并确保您当时更改一种语言。
我希望这有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)