我在 Visual Studio (C#) 中创建了一个使用 datagridview 的应用程序。现在,当我分配该 datagridview 的数据源时,它会自动选择第一行,并执行我的代码进行选择。由于我经常重新分配该数据源,因此这是不可取的。有什么方法可以改变它,这样它就不会自动进行第一次选择,而只依赖于用户的选择?
谢谢!
回应 Darshan Joshi 的评论: 除了自动生成的代码之外,datagridview 上唯一改变的是将 AutoGenerateColumns 设置为 false,并设置 DataSource 属性。 我在我的选择更改委托中放置了一个 MessageBox.Show ,似乎每次设置数据源时它都会被调用三次。在数据加载之前一次,在数据加载之后两次。
我无法在加载时将 selected 设置为 false,因为数据源是在某些用户操作之后设置的,而不是在初始化时设置的。
您应该在事件:DataBindingComplete 之后调用:ClearSelection
我遇到了同样的问题,这是我的解决方案。
棘手的部分是找到在哪里清除选择...我们只能在 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();
}
}
希望这有帮助。
您可以在 form_load 事件中取消选择它 喜欢
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.Rows[0].Selected = false;
}
要加载网格而不进行任何选择,您可以使用此代码片段。
GridView.CurrentCell = null;
这将简单地加载它,没有任何选择。将数据源分配给网格后添加此内容。
确保您不调用该方法从表单构造函数加载数据。如果你从 Form.load() 调用它
也在加载 myDataGridView 后执行此操作
myDataGridView.Rows[0].Selected = false;
这对我有用:
在绑定数据之前取消注册 SelectionChanged 事件,然后重新注册该事件。 也许您应该删除设计器中事件的注册并在代码中手动注册事件。
myDGV.SelectionChanged -= new System.EventHandler(this.myDGV_SelectionChanged);
您的经验可能会有所不同,但在我的工作中,当网格首次加载时,我经常遇到这个问题,尽管许多解决方案被发现是可以接受的(而且更多的是可笑的),但它们并非在所有情况下都有效。我发现最有效的一种解决方案(对我来说,您的经验和场景可能会有所不同)是处理 DataGridView.VisibleChanged:
public ThingWithGrid() {
Grid.VisibleChanged += Grid_VisibleChanged;
}
private void Grid_VisibleChanged(object sender, EventArgs e)
{
UpdateSelectedRows(InitialSelection);
Grid.VisibleChanged -= Grid_VisibleChanged;
}
我认为最简单的解决方案是删除事件处理程序,分配新的数据源,清除选择并重新分配事件处理程序:
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);
}
对于我的情况,在我的
DataGridView_DataBindingComplete
处理程序中,一个更简单的解决方案就足够了:
DataGridView.ClearSelection();
if (DataGridView.Focused)
DataGridView.DataBindingComplete -= DataGridView_DataBindingComplete;
解决方案基于放置 .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
只需添加 SelectedItem="-1",就可以了
<DataGrid Name="dataGrid" SelectedItem="-1" />