2

私はデータグリッドビューで問題に直面しています。タブフォーカスを変更するためにキーダウンイベントでいくつかのコードを実行しましたが、タブが列の最後に到達するとエラーが発生します

「現在のセルを非表示のセルに設定することはできません」。

そのセルを表示したくないので、最後のセルを非表示にしました。

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);
  }
}
4

2 に答える 2

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);
        }
    }
于 2013-08-02T13:38:01.647 に答える
2

非表示のセルを選択しようとすると、このエラーが発生します。また、バグがあるため、データグリッドビューで行を非表示に設定しないでください。

解決策の 1 つは、行を非表示に設定する代わりに、データ ソースをフィルター処理して、必要なレコードのみを取得することです。これは遅くなりますが、回避策として役立ちます。

また

以下を使用して試すことができます(テストされていません)

cm.SuspendBinding();
dataGridView1.Rows[0].Visible = false; // Set your datatgridview invisible here
cm.ResumeBinding();
于 2013-08-02T13:54:07.993 に答える