【问题标题】:How to call a textbox dynamically from a string C# WPF?如何从字符串 C# WPF 中动态调用文本框?
【发布时间】:2011-02-22 20:27:30
【问题描述】:

所以我有 70 个“节点”,它们都是 WPF 中的文本框,我正在尝试通过函数调用更改文本框中的值。

我有一个函数叫做:

private void changeNode(int row, int column, int cost)  
{    
       int nodeNumber= row * 10 + column;     
       call node"nodeNumber".Text = Convert.String(cost); 
       //example node0.Text = Convert.String(cost); 
}

我确定要更改的节点,然后调用 nodeX.Text 来更改它,但是我希望 X 成为我可以的变量,而不是创建 70 个我调用适当文本框的案例。

我看到了几种使用反射的方法,但它似乎只有在函数没有参数并且在函数内而不是 XAML 中的文本框时才有效。

让我知道是否有一种简单的方法可以将字符串“node37”转换为调用 node37.Text = cost 或类似的东西。

【问题讨论】:

  • 第一个近似值,如果您曾经编写将数据推送到 WPF 控件的代码,那么您做错了。您几乎肯定应该为此使用数据绑定。

标签: c# wpf string textbox call


【解决方案1】:

听起来你的方法是错误的。为什么你有一组代表文本框名称的字符串?相反,您应该拥有对 TextBox 对象的内存引用。如果您有多个,并且您不知道会有多少,那么请改用 arrayTextBox 对象。您可以使用代表您要与之交互的文本框的数字来索引数组。

避免使用反射,这里完全没必要。

【讨论】:

  • +1 - 没有理由手动命名 70 个文本框。它们应该是使用保存在适当数据结构(数组或Dictionary)中的引用动态创建的。
  • 我会在运行时将它们全部添加,但我已经在网格中手动创建了它们。我可以创建一个引用它的数组,但这仍然需要我设置所有 70 个仍然正确?我目前这样做的方式是我有一个函数,它只使用一个开关来返回正确的文本框,然后我可以随时获得对该文本框的引用。我只是想知道是否不是创建一个函数来执行此操作,而只是有一个快速调用,可以让我将字符串转换为文本框调用。抱歉,如果这没有意义,我认为这将是最好的方法。
  • 顺便说一句,我手动创建所有文本框的原因是因为我想对问题进行图形表示,并且手动创建它们比以编程方式更简洁且更容易做到。
  • 我看不出这有多整洁,当然也不比以编程方式更容易。如果您想重构该代码或以某种方式更改它,我不羡慕您。我认为这应该是数据驱动的数据绑定,而不是在代码隐藏中编程(当然也不能手动创建)。
【解决方案2】:

我假设您已经为所有文本框输入了名称(如果没有,您可以动态执行此操作)。然后您可以使用this question 的答案按名称查找合适的控件。

【讨论】:

  • 我确实已经将它们全部命名了,但我觉得递归搜索合适的文本框会很昂贵而且不值得。
  • 我认为 OJ 和 Justin 提供的答案是您在现有信息下所能做的最好的。也许如果他们的父母是相同的,并且他们是唯一的孩子,您可以通过索引从父母的孩子集合中搜索。
【解决方案3】:

您的所有文本框都是同一个画布或其他控件的子级吗?循环遍历孩子并将控件添加到字典中。解析名称以获取数字并将其用作键。

【讨论】:

  • 这基本上就像我现在正在做的那样,但我没有字典,我只是检查它是什么数字并返回我想要的 Textbox 对象。
  • 对,这样可以省去你编写映射函数的时间。我已经做到了两种方式,我更喜欢动态创建字典。这样一来,当您从现在开始一年后突然必须拥有 71 个文本框并且您已经忘记了该映射功能时,它永远不会不同步。
【解决方案4】:

在处理数据时使用列表总是更好。使用要加载的 DataObjects 创建一个 ObservableCollection,现在处理 Data 对象而不是实际的控件。

在 WPF 中,如果遵循规则,则不应指向实际对象。在此处查看示例应用程序: http://www.abhisheksur.com/2010/08/woring-with-icollectionviewsource-in.html

我想你会得到方法。

【讨论】:

  • 是的,如果我采用这种方法,我会使用列表,但我宁愿没有文本框列表。
猜你喜欢
  • 2021-10-31
  • 2011-09-13
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多