取消选中数据网格视图中的所有行

31

我有两个DataGridView,当我点击其中一个时,我希望取消选中第二个DataGridView中的所有选择项,我尝试了这个,但是没有起作用:

firstItemsDataGridView.ClearSelection();
firstItemsDataGridView.CurrentCell = null;

无法工作,

firstItemsDataGridView.ClearSelection();
if (firstItemsDataGridView.Rows.Count > 0)
    firstItemsDataGridView[1, 0].Selected = true;
firstItemsDataGridView.CurrentCell = null;
firstItemsDataGridView.ClearSelection();
foreach (DataGridViewRow item in firstItemsDataGridView.Rows) {
    item.Selected = false;

    foreach (DataGridViewCell itemCell in firstItemsDataGridView.Columns) {
        itemCell.Selected = false;
    }
}

无法工作。

firstItemsDataGridView.Rows[0,-1].Selected = true;

也不起作用。

我已将选择模式设置为整行选择,但我不知道如何实现我的目标。
非常感谢!


firstItemsDataGridView 是期望的网格吗?您是否再次分配了数据源? - V4Vendetta
firstItemsDataGridView是一个网格,我需要取消选择所有项目,我没有使用任何数据源(绑定)。 - Martin Ch
设置 CurrentCell=null 应该可以解决问题,但是这样网格中的数据如何显示/添加呢? - V4Vendetta
9个回答

82
dataGridView1.ClearSelection();

应该可以正常工作。也许您有自动选择行的代码被触发了?


4
别太早下结论! - TaW
将它放在dataGridView1.MouseDown事件中运行得非常好。 - John Doe

6

4

由于没有答案,在其他帖子中使用了这个答案,我遇到了同样的问题,即选中第一行并且无法取消选择:

Color blue  = ColorTranslator.FromHtml("#CCFFFF");
Color red = ColorTranslator.FromHtml("#FFCCFF");
Color letters = Color.Black;

foreach (DataGridViewRow r in datagridIncome.Rows)
{
    if (r.Cells[5].Value.ToString().Contains("1")) { 
        r.DefaultCellStyle.BackColor = blue;
        r.DefaultCellStyle.SelectionBackColor = blue;
        r.DefaultCellStyle.SelectionForeColor = letters;
    }
    else { 
        r.DefaultCellStyle.BackColor = red;
        r.DefaultCellStyle.SelectionBackColor = red;
        r.DefaultCellStyle.SelectionForeColor = letters;
    }
}

这是一个小技巧,你唯一能看到选中的行是通过第一列(不是 column[0],而是因此列)。当您单击另一行时,您将不再看到蓝色选择,只有箭头表示哪一行被选中。

解决方案:

我发现了为什么我的第一行是默认选中的,并找到了如何取消默认选择它。

默认情况下,我的 datagridview 是窗体上第一个 Tab 键停留点的对象。将另一个对象设置为第一个 Tab 键停留点(可能完全禁用 datagrid 的 tabstop 也可以奏效)即可禁用选择第一行。


dataGridView1.ClearSelection(); - M. Fawad Surosh

1
我尝试过这个,它对我有效:


for (int i = 0; i < dataGridView1.Rows.Count;i++)
{
  dataGridView1.Rows[i].Selected = false;
}

1

只需使用:

dgvName.ClearSelection();


0
正如@Taw在顶部答案的子评论中所说:“不要太早调用它!”。

在我的情况下,默认行为根本不起作用。我的情况是在tabControl的tab中使用datagrid,如果该tab之前没有显示,则不起作用!

这个hack非常好用:

AnyTabControl.SelectedTab = FirsTab;
gridModules.ClearSelection(); //placed at first tab
AnyTabControl.SelectedTab = SecondTab; //that tab i would like to show first

作为结果:第二个选项卡将显示给用户,当他点击第一个选项卡时,选择不会出现。

0
// no selection in dgv at the begening   
dgv.FirstDisplayedCell = null;
dgv.ClearSelection();
// try this it is working !

0

确保所有行都没有被选中(dataGridView.Rows[...].Selected = false)

第零行默认为选中状态,因此在打开DataGridView时设置dataGridView.Rows[0].Selected = false,并且只要其他选项设置得当以防止用户选择,则您将保持无任何选中状态。


0
如果您正在使用 WPF 并希望保持 MVVM 设计模式,您可以将两个选定项绑定到同一属性,这样当您选择一个选项时,另一个选项将自动取消选择。
尝试类似以下的代码:
public class SingletonClass
{
    private static SingletonClass _Instance;
    public static SingletonClass Instance
    {
        get
        {
            if (_Instance == null)
                _Instance = new SingletonClass();
            return _Instance;
        }
    }   // End Property Instance

    private object _SelectedItem;
    public object SelectedItem
    {
        get { return _SelectedItem; }
        set { _SelectedItem = value; }
    } // End Selected Item
 }

<DataGrid Name="Datagrid1" SelectedItem="{Binding Source={x:Static Const:SingletonClass.Instance},Path=SelectedItem,IsAsync=True}">

<DataGrid Name="Datagrid2" SelectedItem="{Binding Source={x:Static Const:SingletonClass.Instance},Path=SelectedItem,IsAsync=True}">

我只使用了单例类,因为它可以在不同的视图和实例中工作,如果你在同一个视图中,可以使用普通类。

请注意在xmal中的IsAsync=True,如果你计划在不同的视图中使用单例类,没有它将无法工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接