我想从 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 和 set 方法最有用,但我真的不确定。我希望 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/