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

时间:2012-09-19 12:29:54

标签: c# winforms visual-studio datagridview datasource

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

谢谢!

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

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

9 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

棘手的部分是找到清除选择的位置......我们只能在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();
    }
}

希望这有帮助。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

要在没有任何选择的情况下加载网格,您可以使用此代码段。

 GridView.CurrentCell = null;

这将加载它,没有任何选择。在将数据源分配给网格后添加此项。

答案 4 :(得分:0)

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

中调用它

加载myDataGridView后也执行此操作

myDataGridView.Rows [0] .Selected = false;

答案 5 :(得分:0)

这对我有用:

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

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

答案 6 :(得分:0)

您的经验可能会有所不同,但是在我的工作中,我经常会在网格第一次加载时对此进行抗衡,尽管发现许多解决方案都是可以接受的(而且很多解决方案都是荒谬的),但它们并不能在每种情况下都起作用。我发现最有效的一种解决方案(对我来说,您的经验和方案可能会有所不同)正在处理DataGridView.VisibleChanged:

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

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

答案 7 :(得分: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);
}

答案 8 :(得分:-1)

只需添加SelectedItem =“ - 1”,这就可以了解

<DataGrid Name="dataGrid" SelectedItem="-1" />