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

Posted

技术标签:

【中文标题】如何禁用 VS datagridview 中的第一个自动选择?【英文标题】:How can one disable the first autoselect in a VS datagridview? 【发布时间】:2012-09-11 18:17:55 【问题描述】:

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

谢谢!

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

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

【问题讨论】:

这是奇怪的行为,它不能自动选择值,你能显示你的代码,它可能有助于掌握错误是什么。 【参考方案1】:

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

【讨论】:

这将是理想的解决方案,但它不会抑制仍为“幻像”选择触发的 SelectionChanged 事件 如果您不使用数据绑定,则在 dataGrid 第一次变为可见时调用 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();
    

希望这会有所帮助。

【讨论】:

呵呵,老实说,我的朋友,我现在已经辞掉了工作,所以理论上它没有帮助:P 但是,非常有趣,谢谢。看起来如此简单的事情需要一个如此笨拙的解决方案,这很奇怪。我不喜欢在 C# 中编码的原因之一 - 幕后发生的事情太多,您无法立即控制。不过,再次感谢您的回复,也许这会在未来帮助其他不幸的灵魂! @Pino 哈哈!!厉害了,找个好伙伴解决诸如 DataGridViews 之类的不良行为似乎需要付出太多努力,我一直希望有一个更优雅的解决方案。有时感觉就像我在使用 Heath Robinson 机器,但随后以他们期望的方式使用,性能会非常出色。 我尝试了您的解决方案,但它似乎并没有真正起作用。 @leetNightshade 非常抱歉该解决方案对您不起作用。我刚刚尝试了一个新的 WinForm 项目 .Net3.5 和 .Net4 工作正常,但如果我可能会问有什么类型的故障?还是只是选择第一行?还是抛出异常之类的? @user2433394 第一行仍在被选中,是的。尽管我为我的问题找到了一个效果很好的替代解决方案。我只是在修改列表之前保存了选择,如果选择与旧选择不匹配,我会将其恢复为原来的状态。因此,当您有一个要添加数据的位置时,此解决方案有效,因此您可以在添加数据之前进行设置以处理自动选择。你的会更理想一点,从源头截取。【参考方案3】:

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

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

【讨论】:

这可能会解决症状,但不能解决根本问题 解决为什么我没有选择这个答案:如果数据源是在用户交互而不是表单加载之后设置的,它不会解决症状。【参考方案4】:

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

 GridView.CurrentCell = null;

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

【讨论】:

【参考方案5】:

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

在 myDataGridView 加载后也这样做

myDataGridView.Rows[0].Selected = false;

【讨论】:

【参考方案6】:

这对我有用:

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

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

【讨论】:

【参考方案7】:

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

    public ThingWithGrid() 
        Grid.VisibleChanged += Grid_VisibleChanged;
    

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

【讨论】:

【参考方案8】:

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

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);

【讨论】:

【参考方案9】:

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

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

【讨论】:

【参考方案10】:

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

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

【讨论】:

它没有被标记,但问题是 WinForms 问题。

以上是关于如何禁用 VS datagridview 中的第一个自动选择?的主要内容,如果未能解决你的问题,请参考以下文章

c#如何获取datagridview中的第一列的值,注意不是选中行

如何在 c# 中禁用可点击的 datagridview 中的空单元格

如何在 DataGridView 中禁用或隐藏按钮

如何在C#中 双击datagridview1中的一行数据,添加到新的datagridview2中。 B/C VS2010

如何在 DataGridView 中禁用排序?

如何通过点击datagridview的一行,获得这一行中的数据?c#高手指教