在第一个索引更改时获取datagridview单元格值

时间:2016-11-25 19:34:09

标签: c# winforms datagridview

我有一个datagridview(dgv)并为它设置了一些快捷方式。我想在dgv selectedIndexChanged时得到我想要的单元格值。 这就是我为selectedIndexChanged事件所做的事情:

if (dgv.Rows.Count > 0)
{
      lblId.Text = dgv.CurrentRow.Cells[0].Value.ToString();
      lblStaffName.Text = dgv.CurrentRow.Cells[1].Value.ToString();
      lblStock.Text = dgv.CurrentRow.Cells[4].Value.ToString();  
}

并为我的dgv定义了一些快捷方式。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
  if (keyData == (Keys.Alt | Keys.Down))
   {
      if (dgv.Rows.Count > 0)
       {
          dgv.Focus();
          if (dgv.CurrentRow.Index < (dgv.Rows.Count - 1))
            {
                dgv.Rows[dgv.CurrentRow.Index + 1].Selected = true;
                dgv.FirstDisplayedScrollingRowIndex = dgv.CurrentRow.Index + 1;
                pnl.BackColor = Color.FromKnownColor(KnownColor.Lime);
            }
        }
     }
}

注意:正如您所看到的,当我按Alt+keyDown时,dgv索引会增加并更改为更多一步。
我的问题是当我按下Alt+keyDown索引更改并选择了但是值不会获得新值,直到我再次按Alt+keyDown两次!
有没有必须在那里编写代码的事件?谢谢:))

1 个答案:

答案 0 :(得分:1)

要更改数据绑定DataGridView中的所选索引,最好以这种方式依赖绑定上下文:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == (Keys.Alt | Keys.Down))
    {
        var bc = dgv.BindingContext[dgv.DataSource, dgv.DataMember];
        if (bc.Position < bc.Count - 1)
            bc.Position++;
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

但是如果DataGridView不是数据绑定或只是为了学习目的而你想修复你的代码,你可以编写这样的代码:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == (Keys.Alt | Keys.Down))
    {
        if (dgv.CurrentCell == null)
        {
            if (dgv.ColumnCount >= 1 && dgv.RowCount >= 1)
            {
                dgv.CurrentCell = dgv[0, 0];
                return true;
            }
        }
        else
        {
            var rowIndex = dgv.CurrentCell.RowIndex;
            var columnIndex = dgv.CurrentCell.ColumnIndex;
            if (rowIndex < dgv.RowCount - 1)
            {
                dgv.CurrentCell = dgv[columnIndex, rowIndex + 1];
                return true;
            }
        }
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

我还删除了dgv.Focus(),因为当您使用快捷方式在行之间导航时,您不需要关注,但如果您因任何原因需要它,请使用它。