提问人:Charles Willis 提问时间:11/15/2023 更新时间:11/15/2023 访问量:46
C 语言中的多个文本框数组#
Multiple textbox arrays in C#
问:
我正在尝试生成一个小程序,供我的高尔夫俱乐部使用
18 个洞将有 1 到 4 名球员得分,所有 18 个洞都有标准杆值和杆数指数值。在另一组文本框中,还会有更好的球队得分来计算。
在 VBA for Access 中,我最终得到了 72 个文本框控件 - 每个控件最多有四个事件处理程序。复制、粘贴和编辑对于试运行来说效果很好,但我知道为这些控件设置数组一定更容易——主要是为了检查错误,除了我自己之外,用户不会尝试输入“四”之类的愚蠢的东西来获得分数或 5.2 或 -5。
除了所有这些文本框之外,其他一切都在控制之中。
我是 C# 的新手 - 我最后一次在 C+ 中真正编程是在 1990 年代,情况发生了一些变化!
还没有尝试过任何东西,因为我真的希望能够在设计时使用控件,而不必在每次代码运行时创建它们
答:
-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);
}
你可能想要一些更复杂的方法来组织框,比如把分数的所有框放在一个数组中,索引代表一个球员。
但更好的解决方案是创建自定义用户控件。如果您有重复的元素,并且您可能有重复元素,请使用这些元素创建自定义控件,并在主窗体中创建此控件的多个实例。这需要一些学习和实验,但它可以大大简化您的应用程序。
评论