我有一个DataGridView,我用这种方式填充:偶数行包含用户不编辑的"常量"值。奇数行可以由用户编辑,但只能包含0或1个字符。如果单元格包含一个值,并且用户按下某个键,则应首先向下移动到下一个单元格,然后允许在下一个单元中输入该值。通过这种方式,用户可以继续按键,每次都会填充下面的单元格。
我有这样的代码(基于David Hall的代码:如何通过编程将数据网格视图中的一个单元格移动到另一个单元格?):
private void dataGridViewPlatypus_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
int columnIndex = (((DataGridView)(sender)).CurrentCell.ColumnIndex);
if (columnIndex % 2 == 1) {
e.Control.KeyPress += TextboxNumeric_KeyPress;
}
}
private void TextboxNumeric_KeyPress(object sender, KeyPressEventArgs e)
{
TextBox tb = sender as TextBox;
if (tb.TextLength >= 1)
{
dataGridViewPlatypus.CurrentCell = dataGridViewPlatypus[
dataGridViewPlatypus.CurrentCell.ColumnIndex,
dataGridViewPlatypus.CurrentCell.RowIndex + 1];
}
}
当我第一次在已经有值的单元格中输入val时,效果很好——它向下移动到下一个单元格,然后按键在那里输入值。不过,在那之后,它每次都会跳过一个单元格。IOW,如果我第一次在第5列第2行的单元格中输入"2",它将移动到第3行(好!);然后,它移动到第5行,跳过第4行。下一次按键时,它移动到第8行,跳过第6行和第7行,依此类推
为什么它会这样做,解决方案是什么?
更新
好吧,根据LarsTech下面的回答,我现在得到了这个代码:
private void dataGridViewPlatypus_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) {
int columnIndex = (((DataGridView)(sender)).CurrentCell.ColumnIndex);
if (columnIndex % 2 == 1) {
e.Control.KeyPress -= TextboxNumeric_KeyPress;
e.Control.KeyPress += TextboxNumeric_KeyPress;
}
}
private void TextboxNumeric_KeyPress(object sender, KeyPressEventArgs e) {
const int LAST_ROW = 11;
const int LAST_COL = 15;
TextBox tb = sender as TextBox;
if (tb.TextLength >= 1) {
if (dataGridViewPlatypus.CurrentCell.RowIndex != LAST_ROW) {
dataGridViewPlatypus.CurrentCell = dataGridViewPlatypus[
dataGridViewPlatypus.CurrentCell.ColumnIndex,
dataGridViewPlatypus.CurrentCell.RowIndex + 1];
} else { // on last row
if (dataGridViewPlatypus.CurrentCell.ColumnIndex != LAST_COL) {
dataGridViewPlatypus.CurrentCell =
dataGridViewPlatypus[dataGridViewPlatypus.CurrentCell.ColumnIndex + 2, 0];
} else // on last row AND last editable column
{
dataGridViewPlatypus.CurrentCell = dataGridViewPlatypus[1, 0];
}
}
}
}
然而,现在的问题是,如果我所在的单元格中输入了以前的值,它不会用输入的新值覆盖旧值。那么,有没有一种方法可以不在这个单元格中输入另一个值,同时允许一个新值替换单元格中的现有值?
您正在添加越来越多的按键事件:
e.Control.KeyPress += TextboxNumeric_KeyPress;
而不删除先前的按键事件。所以它多次调用它。
试着把它改成这样:
if (columnIndex % 2 == 1) {
e.Control.KeyPress -= TextboxNumeric_KeyPress;
e.Control.KeyPress += TextboxNumeric_KeyPress;
}