使用字符串访问表单的元素

时间:2013-06-28 22:59:00

标签: .net winforms c++-cli

我正在Visual Studio 2012中构建一个表单,我有一个名为trFinger1Ph1的控制器(一个更具体的滑块)。是否可以使用变量来访问它?

这就是我通常访问我的控件(有效)的方法

int value = Form1::trFinger1Ph1-> Value;

但我希望这样做:

std::string test = "trFinger1Ph1"
int value = Form1::test -> Value;

我正在使用它,因为我有一个很大的控件列表,以这种方式访问​​它们将帮助我清理我的大部分代码。 很明显,该程序正在查看trFinger1Ph1内部进行测试,而不是将其识别为变量测试。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

不,你不能这样做。您可以使用PHP和其他一些语言,但在C或C ++中不可能(这也适用于许多其他语言)

编译代码时,变量的名称将“消失”。

你可以做其他事情来解决问题(因为我怀疑这是一个XY问题 - 你问的是如何做Y因为你有问题X,你认为做Y是解决问题的正确方法)。例如,您可以拥有一个包含名称作为字符串的表,以及对该引用的相关对象的引用,然后使用该表来查找该字符串,并使用该引用来获取该值。我不是“形式”的专家但是......

答案 1 :(得分:2)

Mats Petersson和Captain Oblivious在答案中都是正确的,你不能这样做。在C ++中,没有办法通过包含其名称的字符串来访问变量或对象。

但是, 是WinForms中一种访问表单控件的方法,如果你拥有的是一个包含其名称的字符串。您可以使用父表单维护的Controls collection来执行此操作。

您可以使用for each循环手动迭代此集合,将每个控件的Name属性值与字符串对象进行比较,直到获得匹配为止:

for each (Control ^ctl in this->Controls)
{
    if (ctl->Name == "trFinger1Ph1")
    {
        // Found a match!
        // ...
    }
}

...或者您可以使用Find method让框架搜索您并返回包含所有可能匹配项的数组。

var ctrls = this.Controls.Find("trFinger1Ph1", true);

不幸的是,你不能使用你提出的语法来做到这一点。那就是:

std::string test = "trFinger1Ph1"
int value = Form1::test -> Value;  // won't work!

显然,您需要确保所有控件都具有唯一名称才能使其正常工作。它有点design smell,看起来非常可疑,可能是错误的。我不建议将此作为一种“清理”代码的一般方法,就像你在问题中建议的那样。

答案 2 :(得分:1)

您无法在C ++中以这种方式访问​​变量。

如果确实希望通过字符串文字访问它们,您可以创建一个std::map并使用指针或对各种成员变量的引用填充它。

std::map<std::string, ControlType&> controls;
controls.insert(std::pair<std::string, ControlType&>("xyz", Form::trFinger1Ph1);

controls["xyz"].Value = somevalue;

我认为这不会让你的代码变得更干净。另一种方法是简单地声明对控件的引用。

ControlType& control1 = Form::trFinger1Ph1;

control1.Value = somevalue;