不同面板之间如何交互?

问题描述 投票:0回答:1

我需要使不同的文本框彼此交互,即使它们位于不同的面板中,并在 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 。我怎样才能做到这一点?谢谢。

c# visual-studio-2010 foreach panel
1个回答
0
投票

您不需要使用不同的面板。假设您有文本框:

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 分开,并且还可能创建自己的用户控件,以便更轻松地以灵活的方式组合组件。

© www.soinside.com 2019 - 2024. All rights reserved.