当前单元格不能设置为datagridview中的不可见单元格

时间:2013-08-02 13:34:28

标签: c# winforms

我在datagridview中遇到问题。我在keydown事件中做了一些代码来更改选项卡焦点但是当tab到达列的最后一个时它会给出错误

  

“当前单元格不能设置为不可见单元格”。

我让最后一个单元格看不见,因为我不希望看到那个单元格。

我在KeyDown事件中编写了以下代码

private void m3dgvDepositDetails_KeyDown(object sender, KeyEventArgs e)
{
  try
  {
    if (e.KeyCode == Keys.Tab && notlastColumn)
    {
      e.SuppressKeyPress = true;
      int iColumn = m3dgvDepositDetails.CurrentCell.ColumnIndex;
      int iRow = m3dgvDepositDetails.CurrentCell.RowIndex;
      if (iColumn == m3dgvDepositDetails.Columns.Count - 1)
        m3dgvDepositDetails.CurrentCell = m3dgvDepositDetails[0, iRow + 1];
      else
        m3dgvDepositDetails.CurrentCell = m3dgvDepositDetails[iColumn + 1, iRow];
    }
  }
  catch (Exception ex)
  {
    CusException cex = new CusException(ex);
    cex.Show(MessageBoxIcon.Error);
  }
}

2 个答案:

答案 0 :(得分:4)

错误非常明显:您将CurrentCell设置为不可见单元格并且禁止使用,这意味着单元格的行将隐藏单元格的列。为避免这种情况,请勿在设置Visible之前隐藏行/列或检查CurrentCell属性。

如果问题是你应该使用的最后一栏:

private void m3dgvDepositDetails_KeyDown(object sender, KeyEventArgs e)
    {
        try
        {
            if (e.KeyCode == Keys.Tab && notlastColumn)
            {
                e.SuppressKeyPress = true;
                int iColumn = m3dgvDepositDetails.CurrentCell.ColumnIndex;
                int iRow = m3dgvDepositDetails.CurrentCell.RowIndex;
                if (iColumn >= m3dgvDepositDetails.Columns.Count - 2)
                    m3dgvDepositDetails.CurrentCell = m3dgvDepositDetails[0, iRow + 1];
                else
                    m3dgvDepositDetails.CurrentCell = m3dgvDepositDetails[iColumn + 1, iRow];

            }
        }
        catch (Exception ex)
        {
            CusException cex = new CusException(ex);
            cex.Show(MessageBoxIcon.Error);
        }
    }

答案 1 :(得分:0)

尝试选择隐藏的单元格时会发生此错误。此外,您不应该在datagridview中将行设置为不可见,因为它有错误。

一种解决方案不是将行设置为不可见,而只是过滤数据源并仅获取您想要的那些记录。这将是缓慢的,但可以作为一种解决方法。

您可以尝试使用以下(未测试)

cm.SuspendBinding();
dataGridView1.Rows[0].Visible = false; // Set your datatgridview invisible here
cm.ResumeBinding();