【问题标题】:How to increase object name in a loop?如何在循环中增加对象名称?
【发布时间】:2015-09-22 13:43:19
【问题描述】:

我有 1600 个文本框。我想要这样的东西:

Textbox1.Text="1"
Textbox2.Text="2"
Textbox3.Text="3"
Textbox4.Text="4"
...

我知道这不起作用,但我需要这样的循环:

For i as integer = 0 to 1600  
(textbox+i).text=i  
Next  

我找不到任何关于此的信息。我不知道这是否可能。任何想法?

【问题讨论】:

  • 为什么不用数组?
  • 1600 个文本框??这是 WinForms 吗?
  • 当然是这个例子的解决方案。但我的意思是“在循环中增加对象名称”是可能的。关注这个,不要关心这个例子。
  • Ric.这是一个例子。我可以做吗?
  • 我不得不问...为什么你有1600个文本框..?

标签: vb.net loops object names


【解决方案1】:
For i as integer = 0 to 1600  
   CType(Me.Controls("Textbox" + i.ToString()), TextBox).Text = i.ToString()
Next 

希望这会奏效。

【讨论】:

  • 将你的 i 转换为字符串,@newbieProgrammer。此外,您可以直接跳到作业,如下所示:CType(Me.Controls("Textbox"+(i).ToString()), TextBox).Text = (i).ToString()。快到了。
  • "&" 修复了语法错误,但 "text1.text = i " 存在运行时错误:未处理 NullReferenceException。
  • 你的空引用异常可能是因为循环开始一个 0 而不是 1
  • 将查找 1601 个文本框
  • 是的,将 0 更改为 1 即可。谢谢大家,此代码有效!
【解决方案2】:

如果您想从预定义的值范围循环,那么这应该可以解决问题:

For i = 1 to 1600
    Dim txt As TextBox = TryCast(Me.Controls("TextBox" & i.ToString), TextBox)
    If txt IsNot Nothing
        txt.Text = i.ToString()
    End If
Next

【讨论】:

  • 找不到返回数组吗?
  • 错误:未为“公共函数查找(键作为字符串,searchAllChildren 作为布尔值)作为 System.Windows.Forms.Control()”的参数“searchAllChildren”指定参数。
【解决方案3】:

首先,让我们枚举所有的文本框:

var textboxes = this.Controls.OfType<TextBox>()
                             .ToArray();

现在我们有了文本框,让我们遍历它们并设置它们的数量:

for(int i = 0; i < textboxes.Count(); i++)
{
  var textbox = textboxes[i];
  textbox.Text = i.ToString();
}

【讨论】:

  • 这将多次遍历控件。如果你这样.Select((c,i)=&gt;new {Control=c,Index=i}) 然后foreach 在集合上,你将获得索引值并且只对集合进行一次交互。
  • 每次调用.Count() 都可能再次对集合进行交互。您最好使用.Length 或在for 之前将变量设置为计数或使用foreach
  • 您是正确的,它会多次迭代控件集合,但 ToArray() 调用将评估 LINQ 语句。对Count() 的每次调用都不会再次迭代该集合。该扩展方法检查枚举是数组还是列表。如果我选择List&lt;TCount()Length 属性会有所不同。仅仅因为这是一种效率较低的方法并不意味着它不是解决方案。
  • 我没有投票给你。我只是说有更好的方法可以做到这一点。在您的示例中,它仍会循环两次列表。 (您可能因为他们要求使用 VB.Net 而您在 c# 中回复而投了反对票)
  • 啊.. 有道理。我脑子里有一个内部的 VB 到 C# 转换器。实际上,直到您提到它,我才注意到。
【解决方案4】:

只是添加另一个选项(虽然我不推荐它 - 它很慢!!!!)您可以使用 Reflection 在循环中按名称获取它们。

例如:

For tb As Integer = 1 To 1600
    Dim textBox As TextBox = GetTextBoxByReflection("TextBox" & tb.ToString())
    textBox.Text = tb.ToString()
Next

另见Getting variable by name in C#

【讨论】:

  • 请不要将 C# 发布为标记为 VB.NET 的问题的建议答案
  • 反射肯定是一种非常缓慢的方法?
【解决方案5】:

您还可以循环所有控件...

    Dim tb As TextBox
    For Each ctrl As Control In form1.Controls
        If ctrl.GetType.ToString = GetType(TextBox).ToString Then
            tb = CType(ctrl, TextBox)
            tb.Text = ctrl.ID.Substring(7)
        End If
    Next

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多