Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 阻止DataGridView选择第一项_.net_Winforms_Datagridview - Fatal编程技术网

.net 阻止DataGridView选择第一项

.net 阻止DataGridView选择第一项,.net,winforms,datagridview,.net,Winforms,Datagridview,我有一个WinForm DataGridView,当我用数据填充它时,默认情况下会选择第一项。我不希望在选择一个项目时发生这种情况,因为会触发一个事件并执行一些代码。我对此的解决方案是取消挂钩绑定重新挂钩事件,或者在新的数据绑定后事件第一次触发时更改标志。但是我想知道是否有更优雅的东西。我没有打开winforms应用程序进行测试,但我很好奇您的数据和datagridview之间是否有一个中间的BindingSource?如果是这样,如果你设置 List<Data> data = Ge

我有一个WinForm DataGridView,当我用数据填充它时,默认情况下会选择第一项。我不希望在选择一个项目时发生这种情况,因为会触发一个事件并执行一些代码。我对此的解决方案是取消挂钩绑定重新挂钩事件,或者在新的数据绑定后事件第一次触发时更改标志。但是我想知道是否有更优雅的东西。

我没有打开winforms应用程序进行测试,但我很好奇您的数据和datagridview之间是否有一个中间的BindingSource?如果是这样,如果你设置

List<Data> data = GetMyData();
BindingSource myBindingSource = new BindingSource();
myBindingSource.DataSource = data;
myBindingSource.position = -1;
myGrid.DataSource = myBindingSource;
List data=GetMyData();
BindingSource myBindingSource=新BindingSource();
myBindingSource.DataSource=数据;
myBindingSource.position=-1;
myGrid.DataSource=myBindingSource;

我经常发现在数据和UI之间插入BindingSource对象很有帮助。它似乎有助于解决许多随机问题,尽管我更习惯于使用DataTable对象作为数据,而不是列表对象。

使用如下示例:

        dataGridView.Columns[0].Selected = false;
        dataGridView.Rows[0].Selected = false;
        dataGridView.Rows[0].Cells[0].Selected = false;
当然,检查是否有行、列等。这只是一个例子。

关于(对不起,VB.NET,但我相信您可以转换):

我有一个类似的问题(但我不使用SelectionChanged事件),这对我很有效:

在构造函数中,设置绑定后,向DataBindingComplete事件添加处理程序:

dgvCommandos.DataSource = systeemCommandos; // = my List<> of objects
dgvCommandos.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(dgvCommandos_DataBindingComplete);
如果要选择行(例如,在添加/插入新对象后),只需设置:

dgvCommandos.Rows[insertPos].Selected = true;

以此为基础,我认为可以处理其他事件,以便在用户选择时做出反应。希望这能有所帮助。

很晚了,但我唯一能让它为我工作的方法是(通过BindingSource将许多文本框、组合框等绑定到我的DataGridView):

在初始化控件的数据绑定并将数据加载到DataGridView之后,我不得不挂起绑定

bindingSource.SuspendBinding();
在我的RowHeaderMouseClick事件中,我检查了绑定是否已挂起。如果是,请继续:

if(bindingSource.IsBindingSuspended)
    bindingSource.ResumeBinding();
这样我就可以完成数据的加载和绑定(在我的例子中是一个可排序的绑定列表),向用户显示数据,但不选择任何记录


希望这至少对任何人都有帮助

我的绑定源代码是一个通用的ListRight,但是您可以始终干预BindingSource对象——请稍等,我会用我的意思更新答案,这不起作用。设置myBindingSource.Position=-1并立即将其读回显示为0,而不是-1;
bindingSource.SuspendBinding();
if(bindingSource.IsBindingSuspended)
    bindingSource.ResumeBinding();