无法将CurrentCell焦点设置为DataGridView中的第一个可编辑列

时间:2015-02-12 21:09:01

标签: c# winforms

我正在尝试以编程方式选择datagridview的第一个可编辑列,但不能。

隐藏第0列和第1列。第2列是只读的,显示行号。第3列和第3列是可编辑的。

如果我这样做:

grd.CurrentCell = grd.Rows[x].Cells[2];

计算机实际发出蜂鸣声并选择第一个只读列,而不是选择第一个可编辑列。

如果我这样做:

grd.CurrentCell = grd.Rows[x].Cells[3];

正确选择(聚焦)第三个可见列(第二个可编辑列)。我无法选择第二个可见列(第一个可编辑列)。我做错了什么?

要回答我何时选择列的问题,它是在上一行的最后一个标签事件期间。我有一个类来继承DataGridView。以下是该类中的相关代码:

...

protected override bool ProcessDialogKey(Keys keyData)
        {

            switch (keyData)
            {
                case Keys.Tab:
                    // Check if the tab key was pressed in the last column/row
                    if (currentCol == this.ColumnCount - 1 && currentRow == this.RowCount - 1)
                    {
                        LastTabReachedEventArgs ev = new LastTabReachedEventArgs();
                        ev.currentCol = currentCol;
                        ev.currentRow = currentRow;
                        OnLastTabReached(this, ev);
                        return false;
                    }
                    break;
                case Keys.Enter:
                    // nothing to do
                    break;
            }
            return base.ProcessDialogKey(keyData);

        }

正如您所看到的,最后一列引发了OnLastTabReached,它在我的表单中处理,以选择下一条记录的第一个可编辑列。失败了:

 private void grd_LastTabReachedEvent(object sender, LastTabReachedEventArgs e)
        {

    grd.CurrentCell = grd.Rows[x].Cells[2];
}

但如果我选择任何其他列,则有效:

 private void grd_LastTabReachedEvent(object sender, LastTabReachedEventArgs e)
        {
     grd.CurrentCell = grd.Rows[x].Cells[3];
}

我检查可编辑列的设置,它们都具有相同的DataGridViewCell设置。

先谢谢

更新#1

有些事情很奇怪。我尝试使用网格单元的名称而不是索引号。它选择下一列!显示的字段布局如下:

  1. 行号(只读)dgvLineNum
  2. 联系人姓名(可编辑)dgvContactName
  3. 联系电话(可编辑)dgvContactPhone
  4. 联系电子邮件(可编辑)dgvContactEmail
  5. 如果我执行以下操作以在新行上选择联系人姓名:

    grd.CurrentCell = grd.Rows[iNewLineNum - 1].Cells["dgvContactName"];
    

    它选择(聚焦)下一列dgvContactPhone。

    如果我执行以下操作选择新线路上的联系电话:

    grd.CurrentCell = grd.Rows[iNewLineNum - 1].Cells["dgvContactPhone"];
    

    它选择下一列dgvContactEmail。

    但是,如果我选择:

    grd.CurrentCell = grd.Rows[iNewLineNum - 1].Cells["dgvLineNum"];
    

    它确实选择(只读选择)第一列(行号)。

    更新#2

    我已按下最后一栏中的标签键放置了一个可轻松重现问题的示例项目:

    http://s000.tinyupload.com/index.php?file_id=01137880750225210507

    解决方案

    请参阅LarsTech提供的以下解决方案。这解决了它(在ProcessDialogKey方法中返回true而不是false):

    ...

    LastTabReachedEventArgs ev = new LastTabReachedEventArgs();
    ev.currentCol = currentCol;
    ev.currentRow = currentRow;
    OnLastTabReached(this, ev);
    return true;
    

    ...

1 个答案:

答案 0 :(得分:0)

如果您质疑为什么您选择的列总是选择下一个单元格,那是因为您没有返回" true"在ProcessDialogKey函数中。你正在返回" false",它告诉DataGridView控件继续按键,所以它会逻辑地" tab"到下一个细胞。

LastTabReachedEventArgs ev = new LastTabReachedEventArgs();
ev.currentCol = currentCol;
ev.currentRow = currentRow;
OnLastTabReached(this, ev);
return true;