Rows Collection的Selected属性设置为true并不会更改DGV中的SelectedRow

时间:2017-03-21 12:55:28

标签: c# .net winforms datagridview

我试图实现在向上和向下箭头上触发的GlobalKeyPress事件,然后在DGV中更改所选行 - 简单,对吧?

但以下行并未更改所选行:

  

dgvArtikli.Rows [index ++] .Selected = true;

捕获的是什么?必须要有一些我不了解的财产或某些东西......

private void RegistarMainForm_KeyDown(object sender, KeyEventArgs e)
{
        if(e.KeyCode == Keys.Down)
        {
            MoveDown();
        }
        else if (e.KeyCode == Keys.Up)
        {
            MoveUp();
        }
    }

    private void MoveUp()
    {
        if (dgvArtikli.RowCount > 0)
        {
            if (dgvArtikli.SelectedRows.Count > 0)
            {
                int index = dgvArtikli.SelectedRows[0].Index;
                dgvArtikli.Rows[index--].Selected = true;
            }
        }
    }

    private void MoveDown()
    {
        if (dgvArtikli.RowCount > 0)
        {
            if (dgvArtikli.SelectedRows.Count > 0)
            {
                int index = dgvArtikli.SelectedRows[0].Index;
                dgvArtikli.Rows[index++].Selected = true;
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

您正在再次选择所选行,然后增加或减少索引:

  • 在postfix increment操作(index ++)中,操作的结果是操作数增加之前的值。
  • 同样在postfix decrement操作(index--)中,操作的结果是操作数递减之前的值。

您可以使用++index--index来解决此问题。此外,您需要对最后一行++或第一行--进行更好的验证。

作为更好的解决方案,即使ProcessCmdKey不包含,您也可以使用DataGridView来捕获箭头键对焦。

然后,您可以使用表单的BindingContext属性,找到DataGridView的绑定上下文,并增加或减少Position属性。 Position属性负责处理有效的位置范围。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.Up)
    {
        BindingContext[dataGridView1.DataSource, dataGridView1.DataMember].Position -= 1;
        return true;
    }
    if (keyData == Keys.Down)
    {
        BindingContext[dataGridView1.DataSource, dataGridView1.DataMember].Position += 1;
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}