Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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
C# 应用BindingSource.Filter后出现DataGridView错误,导致哪些行为零?_C#_Exception_Datagridview_Filter_Bindingsource - Fatal编程技术网

C# 应用BindingSource.Filter后出现DataGridView错误,导致哪些行为零?

C# 应用BindingSource.Filter后出现DataGridView错误,导致哪些行为零?,c#,exception,datagridview,filter,bindingsource,C#,Exception,Datagridview,Filter,Bindingsource,我不明白为什么会这样。我有一个DataGridView,其数据源设置为BindingSource(用于过滤和导航) 我有一个项目列表,单击1个项目将为myBindingSource应用相应的过滤器,结果只显示满足myDataGridView条件的行。像这样: private void ItemsClicked(object sender, ItemClickedEventArgs e){ myBindingSource.Filter = e.FilterExpression; } 当

我不明白为什么会这样。我有一个DataGridView,其数据源设置为BindingSource(用于过滤和导航)

我有一个项目列表,单击1个项目将为myBindingSource应用相应的过滤器,结果只显示满足myDataGridView条件的行。像这样:

private void ItemsClicked(object sender, ItemClickedEventArgs e){
     myBindingSource.Filter = e.FilterExpression;
}
当我单击使myDataGridView显示至少一行的项目时,这一切正常。但是,当我单击任何导致0行符合相应筛选器表达式的项时,情况就变得糟糕了。myDataGridView通常应为空,但它在某些对话框中引发了大量异常(因此出现)(代码编辑器窗口中没有以黄色标记显示异常),下面是错误对话框的快照:

单击“确定”按钮后,它仍然显示另一个(同一个)对话框。。。。它继续显示许多对话框(具有相同的消息),直到停止所有对话框。我不明白那是什么。我不知道你是否需要更多的信息,但我希望你也经历过类似的异常情况,并给我一些关于如何修复此问题的建议。对话框中说的是DataError事件,但我不明白这里为什么会有错误?请注意,如果在应用筛选器后my dataGridView中至少有一行,则所有筛选器都将正常运行,只有在筛选器后没有行时才会发生错误


请帮帮我,谢谢你

因为没有要过滤的内容,所以会出现错误, 在筛选之前,请使用以下选项

if (dataGridView1.Rows.Count > 0)
{
   //do filter codes here
}

希望这能有所帮助。

因为没有什么可过滤的,所以会出现错误, 在筛选之前,请使用以下选项

if (dataGridView1.Rows.Count > 0)
{
   //do filter codes here
}

希望这有帮助。

这是我的答案,我不太明白这一点,但我只是尝试了一下,效果很好

我的规则是:

  • 在应用筛选器之前,只需使用以下方法从BindingSource中SuspendBinding所有控件:

    myBindingSource.SuspendBinding()

  • 现在,按如下方式正常应用过滤器:

    myBindingSource.Filter=“过滤器表达式”

  • 最后,使用
    ResumeBinding()
    方法将所有控件重新绑定到BindingSource,如下所示:

    myBindingSource.ResumeBinding()

  • 就这些。事实上,myBindingSource有许多绑定到它的控件。也许这就是原因,但我还是不太明白。我敢打赌,如果myBindingSource只有将数据绑定到的myDataGridView,则不需要上述所有3个步骤,只需在需要时应用过滤器(步骤2)

    我希望这能帮助其他已经遇到、正在遇到和将要遇到这个问题的人。再说一次,我真的不明白它为什么有效,所以我希望有人能在评论中解释一下。我会非常感激的。谢谢

    更新 我发现,按照上述方法操作可能会有另一个问题。在某些情况下,最安全的解决方案是:

  • SuspendBinding(如上所述,这是使用BindingSource的方法SuspendBinding()完成的),但最安全的方法是将数据源设置为null

  • 应用过滤器

  • ResumeBinding(如上所述,这是使用BindingSource的方法ResumeBinding()完成的),但最安全的方法是自己重新绑定控件(循环每个控件并调用数据绑定的Add方法,记住先清除数据绑定)。您应该有一个这样做的方法,因为我们可能会多次调用重新绑定方法

  • 现在我正在使用这种更安全的方法,我前面提到的方法给了我另一个异常,称为“VersionNotFoundException”(没有建议访问的数据)。异常发生在ResumeBinding()调用的行,该方法中一定有错误。但是,我使用的是多个表的数据集,并在同一dataGridView上的表之间切换。同样,这个问题仍然太复杂,无法立即深入研究和理解

    真相 我发现,在应用过滤器之前,不需要暂停绑定所有控件,然后恢复绑定。我的表单有一个绑定到BindingSource的一个特殊列(我们称之为列X)的控件,我仍然不知道为什么这个列是特殊的,我只是怀疑它,只是在应用过滤器之前暂停从BindingSource绑定它,然后再绑定它。不涉及所有其他控件/列

    我认为这里唯一值得注意的是:


    =>我的主表(表1)有一个名为a的主键列,这个表有一个名为B的外键,它引用另一个表(表2)中的主键列。表2有一个外键,它引用另一个表(表3)中名为C的主键列。事实上,我有一个选择所有a、B、C列的查询(当然这里没有提到其他列)。这种关系正是我所怀疑的,但我仍然不清楚它为什么会和如何会引起错误。如果不使用绑定并手动分配/更新所有值,则不会出现任何错误。绑定有时真的很复杂

    这是我的答案,我不太明白这一点,但我只是尝试了一下,效果很好

    我的规则是:

  • 在应用筛选器之前,只需使用以下方法从BindingSource中SuspendBinding所有控件:

    myBindingSource.SuspendBinding()

  • 现在,按如下方式正常应用过滤器:

    myBindingSource.Filter=“过滤器表达式”

  • 最后,使用
    ResumeBinding()
    方法将所有控件重新绑定到BindingSource,如下所示:

    myBindingSource.ResumeBinding()