Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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# 将DataGridView控件中的数据与不断更新的DataTable进行比较(循环问题)_C#_Vb.net_Loops_Datagridview_Datatable - Fatal编程技术网

C# 将DataGridView控件中的数据与不断更新的DataTable进行比较(循环问题)

C# 将DataGridView控件中的数据与不断更新的DataTable进行比较(循环问题),c#,vb.net,loops,datagridview,datatable,C#,Vb.net,Loops,Datagridview,Datatable,我有一个DataTable,它通过计时器不断用数据库中的新数据进行更新。该数据最终被重新格式化并显示在DataGridView控件中 为了防止DataGridView从重新数据绑定中完全刷新(因此,清除选择、重置滚动条、默认排序设置并使gridview在重新更新时闪烁),我只是从datagrid中删除不再存在于DataTable中的旧行,以及向自上次更新以来出现在DataTable中的datagrid添加新行 为了简单起见,我们将调用DataGridViewLEFT表和DataTableRIGH

我有一个
DataTable
,它通过计时器不断用数据库中的新数据进行更新。该数据最终被重新格式化并显示在
DataGridView
控件中

为了防止
DataGridView
从重新数据绑定中完全刷新(因此,清除选择、重置滚动条、默认排序设置并使gridview在重新更新时闪烁),我只是从datagrid中删除不再存在于
DataTable
中的旧行,以及向自上次更新以来出现在
DataTable
中的datagrid添加新行

为了简单起见,我们将调用
DataGridView
LEFT表和
DataTable
RIGHT表

我正在寻找一种方法来遍历这两个表(左表和右表),删除不再位于右侧的旧行,并从左侧删除它们。在右侧查找新项目并将其添加到左侧。每个表都有一个名为“RecID”的列,其中包含可用于比较的每个条目的唯一id

现在,我要问你的问题。。。有没有一种方法可以在一个循环中完成这一切?我正在寻找的是伪代码:

<loop through everything>
    if RecID does not exist in LEFT but exists in RIGHT
        add new item to LEFT
    if RecID does exist in LEFT but does not exist in RIGHT
        delete item from LEFT
    if RecID does exist in LEFT and also exists in RIGHT, check each cell in row and update LEFT.. i can handle this part
<end loop>
我的代码似乎效率极低。谢谢你的帮助。谢谢

好吧,我认为桌面应用程序和Web应用程序都支持您描述的“开箱即用”功能。这叫做数据绑定。
在web上查找一个示例,使用
DataGridView.DataSource
BindingSource
DataBind()

如前所述,数据存储是解决方案的一部分,但要获得您想要的内容,还需要更多。DataTable有一个合并方法,该方法将合并现有表和该表(或具有类似架构的另一个表)的更新,以补偿添加、更改和删除。查看这篇MSDN文章,了解此方法的描述


我放置了一个简单的解决方案,在其中比较tw2o datagridview单元格值,并在第三个datagridview中显示这些值:

        for (int i = 0; i < dtView1.Rows.Count; i++)
        {
            for (int j = 1; j < dtView1.Columns.Count; j++)
            { 
               dtViewResult.Rows[i][j] = (dtView1.Rows[i][j].ToString()) + (dtView2.Rows[i][j].ToString()); 
            }
         }
for(int i=0;i
您应该澄清您的应用程序是否在WinForms/WCF/ASP.NET上??我在最初的帖子中已经提到,我避免了简单地将数据绑定到datagridview。它打开了一个问题的世界(见我的第二段)。我提到的所有问题都可以用这样或那样的方式来处理(我最初是如何处理的),但要让一切顺利进行是很棘手的。主要是尽可能保持网格的预览视图状态。不确定合并是否有帮助。我可以将我的datagridview转换为datatable,然后将新数据与旧数据合并,但基本上我会回到原点,因为我必须将合并后的数据返回到datagrid中。。要求我做一个完整的更新,这就是我不做数据绑定的原因。但是谢谢你提到。。我不知道合并的存在,事实上。。。。我想我能做到。我可以将datagrid转换为datatable,将新旧数据合并,然后在datagrid中循环,并根据合并的数据删除/添加行。我会调查是否有可能这样做。再次感谢您在这种情况下,您可以尝试将数据带回datatable,然后执行两次查询以获取新行(新表特有的)。B) 获取被删除的行(主表所特有的),也许C)获取被更改的行(对于同一个键,两个表之间的数据不同)DataTable.select()具有非常全面的SQL支持功能。如果您愿意集成LINQtoSQL,也可以使用它。
        for (int i = 0; i < dtView1.Rows.Count; i++)
        {
            for (int j = 1; j < dtView1.Columns.Count; j++)
            { 
               dtViewResult.Rows[i][j] = (dtView1.Rows[i][j].ToString()) + (dtView2.Rows[i][j].ToString()); 
            }
         }