1

我有一个以这种方式填充的 DataGridView:偶数行包含用户不能编辑的“常量”值。奇数行可由用户编辑,但只能包含 0 或 1 个字符。如果单元格包含一个值并且用户按下一个键,它应该首先向下移动到下一个单元格,然后允许在下一个单元格中输入该值。通过这种方式,用户可以继续按下一个键,并且每次都会填充下面的单元格。

我有这段代码(基于 David Hall 的代码:如何以编程方式从 datagridview 中的一个单元格移动到另一个单元格?):

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];
            }
        }
    }
}

但是,现在的问题是,如果我在一个输入了先前值的单元格中,它不会用输入的新值覆盖旧值。那么有没有办法不在这个单元格中输入另一个值,同时允许一个新值替换单元格中的现有值?

4

1 回答 1

1

您正在添加越来越多的按键事件:

e.Control.KeyPress += TextboxNumeric_KeyPress;

不删除以前的按键事件。所以它多次调用它。

尝试将其更改为以下内容:

if (columnIndex % 2 == 1) {
  e.Control.KeyPress -= TextboxNumeric_KeyPress;
  e.Control.KeyPress += TextboxNumeric_KeyPress;
}
于 2012-09-04T16:48:15.270 回答