我在Visual Studio(C#)中创建了一个使用datagridview的应用程序。现在,当我分配该datagridview的DataSource时,它会自动选择第一行,并执行我的代码进行选择。由于我经常重新分配该数据源,因此这是不可取的。有没有办法改变它,所以它不会自动进行第一次选择,只依赖于用户的选择?
谢谢!
回应Darshan Joshi的评论: 除了自动生成的代码之外,datagridview上唯一改变的是将AutoGenerateColumns设置为false,并设置DataSource属性。 我在我的selectionchanged委托中放置了一个MessageBox.Show,它似乎甚至在每次设置数据源时都被调用三次。在加载数据之前和之后两次。
我无法在加载时将selected设置为false,因为数据源是在某些用户操作之后设置的,而不是在初始化时设置的。
答案 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" />