首页 > 解决方案 > 检查重复行的数据表(有一个扭曲)

问题描述

有很多关于如何检查 DataTable 中的重复项的示例,但是当 DataGridView 中有隐藏的标识列时,找不到任何关于如何实现它的示例。所以我有一个 DataGridView,它的 DataSource 来自 SQL 查询。该查询返回三列、唯一标识符以及网格所需的数据。将数据保存回来时,我需要标识列,但希望能够在保存之前检查记录是否存在重复项,目前这不起作用,因为标识使每一行都是唯一的。还有一个“删除”列,因此记录如下所示: 示例网格

这是我用来检查重复项的代码:

        // Create a copy of the data
        var duplicateTable = dataTable.Clone();
        var primaryKey = new DataColumn[duplicateTable.Columns.Count];
        duplicateTable.Columns.CopyTo(primaryKey, 0);
        duplicateTable.PrimaryKey = primaryKey;
        // Check if any data row has a duplicate
        return dataTable.Rows.Cast<DataRow>().Any(dataRow => duplicateTable.Rows.Contains(dataRow.ItemArray));

我要做的是检查项目和开始日期这两列,看看其中是否有重复。

提前致谢

马丁

标签: c#winformsdatagridview

解决方案


解决了这个问题,并在 Google 的帮助下,我整理了一种方法来做我想做的事情 - 请参见下文。
非常感谢
马丁

        private static bool HasDuplicates(DataTable dataTable)
        {
            var blnReturnValue = false;
            if (dataTable.Rows.Count == 0) goto SkipPoint;
            var dataColumns = new List<ProfessionalData>();
            for (var i = 0; i < dataTable.Rows.Count; i++)
            {
                var professionalRecord = new ProfessionalData
                {
                    ItemId = Convert.ToInt32(dataTable.Rows[i]["ItemId"]),
                    ItemValue = Convert.ToInt32(dataTable.Rows[i]["ItemValue"]),
                    EffectiveDate = Convert.ToDateTime(dataTable.Rows[i]["EffectiveDate"].ToString())
                };
                dataColumns.Add(professionalRecord);
            }

            dataColumns.ForEach(k =>
            {
                var item = dataColumns.FirstOrDefault(l =>
                    l.ItemValue == k.ItemValue && l.EffectiveDate == k.EffectiveDate);
                if (item != null) blnReturnValue = true;
            });

            SkipPoint:
            return blnReturnValue;
        }

        internal class ProfessionalData
        {
            internal int ItemId { get; set; }
            internal int ItemValue { get; set; }
            internal DateTime EffectiveDate { get; set; }
        }

推荐阅读