C# 获取所有winforms控件及其属性的列表

C# 获取所有winforms控件及其属性的列表,c#,winforms,visual-studio-2013,resx,C#,Winforms,Visual Studio 2013,Resx,我需要使一个遗留程序(其庞大)支持另一种语言。尽管我非常想把我的单一语言项目文件发给他们,并要求他们完成剩下的工作,但当我这么做时,翻译公司往往会与我争吵 因此,我希望生成一个项目中所有UI控件的列表,以及它们当前显示的默认文本。然后我会将其发送给翻译,并生成一个包含结果的.resx文件。据我所知,只要我为目标语言正确命名resx文件,并且localizable-able属性设置为true,一旦区域性更改,它将切换控件上的所有文本。让我知道,如果我离开了,我会花时间在嵌入式世界,出于某种原因,高

我需要使一个遗留程序(其庞大)支持另一种语言。尽管我非常想把我的单一语言项目文件发给他们,并要求他们完成剩下的工作,但当我这么做时,翻译公司往往会与我争吵

因此,我希望生成一个项目中所有UI控件的列表,以及它们当前显示的默认文本。然后我会将其发送给翻译,并生成一个包含结果的.resx文件。据我所知,只要我为目标语言正确命名resx文件,并且localizable-able属性设置为true,一旦区域性更改,它将切换控件上的所有文本。让我知道,如果我离开了,我会花时间在嵌入式世界,出于某种原因,高层决定我应该是解决这个问题的人


我想我可以通过解析设计器文件来获得列表,但我希望有人有一个更优雅的解决方案,或者知道有人已经构建了一个解决方案。这似乎是一项非常常见的任务。

好吧,因为我不知道一些真正重要的参数,所以我不能确定是否可以选择使用商业工具;我也不知道您有多少表单,或者动态创建了多少表单和控件

但是对于一个简单的控制转储函数来说,这可能是一个开始:

private void dumpControls(Control ctl, string parents)
{
  if (parents == "") parents = ctl.Name; else parents += "." + ctl.Name;
  if (ctl.Name != "" && ctl.Text != "") Console.WriteLine(parents  + "=" + ctl.Text);
  foreach (Control ct in ctl.Controls) dumpControls(ct, parents);
}
您可以将其放入表单的构造函数中:

public Form1()
{
  InitializeComponent();
  if (dumpMode) dumpControls(this, "");
  ..
}
如果不需要完整的父容器列表,可以轻松修改代码,例如:

 if (parents == "") parents = this.Name + "." + ctl.Name; else parents += "." + ctl.Name;
 if (ctl.Name != "" && ctl.Text != "") Console.WriteLine(parents  + "=" + ctl.Text);
 foreach (Control ct in ctl.Controls) dumpControls(ct, "")
您可能希望表单的前缀使控件引用在表单中唯一

显然,您不仅需要将其添加到每个表单中,还需要打开每个表单。 我不知道这是否会成为一个问题,但我相信真正的工作将是通过你的代码,并改变所有硬编码的文字,需要翻译成其他东西。我去过那里,用过字典;工作很好,但是做了很多工作,也很了不起,因为我不知道有多少文字潜入了我(自己)的代码中

我在表单加载或用户更改语言时加载字符串。除了内置的资源;我还可以将外部语言文件读入词典


不用将数据转储到控制台,您可以将其填充到StringBuilder中并将其写入文件。

当然,您可以使用以下代码获取表单中的控件:

foreach (Control control in this.Controls)
{
    MessageBox.Show(control.Name + "\n" + control.Text);
}

但它只显示窗体上的控件。如果您有一个groupbox,那么您也应该使用与groupbox相同的代码。或者,如果您有tabcontrol,您应该为其单独执行此操作

我已经编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。我只是从VS中的resx designer中复制+粘贴到Excel中,并将电子表格交给翻译,然后在完成后粘贴回去。@Dai-无论是谁编写了这个程序,硬编码了很多,所以英文版没有resx文件。我希望当文化改变为一种新的语言,并且在Japenese resx文件中有一个属性时,它会覆盖现在存在的硬编码英语。@TaW-谢谢你的回复。您是对的,在大约80个窗口中的任何一个窗口中找到显示的文本都是一件非常痛苦的事情。我决定从默认的.resx文件中解析出控件,并将列表转储到excel。