gpt4 book ai didi

c# - 如何以编程方式从 datagridview 中的一个单元格移动到另一个单元格?

转载 作者:可可西里 更新时间:2023-11-01 13:58:12 25 4
gpt4 key购买 nike

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

我试过这样做:

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 的错误消息,因为它们是只读的。

那么我该如何实现呢?

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

更新

根据 tergiver 的回答,这就是我到目前为止所得到的,但我不知道如何前进到下一个单元格。

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

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

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,允许您传入一个新的单元格。

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

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

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

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 的原理(在从网格中检索所需的单元格之后)仍然有效。

关于c# - 如何以编程方式从 datagridview 中的一个单元格移动到另一个单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12206478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com