天道酬勤,学无止境

如何在 C# 中循环名称(How To loop the names in C#)

问题

我有 10 个文本框,即 TB1、TB2、TB3、TB4 等等......到 TB10

我想将它们存储到名为 toBeStored 的单个字符串值中。

现在我正在做手动方式

String toBeStored=null;
tobeStored=TB1.text.toString();
tobeStored+=TB2.text.toString();

等等..

我想创建一个 for 循环并添加它们

像这样的东西..

for(int i=1;i<11;i++)
{
      toBeStored+=TB+i+.text.ToString()+"  ";
}

我知道那是错的..有什么可以使它正确的吗?

回答1

不。因为您将文本框定义为变量,所以根本没有定义枚举器。

您可以定义自己的枚举器。 在最简单的情况下,就像

TextBox boxes [] = new TextBox [] { TB1, TB2, TB3....}

foreach (TextBox box in boxes) {
}
回答2

虽然我认为前提可能有缺陷,但您可以通过

for (int i = 1; i <= 10 ; i++) {
  TextBox textbox = (TextBox)Page.FindControls( "TB" + i.ToString);
  toBeStored += textbox.Text;
}
回答3

将控件放入一个数组中,然后迭代该数组。

回答4

首先,您没有告诉我们您使用的是winforms、webforms 还是什么。 那会很好。

其次,您可能不需要在 Text 属性上使用 .ToString() ,我认为它已经是一个字符串。

最后,如果你执意偷懒,那就把文本框放到一个数组中,循环遍历这个数组:

private TextBox[] _textBoxes = new TextBox[10];

// In init code:
TextBox[0] = TB1;
TextBox[1] = TB2;
// ...

StringBuilder toBeStored = new StringBuilder();
for (int i=0; i<10; i++)
{
   toBeStored.Append(TextBox[i].Text);
}

// Now process toBeStored.ToString();
回答5

如果您想按名称获取字段,通常可以使用反射。

Type type = GetType();
for (int i = 1; i <= 10; i++)
{
    var name = "TB" + i;
    var field = type.GetField(name, BindingFlags.Instance | BindingFlags.NonPublic); //or appropriate flags
    TextBox tb = (TextBox)field.GetValue(this);
    //...
}
回答6

如果要做这样的事情,我会创建一个辅助方法来将文本累积成一个字符串。

    public string AccumulateNames(params string[] names)
    {
        return names.Aggregate(string.Empty, (current, name) => current + name);
    }

这将被称为类似于此

var toBeStored = AccumulateNames(TB1.Text, TB2.Text, ..., TBn.Text);

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在C#中循环遍历多个复选框(how loop through multiple checkbox in C#)
    问题 我在winfrom中有100个复选框。 它们的名称是连续的,如checkbox1,checkbox2等。我的winform中有一个Submit按钮。 单击提交按钮后,它会检查是否选中了复选框,然后更新了某个值,否则更新了另一个值。 我必须选中100复选框。 因此,我必须遍历100复选框以检查该复选框是否已选中。 我知道如何勾选该复选框 private void sumit_button_Click(object sender, EventArgs e) { if (checkbox1.Checked) { // update } else { // update another } if (checkbox2.Checked) { // update } else { // update another } ......................and so on } 但是我如何才能做到这一点100复选框? 回答1 foreach (var control in this.Controls) // I guess this is your form { if (control is CheckBox) { if (((CheckBox)control).Checked) { //update } else { //update another } } } 回答2
  • 在循环 C# 中编写 XML(Writing XML in loop c#)
    问题 我将如何写出像 <?xml version="1.0" encoding="UTF-8"?> <calibration> <ZoomLevel 250>0.0100502512562814</ZoomLevel 250> <ZoomLevel 250>0.0100502512562814</ZoomLevel 250> ........ </calibration> 我知道如何写出来,但我不能在循环中写出来,我需要 atm 写 xml 表是 public void XMLWrite(Dictionary<string, double> dict) { //write the dictonary into an xml file XmlDocument doc = new XmlDocument(); XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null); doc.AppendChild(docNode); XmlNode productsNode = doc.CreateElement("calibration"); doc.AppendChild(productsNode); foreach (KeyValuePair<string, double> entry in dict) { XmlNode
  • for 循环中 counter 变量的作用域是什么?(What is the scope of the counter variable in a for loop?)
    问题 我在 Visual Studio 2008 中收到以下错误: Error 1 A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else 这是我的代码: for (int i = 0; i < 3; i++) { string str = ""; } int i = 0; // scope error string str = ""; // no scope error 我知道一旦循环终止str就不再存在,但我也认为i的范围也仅限于for循环。 所以i与在for循环之外声明的变量具有相同的作用域? 编辑: 为了清楚起见,我使用的是 C#。 我正在讨论删除“C”标签。 但是,由于正确答案解释了两者之间的区别,我认为保留两个标签是有意义的。 我在上面的代码注释中有一个错误: for (int i = 0; i < 3; i++) { string str = ""; } int i = 0; // scope error string str = ""; // also scope error
  • 循环 C# WPF 中按钮的单击事件(Click event for button in loop C# WPF)
    问题 我有几个按钮,我将它们放入 wrapPanel 循环中: for (int i = 0; i < wrapWidthItems; i++) { for (int j = 0; j < wrapHeightItems; j++) { Button bnt = new Button(); bnt.Width = 50; bnt.Height = 50; bnt.Content = "Button" + i + j; bnt.Name = "Button" + i + j; bnt.Click += method here ? wrapPanelCategoryButtons.Children.Add(bnt); } } 我想知道点击了哪个按钮并为每个按钮做一些不同的事情。 例如生病有方法 private void buttonClicked(Button b) 在哪里发送点击的按钮,检查类型、名称或 ID,然后做一些事情。 那可能吗? 回答1 将此添加到您的循环中: bnt.Click += (source, e) => { //type the method's code here, using bnt to reference the button }; Lambda 表达式允许您在代码中嵌入匿名方法,以便您可以访问本地方法变量。 您可以在此处阅读有关它们的更多信息。 回答2
  • C# lambda,当你想的时候没有取局部变量值?(C# lambda, local variable value not taken when you think?)
    问题 假设我们有以下代码: void AFunction() { foreach(AClass i in AClassCollection) { listOfLambdaFunctions.AddLast( () => { PrintLine(i.name); } ); } } void Main() { AFunction(); foreach( var i in listOfLambdaFunctions) i(); } 有人可能认为上面的代码会和下面的一样: void Main() { foreach(AClass i in AClassCollection) PrintLine(i.name); } 然而,事实并非如此。 相反,它每次都打印 AClassCollection 中最后一项的名称。 看起来好像在每个 lambda 函数中都使用了相同的项目。 我怀疑从创建 lambda到lambda 获取其中使用的外部变量的快照可能会有一些延迟。 本质上,lambda 持有对局部变量i的引用,而不是在创建 lambda 时获取i值的“快照”。 为了测试这个理论,我尝试了这个代码: string astr = "a string"; AFunc fnc = () => { System.Diagnostics.Debug.WriteLine(astr); }; astr =
  • 如何在 C# 中一次跳出多个循环?(How to break out of multiple loops at once in C#?)
    问题 如果我有嵌套循环,并且我想一次摆脱所有循环怎么办? while (true) { // ... while (shouldCont) { // ... while (shouldGo) { // ... if (timeToStop) { break; // Break out of everything? } } } } 在 PHP 中, break接受一个参数来表示要跳出的循环数。 可以在 C# 中完成这样的事情吗? 像goto这样可怕的东西呢? // In the innermost loop goto BREAK // ... BREAK: break; break; break; 回答1 将嵌套循环提取到一个函数中,然后您可以使用 return 从任何地方退出循环,而不是中断。 回答2 引入另一个控制标志并将其放入所有嵌套的 while 条件中,如下所示。 还用它替换了你拥有的 while(true) 条件 bool keepLooping = true; while (keepLooping) { // ... while (shouldCont && keepLooping) { // ... while (shouldGo && keepLooping) { // ... if (timeToStop) { keepLooping = false; break
  • 如何在控制台应用程序中添加 c# 登录尝试循环?(How to add c# login attempts loop in console application?)
    问题 我是这种语言的新手,我尝试过一些事情,但无法弄清楚如何设置登录循环以使用最大登录次数。 3 次。 有人可以帮我吗? static void Main(string[] args) { Console.WriteLine("Status: " + status.Onaangemeld); Console.WriteLine("Welkom, typ hieronder het gebruikersnaam:"); string Naam = Console.ReadLine(); Console.WriteLine("Vul hieronder het wachtwoord in:"); string Wachtwoord = Console.ReadLine(); if (Naam == "gebruiker" && Wachtwoord == "SHARPSOUND") { Console.Clear(); Console.WriteLine("Status: " + status.Ingelogd); Console.WriteLine("Welkom bij SoundSharp {0}!", Naam); Console.ReadLine(); } else Console.Clear(); Console.WriteLine("Helaas
  • c#string.replace in foreach 循环(c# string.replace in foreach loop)
    问题 不知何故,我似乎无法在 C# 的 foreach 循环中进行字符串替换来工作。 我的代码如下: foreach (string s in names) { s.Replace("pdf", "txt"); } 我对 LINQ 还是很陌生,所以如果这听起来很业余,请原谅我;) 回答1 你说你在追求 LINQ 解决方案……这很简单: var replacedNames = names.Select(x => x.Replace("pdf", "txt")); 我们不知道names的类型,但是如果您想重新分配给它,您可以使用ToArray或ToList : // If names is a List<T> names = names.Select(x => x.Replace("pdf", "txt")).ToList(); // If names is an array names = names.Select(x => x.Replace("pdf", "txt")).ToArray(); 您应该知道,您发布的代码目前根本没有使用 LINQ... 回答2 C# 中的字符串是不可变的(不会改变),因此s.Replace将返回一个新字符串。 不幸的是,这意味着您不能使用foreach进行更新。 如果名称是一个数组,这应该可以工作: for(int i = 0; i < names
  • 数据表+在c#中使用循环删除一行(Data Table + delete a row in c# using loop)
    问题 我有一个数据表,我想删除一行,这是我的代码,它向我抛出异常 foreach (DataRow row in dt1.Rows) { if ((row["Name"] == "Select a Lookbook") || (row["Name"] == "Create a new Lookbook")) { row.Delete(); dt1.AcceptChanges(); } } 我什至在 if 语句和外部 forloop 之外尝试仍然抛出错误任何想法如何实现此任务这是我得到的异常: Collection was modified; enumeration operation might not execute. 最终工作代码: foreach (DataRow row in dt1.Select()) { if ((row["Name"] == "Select a Lookbook") || (row["Name"] == "Create a new Lookbook")) { row.Delete(); } } 回答1 而不是使用dt1.Rows ,使用dt1.Select() 这里的目标不是使用集合本身,而是使用不是Rows集合的Rows数组 回答2 在迭代DataTable.Rows时创建要删除的行列表,然后分别删除它们。 非 LINQ 解决方案: List
  • 在 C# 中,顺序循环如何比并行循环运行得更快?(How does sequential loop run faster than Parallel loop in C#?)
    问题 我尝试了一个非常小的例子: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Collections.Concurrent; using System.Diagnostics; namespace TPLExample { class Program { static void Main(string[] args) { int[] dataItems = new int[100]; double[] resultItems = new double[100]; for (int i = 0; i < dataItems.Length; ++i) { dataItems[i] = i; } Stopwatch stopwatch = new Stopwatch(); stopwatch.Reset(); stopwatch.Start(); Parallel.For(0, dataItems.Length, (index) => { resultItems[index] = Math.Pow(dataItems[index]
  • 如何在 C# 中实现精确的游戏循环帧限制?(How to implement precise game loop frame limiting in C#?)
    问题 我正在尝试在用 C# 编写的游戏引擎中实现游戏循环帧限制器。 有人告诉我Thread.Sleep甚至需要几毫秒才能执行Thread.Sleep(0) ,并且会稍微错过目标毫秒。 因此它对于我需要的来说不够精确,因为目标帧速率可能需要引擎坐下来等待 1 毫秒。 我不确定我是否应该在这种情况下使用Thread.SpinWait ,因为也可能存在引擎需要等待 10 毫秒的情况,我不知道在这种情况下使用 SpinWait 是否是一个坏主意。 这是一段代码来说明我想要实现的目标: public void Run() { var targetDelta = TimeSpan.FromSeconds(0.016); Running = true; while (Running) { // Calculate time since previous frame start here ("delta") // Simplified, but essentially this is what's going on Input.HandleEvents(); Scene.Update(delta); Renderer.Render(Scene); // Perform waiting to limit frame rate here } } 回答1
  • C# While 循环与 For 循环?(C# While Loop vs For Loop?)
    问题 在 C# 中,一个问题一直困扰着我一段时间,它在 While 和 For 循环之间的实际主要区别是什么。 它只是纯粹的可读性吗? 你可以在 for 循环中做的所有事情都可以在 while 循环中完成,只是在不同的地方。 所以拿这些例子: int num = 3; while (num < 10) { Console.WriteLine(num); num++; } 对比 for (int x = 3; x < 10; x++) { Console.WriteLine(x); } 两个代码循环产生相同的结果,两者之间的唯一区别是 for 循环强制您声明一个新变量并在每个循环周期开始时设置迭代值? 也许我在任何重大差异方面遗漏了其他东西,但如果有人能让我直截了当地说明这一点,那就太好了。 谢谢。 回答1 两者之间的唯一区别是 for 循环强制您声明一个新变量并在每个循环周期开始时设置迭代值? for 循环强迫你什么都不做。 您可以省略 3 个元素中的任何一个。 最小的形式是 for(;;) // forever { DoSomething(); } 但是您可以使用这 3 个元素来编写更简洁的代码: for(initializer; loop-condition; update-expression) { controlled-statements; } 相当于: {
  • 循环变量上的闭包的正确语义是什么? [关闭](What are the correct semantics of a closure over a loop variable? [closed])
    问题 就目前而言,这个问题不适合我们的问答形式。 我们希望答案得到事实、参考或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。 如果您觉得此问题可以改进并可能重新打开,请访问帮助中心以获取指导。 8 年前关闭。 考虑以下 lua 代码: f = {} for i = 1, 10 do f[i] = function() print(i .. " ") end end for k = 1, 10 do f[k]() end 这将打印从 1 到 10 的数字。在这种情况下, i对外部循环的每次迭代的值进行封闭。 这就是我一直以来对闭包的理解,我很高兴...... ...直到我将一些 lua 代码移植到 c# 中,并且我尝试做同样的事情: var f = new Action[10]; for (int i = 0; i < 10; i++) { f[i] = (new Action(delegate() { Console.Write(i + " "); })); } for (int k = 0; k < 10; k++) { f[k](); } 现在我将数字 10 打印了 10 次(让我们忘记 lua 数组是基于 1 的)。 实际上,在这种情况下,闭包对变量起作用,而不是对它的值起作用,这很有意义,因为我只在第一个循环结束后调用函数。 JavaScript
  • 在 C# 中调试 foreach 循环:这是什么迭代?(Debugging a foreach loop in C#: what iteration is this?)
    问题 除了在每次启动 foreach 时设置调试变量并增加它之外,当您在连接 Visual Studio 调试器的情况下闯入时,有没有办法告诉这是循环的第 X 次? 我想这将是 Visual Studio 的一个功能,而不是添加到编译代码中的功能。 回答1 这是以前的堆栈溢出问题,这似乎是您要找的:get-index-of-current-foreach-iteration 从该链接引用的答案: Foreach 用于迭代实现 IEnumerable 的集合。 它通过在集合上调用 GetEnumerator 来完成此操作,该集合将返回一个 Enumerator。 这个 Enumerator 有一个方法和一个属性: 移动下一步() 当前的 Current 返回 Enumerator 当前所在的对象,MoveNext 将 Current 更新为下一个对象。 显然,索引的概念与枚举的概念无关,无法做到。 因此,大多数集合都可以使用索引器和 for 循环构造进行遍历。 与使用局部变量跟踪索引相比,我更喜欢在这种情况下使用 for 循环。 回答2 在循环内部设置断点,然后在断点上单击鼠标右键以设置条件。 您还可以在调试时右键单击以查看命中计数,并根据需要重置它。 您可以设置一个布尔表达式,当断点命中时计算该表达式以有条件地中断(或只是跳过)。 回答3 您还可以使用 Visual Studio
  • 在 C# 中执行 .. While 循环吗?(Do .. While loop in C#?)
    问题 如何在 C# 中编写 Do .. While 循环? (编辑:我是一名 VB.NET 程序员,正在尝试转向 C#,所以我确实有使用 .NET / VB 语法的经验。谢谢!) 回答1 一般形式为: do { // Body } while (condition); 其中condition是bool类型的某种表达式。 就我个人而言,我很少写 do/while 循环 - for 、 foreach和直接while循环在我的经验中更为常见。 后者是: while (condition) { // body } while和do...while之间的区别在于,在第一种情况下,如果开始时条件为 false,则主体将永远不会被执行 - 而在后一种情况下,它总是在评估条件之前执行一次。 回答2 由于您提到您来自 VB.NET,我强烈建议您查看此链接以显示比较。 您还可以使用此 wensite 将 VB 转换为 C#,反之亦然 - 这样您就可以使用现有的 VB 代码并查看它在 C# 中的样子,包括循环和子项下的任何其他内容。 要回答循环问题,您只需执行以下操作: while(condition) { DoSomething(); } 你也可以这样做 - 虽然像这样: do { Something(); } while(condition); 这是我成功使用的另一个代码翻译器,以及另一个很棒的
  • 在 C# wpf 中如何遍历网格并获取网格内的所有标签(in C# wpf how to loop through a grid and get all the labels inside of the grid)
    问题 那么您知道如何在 c# 中使用标准表单循环遍历面板并获取其中的所有标签吗? 所以你可以做这样的事情: foreach(Label label in Panel.Controls) 有没有办法为网格做到这一点? 就像是 foreach(Lable lable in Grid) 所以这个 foreach 可能在一个传递网格对象的函数中 private void getLabels(Grid myGrid) { foreach(Label label in myGrid) } 如果我这样做,它会告诉我“错误 CS1579:foreach 语句不能对类型为‘System.Windows.Controls.Grid’的变量进行操作,因为‘System.Windows.Controls.Grid’不包含‘GetEnumerator’的公共定义” 我现在知道还有另一种方法吗? 任何帮助,将不胜感激。 回答1 遍历 Grid.Children 并将所有内容转换为 Label。 如果它不为空,你就找到了一个标签。 回答2 normal forms - WPF 我们在 2014 年做 .Net Windows UI 的正常方式。 如果您正在使用 WPF,您需要抛弃从古老技术中获得的任何和所有概念,并理解并接受 WPF 心态。 基本上,您不会“迭代”WPF 中的任何内容,因为绝对没有必要这样做。
  • C#-foreach循环的每次迭代都会调用函数吗? [复制](C# - Does function get called for each iteration of a foreach loop? [duplicate])
    问题 这个问题已经在这里有了答案: 11年前关闭。 可能重复: 遍历函数结果时,foreach如何工作? 如果我具有类似以下的功能-将在foreach循环中为每次迭代调用ReturnParts()还是仅一次调用它? private void PrintParts() { foreach(string part in ReturnParts()) { // Do Something or other. } } private string[] ReturnParts() { // Build up and return an array. } 回答1 它只会被调用一次。 PS多次调用将毫无意义。 如果您希望每次结果都不同,则可以每次重新调用它。 您将如何遍历不断变化的集合? 回答2 您可以通过在函数“ ReturnParts”上放置一个断点来自己确定,如果每次迭代命中了多次,则可以。 回答3 它只会被调用一次。 foreach循环等效于以下代码: IEnumerable<string> enumerator = (collection).GetEnumerator(); try { while (enumerator.MoveNext()) { string part = (string)enumerator.Current; // Do Something or other. }
  • C#如何快速处理大数据列表(C# How to handle large lists of data quickly)
    问题 我试图找到一些关于我的问题的文章,但没有找到任何与我的应用程序相关或有意义的文章。 这是我的问题: 我有两个(> 20,000)个项目的列表。 我需要根据相反列表中的每个项目检查每个列表中的每个项目。 像这样的实现: foreach(var item1 in List1) { foreach(var item2 in List2) { // Check item 1 against item 2. // Check item 2 against item 1. } } 由于为检查所做的工作,速度非常慢且无法使用。 有没有更有效的方法来处理这些需要像这样检查的大型项目列表? 如果我能提供更多信息,请告诉我。 感谢您的任何帮助/建议。 我正在使用 C# .NET 3.5 编辑:让我试着简要解释一下这些检查。 item1 和 item2 是路径系统的一部分。 item1 和 item2 由 N 个其他项目连接。 我正在检查 item1 是否连接(有效路径)到 item2,并且 item2 连接到 item1。 不能假设如果 item1 -> item2,比 item2 -> item1。 所以这两项检查都是必要的。 数据库包含信息 if 和 how item1 -> item2 和 if/how item2 -> item1。 在检查内部,有一个对服务的命名管道调用来进行检查。
  • 在 IQueryable 中循环与在 C# 中使用 Reader.Read() 循环通过 Datareader 相同(Is looping through IQueryable the same as looping through a Datareader with Reader.Read() in C#)
    问题 对不起,标题太长:) 我真的找不到任何答案,这个问题已经在我的脑海中盘旋了一段时间。 最后是问题的简短摘要。 基本上,我想知道 linq to entity/sql 是否在将结果集映射到实体/sql 类之一之前循环通过数据读取器,或者它是否已经映射。 在我可以遍历 Iqueryable 之前,Iqueryable 是否必须遍历数据读取器。 为了显示我在代码中的意思,我想知道是否 foreach(object o in SomeIQueryableObject) { ...do stuff with the object } 将导致 A: while(Reader.Read()) { SomeIqueryableObject.Add(Reader.TranslateRow()); } //now the iqueryable has been loaded with objects and we can loop through it //with the above code foreach(object o in SomeIQueryableObject) { ...do stuff with the object } 还是会导致 B: while(Reader.Read()) { ...do stuff with the object } //Iqueryable
  • C#如何停止动画gif不断循环(C# How to stop animated gif from continually looping)
    问题 我的应用使用互联网时,有一个事件被调用。 该事件将更改由7帧组成的动画gif。 如何使其仅在框架中循环一次? private void trafficSendingActive(object sender, trafficEventArgs e) { txImage.Image = Properties.Resources.blip; } 回答1 您可以使用System.Drawing.ImageAnimator来启动/停止gif动画 // start System.Drawing.ImageAnimator.Animate(txImage.Image, OnFrameChanged); // stop System.Drawing.ImageAnimator.StopAnimate(txImage.Image, OnFrameChanged); private void OnFrameChanged(object sender, EventArgs e) { // frame change } 回答2 完成进度事件后,您可以从该GIF图像中提取单个帧(非动画), txImage.Image = Image.FormFile("non-animated-frame-from-gif.jpg"); 您可以使用此网站从gif中提取框架:http://gif-explode.com