我需要使不同的文本框彼此交互,即使它们位于不同的面板中,并在 foreach 代码中由不同的名称标识。
我正在 Windows 窗体中制作 Wordle 游戏。我有 5 个不同的文本框,每个都有自己的代码。我想要 5 组,每组 5 个文本框(总共 25 个文本框),每组具有相同的代码,但仅在启用时执行。我用一个按钮逐一启用每个组,代表游戏中的不同尝试。为了避免将所有代码复制粘贴 5 次,我将文本框放在不同的面板中。每组的第一个文本框位于一个面板中,第二个文本框位于另一个面板中,依此类推。我使用以下代码:
foreach(TextBox name in panel1.Controls)
{
if (name.Enabled == true)
{
//Code goes here
}
}
我的问题是我的一个文本框需要与之前的文本框进行交互,例如使用以下代码:
if (textBox3 == textBox1 && textBox3 == textBox2)
{
//Something happens
}
正如我之前所说,textBox1、textBox2 和 textBox3 位于不同的面板中,我不知道如何使它们像上面的代码中那样相互交互,同时保留每个函数的 for 。我怎样才能做到这一点?谢谢。
您不需要使用不同的面板。假设您有文本框:
textBoxGroup1_Box1, textBoxGroup1_Box2... textBoxGroup5_Box1
您可以将它们放入列表或数组中进行组织:
var group1 = new []{
textBoxGroup1_Box1,
textBoxGroup1_Box2,
textBoxGroup1_Box3,
textBoxGroup1_Box4,
textBoxGroup1_Box5};
...
这为您提供了一种迭代所有框的方法,而无需任何额外的面板。您还可以将所有组放入一个公共列表中:
var groups = new []{ group1, group2, group3, group4, group5};
您还可以使用对象的
.Tag
属性来帮助您跟踪哪个框是什么。例如:
public class TextboxId{
public int Group {get; init;}
public int Num { get; init;}
public TextboxId(int group, int num) => (Group, Num ) = (group, num);
}
...
textBoxGroup1_Box1.Tag = new TextboxId(1, 1);
textBoxGroup1_Box2.Tag = new TextboxId(1, 2);
...
public void SomeMethod(TextBox tb){
if( tb.Tag is TextBoxId id){
var group = id.Group;
var num = id.Num;
if(group > 1){
var boxInPreviousGroupWithSameNum = groups[group-1][num];
// Do something
}
}
}
这应该为您提供足够的工具来实现您想要的任何逻辑。请记住,对于更复杂的行为和 UI,您可能希望尽可能地将逻辑与 UI 分开,并且还可能创建自己的用户控件,以便更轻松地以灵活的方式组合组件。