我有一个WinForm DataGridView,当我用数据填充它时,默认选择第一个项目。我不希望在选择一个项目时触发事件并执行某些代码。我对此的解决方案是取消挂钩绑定事件,或者在新数据绑定后第一次触发事件时更改标志。但是我想知道是否有更优雅的东西。
答案 0 :(得分:2)
我没有打开winforms应用程序进行测试,但是我很好奇你的数据和datagridview之间是否有介入的BindingSource?如果是这样,如果你设置
怎么办?List<Data> data = GetMyData();
BindingSource myBindingSource = new BindingSource();
myBindingSource.DataSource = data;
myBindingSource.position = -1;
myGrid.DataSource = myBindingSource;
我经常发现在数据和UI之间插入BindingSource对象很有帮助。它似乎有助于解决许多随机问题,虽然我更习惯于将DataTable对象用作数据而不是List&lt;&gt;对象。
答案 1 :(得分:2)
怎么样(对不起,VB.NET,但我相信你可以转换):
myGrid.ClearSelection()
答案 2 :(得分:2)
我遇到了类似的问题(但我没有使用SelectionChanged事件),这对我有用:
在构造函数中,设置绑定后,向DataBindingComplete事件添加处理程序:
dgvCommandos.DataSource = systeemCommandos; // = my List<> of objects
dgvCommandos.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(dgvCommandos_DataBindingComplete);
处理程序:
void dgvCommandos_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
dgvCommandos.ClearSelection();
}
如果您打算选择一行(例如,在添加/插入新对象之后),只需设置:
dgvCommandos.Rows[insertPos].Selected = true;
以此为基础,我认为可以处理其他事件以响应用户选择。希望这会有所帮助。
答案 3 :(得分:0)
使用类似以下示例的内容:
dataGridView.Columns[0].Selected = false;
dataGridView.Rows[0].Selected = false;
dataGridView.Rows[0].Cells[0].Selected = false;
当然,检查是否有行,列等。这只是一个例子。
答案 4 :(得分:0)
很晚了,但我唯一能让它为我工作的方式(很多TextBoxes,ComboBox等等通过BindingSource绑定到我的DataGridView):
将DataBindings初始化为我的控件并将数据加载到DataGridView后,我不得不暂停绑定
bindingSource.SuspendBinding();
在我的RowHeaderMouseClick事件中,我检查了绑定是否被挂起。如果是这样,请恢复它:
if(bindingSource.IsBindingSuspended)
bindingSource.ResumeBinding();
这样我就可以完成数据的加载和绑定(在我的例子中是一个可排序的BindingList),向用户显示数据但没有选择记录。
希望这对至少任何人都有帮助!