0

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

似乎设置任何行的Selected属性会导致控件将其视为选择行,从而取消选择任何先前选择的行。我将Selected属性设置为这一事实false并没有改变这种行为。MultiSelect这仅在设置为falseSelectionMode设置为时才会发生 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;
    }
}
4

1 回答 1

0

我同意这是奇怪的行为。如果您允许多选,它会按预期工作,但是当您不允许多选时,它似乎就像您调用_dataGridView.ClearSelection;. 我能看到的唯一解决方案是在取消选择之前简单地测试是否选择了相关行。

void _SelectButton_Click(object sender, EventArgs e)
{
    if (_dataGridView.Rows[1].Selected)
    {
        _dataGridView.Rows[1].Selected = false;
    }            
}
于 2013-02-04T20:31:49.000 回答