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
相关产品推荐
相关产品推荐

