如何以编程方式从 datagridview 中的一个单元格移动到另一个单元格? [英] How can I programmatically move from one cell in a datagridview to another?

查看:35
本文介绍了如何以编程方式从 datagridview 中的一个单元格移动到另一个单元格?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我只需要允许一个字符输入到可编辑的 datagridview 单元格中(每隔一列,奇数列都是可编辑的);如果用户在其中一个单元格中添加第二个字符,则光标应向下移动到下一个单元格并将第二个值放在那里(再次按下该键再次向下移动,依此类推).如果在网格的底部(第 12 行),它应该移动到第 0 行,并向右移动两列.

I need to only allow one character to be entered into the editable datagridview cells (every other column, the odd-numbered ones, are editable); if the user adds a second character while in one of these cells, the cursor should move to the next cell down and put that second value there (pressing again on that key moves down again, and so forth). If at the bottom of the grid (the 12th row), it should move to row 0 and also move two columns to the right.

我尝试这样做:

private void dataGridViewPlatypus_KeyDown(object sender, KeyEventArgs e) {
    var currentCell = dataGridViewPlatypus.CurrentCell;
    int currentCol = currentCell.ColumnIndex;
    int currentRow = currentCell.RowIndex;
    if (currentCell.Value.ToString().Length > 0) {
        if (currentRow < 11) {
            dataGridViewPlatypus.CurrentCell.RowIndex = currentRow+1;
        } else if (currentRow == 11) {
            currentCell.RowIndex = 0;
            currentCell.ColumnIndex = currentCell.ColumnIndex + 2;
            dataGridViewPlatypus.CurrentCell = currentCell;
        }
    }
}

...但我收到 RowIndex 和 ColumnIndex 无法分配的错误消息,因为它们是只读的.

...but I get err msgs that RowIndex and ColumnIndex cannot be assigned to, as they are readonly.

那么我怎样才能做到这一点?

So how can I accomplish this?

警告:我知道如果当前位于最后一个可编辑列的底部,我还必须添加逻辑以移动到第 1 列.

Caveat: I know that I will also have to add logic to move to column 1 if currently at the bottom of the last editable column.

从 tergiver 的回答来看,这是我到目前为止所得到的,但我不知道如何前进到下一个单元格.

From tergiver's answer, this is what I've got so far, but I don't know how to advance to the next cell.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
    if (this.ActiveControl == dataGridViewPlatypus)
    {
        var currentCell = dataGridViewPlatypus.CurrentCell;
        if (currentCell.Value.ToString().Length == 1) 
        {
            ;//Now what?
        }
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

更新 2

谢谢大家;这就是我用来让它几乎正常工作的方法(我仍然希望能够允许用户简单地按住键,并在后续单元格中连续输入该值):

UPDATE 2

Thanks all; this is what I'm using to get it pretty much working (I still want to be able to allow the user to simply hold the key down, and have that value continuously entered in subsequent cells):

private void dataGridViewPlatypus_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) {
    int columnIndex = (((DataGridView)(sender)).CurrentCell.ColumnIndex);
    if (columnIndex % 2 == 1) {
        e.Control.KeyDown -= TextboxNumeric_KeyDown;
        e.Control.KeyDown += TextboxNumeric_KeyDown;
        e.Control.KeyUp -= TextboxNumeric_KeyUp;
        e.Control.KeyUp += TextboxNumeric_KeyUp;
    }
}

private void TextboxNumeric_KeyDown(object sender, KeyEventArgs e) {
    var tb = sender as TextBox;
    if (tb != null) {
        tb.MaxLength = 1;
    }
}

// TODO: Now need to find a way to be able to just press down once
private void TextboxNumeric_KeyUp(object sender, KeyEventArgs e) {
    var tb = sender as TextBox;
    if (tb != null && tb.TextLength >= 1) {
        if (dataGridViewPlatypus.CurrentCell.RowIndex != dataGridViewPlatypus.Rows.Count - 1) {
            dataGridViewPlatypus.CurrentCell = dataGridViewPlatypus[
                dataGridViewPlatypus.CurrentCell.ColumnIndex,
                dataGridViewPlatypus.CurrentCell.RowIndex + 1];
        } else { // on last row
            this.dataGridViewPlatypus.CurrentCell = this.dataGridViewPlatypus.CurrentCell.ColumnIndex !=    dataGridViewPlatypus.Columns.Count - 1 ? this.dataGridViewPlatypus[this.dataGridViewPlatypus.CurrentCell.ColumnIndex    + 2, 0] : this.dataGridViewPlatypus[1, 0];
        }
    }
}

推荐答案

DataGridViewCurrentCell 属性有一个 setter,允许你传入一个新的单元格.

The CurrentCell property of the DataGridView has a setter, allowing you to pass in a new cell.

解决此问题的一种方法是处理网格的 EditingControlShowing 事件并将 KeyPress 处理程序附加到编辑控件,如下所示:

One approach to this problem is to handle the EditingControlShowing event of the grid and attach a KeyPress handler to the editing control like so:

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{                
    if ((int)(((System.Windows.Forms.DataGridView)(sender)).CurrentCell.ColumnIndex) == 1)
    {
        e.Control.KeyPress += TextboxNumeric_KeyPress;
    }
}

然后在按键处理程序中你有:

Then in the key press handler you have:

private void TextboxNumeric_KeyPress(object sender, KeyPressEventArgs e)
{
    TextBox tb = sender as TextBox;
     if (tb.TextLength >= 5)
     {
         dataGridView1.CurrentCell = dataGridView1[dataGridView1.CurrentCell.ColumnIndex + 1, dataGridView1.CurrentCell.RowIndex];
     }
}

上述逻辑当然不适合您的情况,但传入新 CurrentCell(从网格中检索所需单元格后)的原则仍然有效.

The logic above is of course not correct for your case but the principle of passing in a new CurrentCell (after retrieving the desired cell from the grid) stands.

这篇关于如何以编程方式从 datagridview 中的一个单元格移动到另一个单元格?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆