【问题标题】:How do I access a control from a built string(control name)?如何从构建的字符串(控件名称)访问控件?
【发布时间】:2017-07-13 21:44:44
【问题描述】:

问题代码:

for (int i = 0; i <= numberOfPlayers - 1; i++)
{
    if (i == dealerPosition())
    {
        StringBuilder sb = new StringBuilder();

        // e.g. outputs "tbPosition1"
        sb.Append("tbPosition").Append(dealerPosition().ToString()); 

        // The following line of code does not work as sb is a string containing 
        // "thPosition1", not my controller tbPosition1. How do I fix this?
        Dispatcher.Invoke(() => { (sb.Text = dealerPosition().ToString(); });
        break;
    }
}

使用 C#、WPF、Visual Studio。

【问题讨论】:

  • 所以要明确一点:您正在使用sb 来构建控件的名称(例如tbPostiion123),然后您想使用它来设置该控件的文本 -即相当于更明确的:tbPosition123.Text = "..."?
  • 这样做通常是个坏主意。有关更多信息,请参阅此帖子:stackoverflow.com/questions/5428058/…
  • @Kjartan - 这是完全正确的!你知道有什么办法吗? :)
  • @Complexity - 我正在尝试这种方法来避免大量的 if/elseif 语句。
  • 这就是我解释你的代码的方式:如果我在位置 X 并且那是你想要设置文本控件的经销商位置 (DP) tbPositionX.Text = DP。但是 DB 等于 X,因此您将始终将文本控件设置为与文本控件的编号相同的数字。例如 tbPositoin1.Text = "1" 或 tbPosition2.Text = "2"。对吗?

标签: c# wpf string controls


【解决方案1】:
    sb.Append("tbPosition").Append(dealerPosition().ToString()); 

    // The following line of code does not work as sb is a string containing 
    // "thPosition1", not my controller tbPosition1. How do I fix this?
    Dispatcher.Invoke(() => { ((this.FindName(sb.ToString()) as TextBox).Text  = dealerPosition().ToString(); });

不过,根据 Complexity 的评论,post 提到您可以将所有元素添加到列表中,并在您想要处理它时循环/foreach:

List<TextBox> textBoxesToEdit = new List<TextBox>(){tbposition1, tbposition2 /*so on*/};

foreach (TextBox textbox in textBoxesToEdit)
{
  //do stuff
}

【讨论】:

    【解决方案2】:

    FindName()should help you with this,但请注意,如果您在最初创建控件后添加它们,则可能需要may have to register each control as you create it

    【讨论】:

      【解决方案3】:

      根据您对我的问题的回答,我会将我的 tdPositionXYZ 存储在一个数组或列表中并执行此操作而不是您的所有代码:

      Dispatcher.Invoke(() => {
          tbPositionArray[dealerPosition()].Text = dealerPosition().ToString();
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-11
        • 1970-01-01
        • 1970-01-01
        • 2012-05-24
        相关资源
        最近更新 更多