10

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

谢谢!

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

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

4

10 回答 10

9

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

于 2014-03-13T09:35:13.087 回答
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();
    }
}

希望这可以帮助。

于 2013-06-14T15:08:07.570 回答
0

您可以在 form_load 事件中取消选择它,例如

  private void Form1_Load(object sender, EventArgs e)
        {
                dataGridView1.Rows[0].Selected = false;
        }
于 2012-09-19T12:49:36.443 回答
0

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

 GridView.CurrentCell = null;

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

于 2014-02-25T07:27:38.010 回答
0

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

在加载 myDataGridView 之后也这样做

myDataGridView.Rows[0].Selected = false;

于 2015-11-01T19:52:40.650 回答
0

这对我有用:

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

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

于 2017-05-05T16:51:45.563 回答
0

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

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

    private void Grid_VisibleChanged(object sender, EventArgs e)
    {
        UpdateSelectedRows(InitialSelection);
        Grid.VisibleChanged -= Grid_VisibleChanged;
    }
于 2019-01-27T18:12:33.293 回答
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);
}
于 2021-05-04T13:23:51.733 回答
0

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

DataGridView.ClearSelection();
if (DataGridView.Focused)
    DataGridView.DataBindingComplete -= DataGridView_DataBindingComplete;
于 2022-01-13T21:27:04.057 回答
-1

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

<DataGrid Name="dataGrid" SelectedItem="-1" />
于 2015-04-09T23:50:06.847 回答