日期:2014-05-18  浏览次数:21044 次

如何循环winform界面的所有控件?
如何使用一个循环,循环每一个控件,我是要做多语言版本,要循环所有的控件,逐个更改控件text。
   
C# code
                foreach (Control item in this.Controls)
                {
                    if (Values[item.Name] != null)
                        item.Text = Values[item.Name].ToString();
                }
//values是读取到配置文件ini的Hashtable   key是控件name,value是控件text值


这样写,访问不到控件


另外我又这样写,还是获取不到控件。
C# code
                foreach (DictionaryEntry item in Values)
                {
                    if (this.Controls[item.Key.ToString()] != null)
                        this.Controls[item.Key.ToString()].Text = item.Value.ToString();
                }


另外请问一下 桌面应用程序做多语言版本还有其他好的方式吗?

------解决方案--------------------
C# code

foreach (Control item in this.Controls)
{
    try
    {
          TextBox t = (TextBox)item;
          //是TextBox控件,做你后面的
     }
    catch
    {
          //不是TextBox控件 自己看着办
     }
}

------解决方案--------------------
C# code
foreach (Control item in this.Controls)
            {
                if(item is TabControl)
                {
                    foreach (Control item_sub in item.Controls)
                    {
                        item_sub.Text = "tab动态修改";
                        foreach (Control item_sub2 in item_sub.Controls)
                            item_sub2.Text = "tab子控件动态修改";

                    }
                }
                else
                    item.Text = "动态修改";
            }

------解决方案--------------------
是差不多,我的意思是把界面所有文字全部写到xml,生成界面的时候由xml读取出来显示,这样就是支持多语言了吗?多少种语言就用多少个xml行了
探讨
ini和xml应该差不多吧。

引用:
多语言版为什么不用xml?

------解决方案--------------------
图片看不了啊。。。


感觉用resx文件实现的多语言比较简单

项目的Properties下创建几个resx文件,对应多语言,控件的name作为key,value就是要显示的内容就可以了。

也不需要读取文件的操作,比较简单。

public void InitFormLanguse(List<Control> iControls, string lag_flg)
{
if (iControls.Count > 0)
{
foreach (Control ct in iControls)
{

if (Constant.LAG_CN.Equals(lag_flg))
{
ct.Text = Properties.CN_Resources.ResourceManager.GetString(ct.Name.ToString());
}
else if (Constant.LAG_EN.Equals(lag_flg))
{
ct.Text = Properties.EN_Resources.ResourceManager.GetString(ct.Name.ToString());
}
else
{
ct.Text = Properties.JP_Resources.ResourceManager.GetString(ct.Name.ToString());
}
}
}
}