C 语言中的多个文本框数组#

Multiple textbox arrays in C#

提问人:Charles Willis 提问时间:11/15/2023 更新时间:11/15/2023 访问量:46

问:

我正在尝试生成一个小程序,供我的高尔夫俱乐部使用

18 个洞将有 1 到 4 名球员得分,所有 18 个洞都有标准杆值和杆数指数值。在另一组文本框中,还会有更好的球队得分来计算。

在 VBA for Access 中,我最终得到了 72 个文本框控件 - 每个控件最多有四个事件处理程序。复制、粘贴和编辑对于试运行来说效果很好,但我知道为这些控件设置数组一定更容易——主要是为了检查错误,除了我自己之外,用户不会尝试输入“四”之类的愚蠢的东西来获得分数或 5.2 或 -5。

除了所有这些文本框之外,其他一切都在控制之中。

我是 C# 的新手 - 我最后一次在 C+ 中真正编程是在 1990 年代,情况发生了一些变化!

还没有尝试过任何东西,因为我真的希望能够在设计时使用控件,而不必在每次代码运行时创建它们

C# 数组控件

评论

1赞 wohlstad 11/15/2023
可以在代码中创建控件(动态)并存储在数组/列表中。但缺点是您将无法在设计器中直观地编辑它们。也许你应该考虑另一种 UI 元素,比如 ListView/ListBox。
2赞 GSerg 11/15/2023
听起来你想要一个数据网格而不是文本框?

答:

-1赞 jdweng 11/15/2023 #1

我通常会创建一个类

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        const int FIRST_BOX_TOP = 50;
        const int FIRST_BOX_LEFT = 50;
        const int LABEL_HEIGHT = 20;
        const int BOX_HEIGTH = 20;
        const int BOX_WIDTH = 20;
        const int HEIGHT_SPACE = 10;
        const int WIDTH_SPACE = 10;
        const int HOLE_HEIGTH_SPACE = 40;
        const int HOLE_WIDTH_SPACE = 100;

        public Hole[] course = new Hole[18];
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            int holeNumber = 0;
            for (int row = 0; row < 2; row++)
            {
                for (int col = 0; col < 9; col++)
                {
                    Label label = new Label();
                    label.Height = LABEL_HEIGHT;
                    label.Text = "Hole " + (holeNumber + 1);
                    label.Top = FIRST_BOX_TOP + row * (HOLE_HEIGTH_SPACE + (4 * (BOX_HEIGTH + HEIGHT_SPACE)));
                    label.Left = FIRST_BOX_LEFT + (col * (HOLE_WIDTH_SPACE + WIDTH_SPACE));
                    this.Controls.Add(label);
                    Hole hole = new Hole();
                    for (int box = 0; box < 4; box++)
                    {
                        TextBox tbox = new TextBox();
                        tbox.Top = FIRST_BOX_TOP + LABEL_HEIGHT + row * (HOLE_HEIGTH_SPACE + HEIGHT_SPACE + (4 * ( BOX_HEIGTH + HEIGHT_SPACE))) + (box * (BOX_HEIGTH + HEIGHT_SPACE));
                        tbox.Left = FIRST_BOX_LEFT + (col * (HOLE_WIDTH_SPACE + WIDTH_SPACE));
                        tbox.Height = BOX_HEIGTH;
                        tbox.Width = BOX_WIDTH;
                        this.Controls.Add(tbox);

                        course[holeNumber] = hole;

                        hole.events[box] = tbox;
                    }
                    holeNumber++;
                }
            }

        }
    }

    public class Hole
    {
        public TextBox[] events = new TextBox[4];
    }


}

评论

0赞 jdweng 11/15/2023
我更新了答案以包含完整代码。
0赞 JonasH 11/15/2023 #2

假设您使用的是 Windows 窗体,您通常可以做一些简单的事情,例如

public class MyForm{

    public MyForm(){
       InitializeComponent();
       AllTextBoxes = new []{
           myTextbox1,
           myTextbox2,
           ...
          }

    }
    private TextBox[] AllTextBoxes {get;}

这允许您在一个循环中处理所有控件,例如

for(var i = 0; i < AllTextBoxes.Length; i++){
    var textbox = AllTextBoxes[i];
    textbox.TextChanged += OnTextChanged;

    // or use a lambda to specify arguments
    textbox.TextChanged += (o, e) => OnTextChanged(i);
}

你可能想要一些更复杂的方法来组织框,比如把分数的所有框放在一个数组中,索引代表一个球员。

但更好的解决方案是创建自定义用户控件。如果您有重复的元素,并且您可能有重复元素,请使用这些元素创建自定义控件,并在主窗体中创建此控件的多个实例。这需要一些学习和实验,但它可以大大简化您的应用程序。