You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中多文本框数组实现:高尔夫俱乐部计分程序开发需求

解决方案:设计时创建文本组实现批量输入校验

核心思路

不用动态生成控件,靠统一命名规范+共享事件处理程序实现类似"数组"的效果,彻底避免重复编写72个文本框的校验逻辑。

步骤1:统一命名所有文本框

在Visual Studio设计界面拖放所需文本框,按固定规则命名:

  • 球员1的18洞成绩:txtScore_P1_H1 ~ txtScore_P1_H18
  • 球洞标准杆:txtPar_H1 ~ txtPar_H18
  • 杆数指数:txtHandicap_H1 ~ txtHandicap_H18
    命名规则要清晰区分控件类型、归属(球员/标准杆/指数)和编号,方便后续识别。

步骤2:绑定共享校验事件

选中所有需要校验的文本框(按住Ctrl批量点选),在属性窗口的事件标签中,双击KeyPress和Validating,生成共享事件处理程序——所有选中的文本框都会共用这两个事件。

实时拦截非法输入(KeyPress事件)

在用户按键时直接过滤非正整数的输入:

private void GolfTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
    // 仅允许数字和退格键
    if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar))
    {
        e.Handled = true;
    }
    // 禁止输入0开头的多位数(高尔夫杆数至少为1)
    if (e.KeyChar == '0' && ((TextBox)sender).Text.Length == 0)
    {
        e.Handled = true;
    }
}

失去焦点时二次校验(Validating事件)

防止用户通过粘贴等方式输入负数、小数或字符串:

private void GolfTextBox_Validating(object sender, CancelEventArgs e)
{
    var textBox = (TextBox)sender;
    if (string.IsNullOrWhiteSpace(textBox.Text))
    {
        textBox.Text = "";
        return;
    }
    // 校验是否为正整数
    if (!int.TryParse(textBox.Text, out int value) || value < 1)
    {
        MessageBox.Show($"请输入正整数(当前输入:{textBox.Text})", "输入错误");
        e.Cancel = true; // 锁定文本框,直到输入正确
        textBox.SelectAll(); // 选中错误内容方便修改
    }
}

步骤3:区分不同控件的校验规则(可选)

如果需要给标准杆设置特殊规则(比如只能是3-5),可以通过文本框的Tag属性区分:

private void GolfTextBox_Validating(object sender, CancelEventArgs e)
{
    var textBox = (TextBox)sender;
    if (string.IsNullOrWhiteSpace(textBox.Text))
    {
        textBox.Text = "";
        return;
    }
    if (!int.TryParse(textBox.Text, out int value))
    {
        MessageBox.Show("请输入正整数", "输入错误");
        e.Cancel = true;
        textBox.SelectAll();
        return;
    }
    // 根据Tag判断控件类型
    if (textBox.Tag?.ToString() == "Par")
    {
        if (value < 3 || value > 5)
        {
            MessageBox.Show("标准杆只能是3-5之间的整数", "输入错误");
            e.Cancel = true;
            textBox.SelectAll();
        }
    }
    else
    {
        if (value < 1)
        {
            MessageBox.Show("请输入大于0的整数", "输入错误");
            e.Cancel = true;
            textBox.SelectAll();
        }
    }
}

使用时,在设计界面给所有标准杆文本框的Tag属性设为Par即可。

批量处理控件值的小技巧

如果需要计算团队成绩,可以通过命名规则筛选控件:

// 获取球员1的所有成绩
var player1Scores = Controls.OfType<TextBox>()
    .Where(tb => tb.Name.StartsWith("txtScore_P1_"))
    .Select(tb => int.Parse(tb.Text))
    .ToList();

内容的提问来源于stack exchange,提问作者Charles Willis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:25:20