如何禁用 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 中的空单元格
如何在C#中 双击datagridview1中的一行数据,添加到新的datagridview2中。 B/C VS2010