我有一个带有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;
}
}
答案 0 :(得分:0)
我同意这是奇怪的行为。如果您允许多选,它会按预期工作,但是当您不允许多选时,它似乎就像您调用_dataGridView.ClearSelection;
一样运行。我能看到的唯一解决方案是在取消选择之前简单地测试是否选择了有问题的行。
void _SelectButton_Click(object sender, EventArgs e)
{
if (_dataGridView.Rows[1].Selected)
{
_dataGridView.Rows[1].Selected = false;
}
}