C# 为什么取消选择特定的DataGridViewRow也会取消选择所有其他行?

C# 为什么取消选择特定的DataGridViewRow也会取消选择所有其他行?,c#,winforms,datagridview,C#,Winforms,Datagridview,我有一个带有DataGridView的表单。基于某些条件,我以编程方式取消选择一行(通过将Selected设置为false)。但是当我这样做的时候,如果当前选择了另一行,它也会被取消选择。我已将DataGridView设置为MultiSelect=false。用户应该只能选择一行 似乎设置任何行的Selected属性都会使控件将其视为选择该行,从而取消选择以前选择的任何行。我将Selected属性设置为false这一事实不会改变这种行为。仅当MultiSelect设置为false且Selecti

我有一个带有DataGridView的表单。基于某些条件,我以编程方式取消选择一行(通过将
Selected
设置为
false
)。但是当我这样做的时候,如果当前选择了另一行,它也会被取消选择。我已将DataGridView设置为
MultiSelect=false
。用户应该只能选择一行

似乎设置任何行的
Selected
属性都会使控件将其视为选择该行,从而取消选择以前选择的任何行。我将
Selected
属性设置为
false
这一事实不会改变这种行为。仅当
MultiSelect
设置为
false
SelectionMode
设置为
FullRowSelect
时,才会发生这种情况

如果属性当前为
true
,则只能通过设置属性来解决此问题

if (row.Selected) row.Selected = false;
但我想知道为什么会这样。为什么仅当SelectionMode设置为FullRowSelect时

完整示例

下面的示例代码包含一个完整的工作示例。构造函数将添加三行。单击该按钮将取消选择中间行。但是,无论单击按钮之前选择了哪一行,最终结果都是没有选择任何行

using System;
using System.Windows.Forms;

class MainForm : Form
{
    static void Main() { Application.Run(new MainForm()); }

    private DataGridView _dataGridView;
    private Button _SelectButton;

    public MainForm()
    {
        _dataGridView = new DataGridView
        { ReadOnly = true, AllowUserToAddRows = false };
        _dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        _dataGridView.Dock = DockStyle.Fill;
        _dataGridView.MultiSelect = false;
        _dataGridView.Columns.Add(new DataGridViewColumn
        { CellTemplate = new DataGridViewTextBoxCell() });
        _dataGridView.Rows.Add("1");
        _dataGridView.Rows.Add("2");
        _dataGridView.Rows.Add("3");
        Controls.Add(_dataGridView);
        _SelectButton = new Button { Text = "Deselect middle row" };
        _SelectButton.Click += _SelectButton_Click;
        _SelectButton.Dock = DockStyle.Bottom;
        Controls.Add(_SelectButton);
    }

    void _SelectButton_Click(object sender, EventArgs e)
    {
        _dataGridView.Rows[1].Selected = false;
    }
}

我同意这是一种奇怪的行为。如果您允许multi-select,它将按预期工作,但当您不允许multi-select时,它似乎会像调用
\u dataGridView.ClearSelection一样工作。我能看到的唯一解决方案是,在取消选择该行之前,简单地测试该行是否被选中

void _SelectButton_Click(object sender, EventArgs e)
{
    if (_dataGridView.Rows[1].Selected)
    {
        _dataGridView.Rows[1].Selected = false;
    }            
}

我已经接受了你的回答,虽然它不能解释为什么会发生这种情况。但我不期待有更好的答案。