C#非绑定数据库DataGridView单元格互斥置零及数值输入限制需求
解决未绑定数据库的C# DataGridView两个需求:互斥单元格赋值+数值输入限制
一、实现单元格“c”和“d”的互斥赋值逻辑
要实现当“c”单元格值>0时把“d”设为0,反之亦然,你可以监听DataGridView的CellValueChanged事件,在值变化时触发判断和赋值:
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { DataGridView dgv = sender as DataGridView; if (dgv == null) return; string columnName = dgv.Columns[e.ColumnIndex].Name; if (columnName != "c" && columnName != "d") return; if (!decimal.TryParse(dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value?.ToString(), out decimal currentValue)) return; int targetColumnIndex = columnName == "c" ? dgv.Columns["d"].Index : dgv.Columns["c"].Index; if (currentValue > 0) { dgv.Rows[e.RowIndex].Cells[targetColumnIndex].Value = 0; } }
关键点说明:
- 先判断操作列是否为目标列,避免无关单元格触发逻辑
- 用
decimal.TryParse做值转换,兼容空值或非数值的容错场景 - 动态获取目标列索引,让代码更灵活适配列位置变化
二、限制“c”“d”列对应的文本框仅允许输入数值
通过监听EditingControlShowing事件,给编辑状态的文本框添加KeyPress事件过滤输入:
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { DataGridView dgv = sender as DataGridView; if (dgv == null) return; if (dgv.CurrentCell.OwningColumn.Name != "c" && dgv.CurrentCell.OwningColumn.Name != "d") return; TextBox txtBox = e.Control as TextBox; if (txtBox != null) { txtBox.KeyPress -= txtBox_KeyPress; txtBox.KeyPress += txtBox_KeyPress; } } private void txtBox_KeyPress(object sender, KeyPressEventArgs e) { // 允许数字、退格键、小数点(不需要小数可去掉小数点判断) if (!char.IsDigit(e.KeyChar) && e.KeyChar != '\b' && e.KeyChar != '.') { e.Handled = true; } // 限制只允许一个小数点 TextBox txtBox = sender as TextBox; if (e.KeyChar == '.' && txtBox.Text.Contains(".")) { e.Handled = true; } }
关键点说明:
- 每次编辑控件显示时先移除旧事件绑定,防止重复触发
- 可根据需求调整允许的字符,比如只需要整数就删除小数点相关判断
- 用
e.Handled = true直接阻止非合规字符输入
内容的提问来源于stack exchange,提问作者Super999
相关产品推荐
相关产品推荐

