首页 文章

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

提问于
浏览
1

我有一个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);
            }
        }
     }
}

NOTE: 如你所见,当我按 Alt+keyDown 时,dgv索引会增加并更改为更多一步 .
我的问题是当我按 Alt+keyDown 索引更改并选择 but the value won't get new value until I press again Alt+keyDown twice!
有没有必须在那里编写代码的事件?谢谢 :)

1 回答

  • 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() ,因为当您使用快捷方式在行之间导航时,您不需要焦点,但如果您因任何原因需要它,请使用它 .

相关问题