如何禁用 VS datagridview 中的第一个自动选择?

问题描述 投票:0回答:11

我在 Visual Studio (C#) 中创建了一个使用 datagridview 的应用程序。现在,当我分配该 datagridview 的数据源时,它会自动选择第一行,并执行我的代码进行选择。由于我经常重新分配该数据源,因此这是不可取的。有什么方法可以改变它,这样它就不会自动进行第一次选择,而只依赖于用户的选择?

谢谢!

回应 Darshan Joshi 的评论: 除了自动生成的代码之外,datagridview 上唯一改变的是将 AutoGenerateColumns 设置为 false,并设置 DataSource 属性。 我在我的选择更改委托中放置了一个 MessageBox.Show ,似乎每次设置数据源时它都会被调用三次。在数据加载之前一次,在数据加载之后两次。

我无法在加载时将 selected 设置为 false,因为数据源是在某些用户操作之后设置的,而不是在初始化时设置的。

c# winforms visual-studio datagridview datasource
11个回答
9
投票

您应该在事件:DataBindingComplete 之后调用:ClearSelection


2
投票

我遇到了同样的问题,这是我的解决方案。

棘手的部分是找到在哪里清除选择...我们只能在 DataGridView 设置选择后清除选择。起初,选择只准备在 Form.Load 事件中清除,但在 DataGridView.DataSource 的后续设置中,选择在 DataSource 分配后就可以直接清除。

public class DataGridView_AutoSelectSuppressed : DataGridView
{
    private bool SuppressAutoSelection { get; set; }

    public DataGridView_AutoSelectSuppressed() : base()
    {
        SuppressAutoSelection = true;
    }

    public new /*shadowing*/ object DataSource
    {
        get
        {
            return base.DataSource;
        }
        set
        {
            SuppressAutoSelection = true;
            Form parent = this.FindForm();

            // Either the selection gets cleared on form load....
            parent.Load -= parent_Load;
            parent.Load += parent_Load;

            base.DataSource = value;

            // ...or it gets cleared straight after the DataSource is set
            ClearSelectionAndResetSuppression();
        }
    }

    protected override void OnSelectionChanged(EventArgs e)
    {
        if (SuppressAutoSelection)
            return;

        base.OnSelectionChanged(e);
    }

    private void ClearSelectionAndResetSuppression()
    {
        if (this.SelectedRows.Count > 0 || this.SelectedCells.Count > 0)
        {
            this.ClearSelection();
            SuppressAutoSelection = false;
        }
    }

    private void parent_Load(object sender, EventArgs e)
    {
        ClearSelectionAndResetSuppression();
    }
}

希望这有帮助。


0
投票

您可以在 form_load 事件中取消选择它 喜欢

  private void Form1_Load(object sender, EventArgs e)
        {
                dataGridView1.Rows[0].Selected = false;
        }

0
投票

要加载网格而不进行任何选择,您可以使用此代码片段。

 GridView.CurrentCell = null;

这将简单地加载它,没有任何选择。将数据源分配给网格后添加此内容。


0
投票

确保您调用该方法从表单构造函数加载数据。如果你从 Form.load() 调用它

也在加载 myDataGridView 后执行此操作

myDataGridView.Rows[0].Selected = false;


0
投票

这对我有用:

在绑定数据之前取消注册 SelectionChanged 事件,然后重新注册该事件。 也许您应该删除设计器中事件的注册并在代码中手动注册事件。

myDGV.SelectionChanged -= new System.EventHandler(this.myDGV_SelectionChanged);


0
投票

您的经验可能会有所不同,但在我的工作中,当网格首次加载时,我经常遇到这个问题,尽管许多解决方案被发现是可以接受的(而且更多的是可笑的),但它们并非在所有情况下都有效。我发现最有效的一种解决方案(对我来说,您的经验和场景可能会有所不同)是处理 DataGridView.VisibleChanged:

    public ThingWithGrid() {
        Grid.VisibleChanged += Grid_VisibleChanged;
    }

    private void Grid_VisibleChanged(object sender, EventArgs e)
    {
        UpdateSelectedRows(InitialSelection);
        Grid.VisibleChanged -= Grid_VisibleChanged;
    }

0
投票

我认为最简单的解决方案是删除事件处理程序,分配新的数据源,清除选择并重新分配事件处理程序:

private void updateDataGridViewDataSource(%whatevertype% %whatever%) {
    dataGridView1.SelectionChanged -= new System.EventHandler(this.dataGridView1_SelectionChanged);
    dataGridView1.DataSource = %whatever%
    dataGridView1.ClearSelection();
    dataGridView1.SelectionChanged += new System.EventHandler(this.dataGridView1_SelectionChanged);
}

0
投票

对于我的情况,在我的

DataGridView_DataBindingComplete
处理程序中,一个更简单的解决方案就足够了:

DataGridView.ClearSelection();
if (DataGridView.Focused)
    DataGridView.DataBindingComplete -= DataGridView_DataBindingComplete;

0
投票

解决方案基于放置 .ClearSelection() 必要的次数。如果您在输入时检查方法,则可以在必要时直观地插入,在我的情况下,当我单击应用程序中菜单上的按钮时,我在数据网格视图中加载行,立即显示表单并选择第一行,但如果我检查输入 SelectionChanged() 的次数,我可以清除选择,但仅限必要的次数。

 Private veces_entrando As Integer = 0

 Private Sub DGVLista_SelectionChanged(sender As Object, e As EventArgs) Handles DGVLista.SelectionChanged

     veces_entrando = veces_entrando + 1

     If veces_entrando < 2 Then
        DGVLista.ClearSelection()
     End If

 End Sub

-1
投票

只需添加 SelectedItem="-1",就可以了

<DataGrid Name="dataGrid" SelectedItem="-1" />
© www.soinside.com 2019 - 2024. All rights reserved.