- [C#] Dependency Injection in Winform
- [SQLSERVER] Hướng dẫn tìm kiếm nâng cao trên sql
- [C#] Hướng dẫn sử dụng SetTimeOut trên Winform like Javascript
- [DATABASE] In cây thông noel bằng sqlserver
- [C#] Hướng dẫn fix lỗi hiển thị UTF-8 khi sử dụng WebClient Download String
- [DATABASE] Hướng dẫn mã hóa và giải mã sử dụng thuật toán AES 256 trên sqlserver
- [DATABASE] Base64 Encode and Decode trong Sqlserver
- [C#] Vì Mẹ anh bắt phải Fake địa chỉ MacAddress
- [C#] Hướng dẫn xuất dữ liệu từ DataGridview ra file Excel
- [C#] Hướng dẫn khởi động lại chương trình ứng dụng winform
- [C#] Sự khác nhau giữa String.IsNullOrEmpty và String.IsNullOrWhiteSpace
- [C#] Hướng dẫn đọc file hình ảnh định dạng WEBP và chuyển đổi WebP sang JPG
- [C#] Kiểm tra phiên bản Microsoft Office đang sử dụng trên máy tính
- [C#] Hướng dẫn chuyển đổi tập tin hình ảnh XPS sang Bitmap
- [C#] Giới thiệu Component WebView2 của Microsoft
- [C#] Hướng dẫn lưu tất cả hình ảnh từ File Excel vào thư mục window
- [DATABASE] Hướng dẫn import và export hình ảnh image từ Sqlserver
- [DATABASE] Hướng dẫn sử dụng Hàm ASCII trong sqlserver
- [C#] Hướng dẫn fix lỗi Visual Studio 2022 not Support Target Net Framework 4.5.2
- [C#] Giới thiệu thư viện Sunny UI thiết kế giao diện trên Winform
[DEVEXPRESS] Chia sẽ class Helper tìm và đếm dữ liệu trùng lắp trên Gridview
Xin chào các bạn, bài viết hôm nay mình sẻ tiếp tục chia sẻ đến các bạn class Helper dùng để tìm và đếm dữ liệu trùng lắp trên Gridview Devexpress C# Winform.
[DEVEXPRESS] Find and Count Duplicate Value in Gridview C# Winform
Với số lượng dữ liệu lên đến hàng nghìn, thậm chí hàng chục nghìn mà đôi lúc bạn thao tác nhầm thì rất có thể nó sẽ bị trùng lặp.
Chính vì thế mà tính năng tìm dữ liệu trùng lặp trong Gridview Duplicate value ra đời giúp người dùng có thể dễ dàng lọc dữ liệu trùng lặp trong phần mềm.
Giúp bạn dễ dàng loại bỏ những dữ liệu dư thừa ra khỏi ứng dụng.
Dưới đây là giao diện ứng dụng:
Ở hình trên các bạn thấy, mình đã tích hợp thêm chức năng Duplicate Value khi right click vào từng ô header trên Gridview thì nó sẽ thực hiện 2 công việc:
- Tô màu dữ liệu trùng lắp, mỗi giá trị một màu riêng biệt
- Thêm cột Count vào gridView và hiển thị số dữ liệu trùng.
Với chức năng này giúp cho các bạn kiểm tra dữ liệu một cách nhanh chóng.
Video demo ứng dụng:
Source code GridviewHelper.cs
:
using DevExpress.Utils.Menu;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Menu;
using DevExpress.XtraGrid.Views.Grid;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FindDuplicateColumnValue
{
class GridViewHelper
{
private static List<string> columnValues = new List<string>();
public static void FindDuplicateAndCount(object sender, PopupMenuShowingEventArgs e, GridControl gridcontrol, GridView gridView, string FormName)
{
if (e.MenuType == GridMenuType.Column)
{
GridViewColumnMenu menu = e.Menu as GridViewColumnMenu;
if (menu.Column != null)
{
var menu_duplicateValue = new DXMenuCheckItem("Duplicate Value");
menu_duplicateValue.ImageOptions.Image = Properties.Resources.ic_count;
menu.Items.Add(menu_duplicateValue);
menu_duplicateValue.Click += (ss, ee) =>
{
var nameColumnFindDuplicate = menu.Column.FieldName;
if (gridcontrol.DataSource is DataTable)
{
DataTable table = (gridcontrol.DataSource as DataTable);
var values = table.AsEnumerable().Select(x => x[nameColumnFindDuplicate].ToString());
columnValues = values.ToList();
}
else
{
var data = JsonConvert.SerializeObject(gridcontrol.DataSource);
JArray categories = JArray.Parse(data);
var values = categories.AsEnumerable().Select(x => x[nameColumnFindDuplicate].ToString());
columnValues = values.ToList();
}
JArray jArraydataSource;
var duplicates = new List<(string, int, Color)>();
if (gridcontrol.DataSource is DataTable)
{
DataTable table = (gridcontrol.DataSource as DataTable);
duplicates = table.AsEnumerable()
.GroupBy(dr => dr[nameColumnFindDuplicate])
.Where(g => g.Count() > 1)
.Select(g => (g.First()[nameColumnFindDuplicate].ToString(), g.Count(), GetRandomColour()))
.ToList();
var data = JsonConvert.SerializeObject(table);
jArraydataSource = JArray.Parse(data);
}
else
{
var data = JsonConvert.SerializeObject(gridcontrol.DataSource);
jArraydataSource = JArray.Parse(data);
duplicates = jArraydataSource
.GroupBy(dr => dr[nameColumnFindDuplicate])
.Where(g => g.Count() > 1)
.Select(g => (g.First()[nameColumnFindDuplicate].ToString(), g.Count(), GetRandomColour()))
.ToList();
}
GridColumn newColumn = new GridColumn();
var gridColumn = gridView.Columns.Where(x => x.FieldName == nameColumnFindDuplicate).FirstOrDefault();
gridView.Columns.Remove(gridView.Columns.ColumnByFieldName("Count"));
int index = gridView.Columns[nameColumnFindDuplicate].VisibleIndex;
newColumn.Caption = "Count";
newColumn.FieldName = "Count";
newColumn.Width = 45;
newColumn.UnboundDataType = typeof(int);
newColumn.Visible = true;
gridView.Columns.Insert(index + 1, newColumn);
newColumn.VisibleIndex = index + 1;
var hashsetData = new HashSet<HashsetDuplicate>();
duplicates.Select(x => hashsetData.Add(new HashsetDuplicate(x.Item1, x.Item2))).ToList();
gridView.CustomUnboundColumnData += (sss, eee) => { GridView1_CustomUnboundColumnData(sss, eee, nameColumnFindDuplicate, jArraydataSource, hashsetData); };
gridView.RowCellStyle += (sss, eee) => { GridView1_RowCellStyle(sss, eee, duplicates, nameColumnFindDuplicate); };
gridView.RefreshData();
};
}
}
}
public class HashsetDuplicate
{
public string Name { get; set; }
public int Count { get; set; }
public HashsetDuplicate(string name, int count)
{
this.Name = name;
this.Count = count;
}
}
public static void GridView1_CustomUnboundColumnData(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDataEventArgs e, string columnDuplicate, JArray jArraydataSource, HashSet<HashsetDuplicate> duplicates)
{
if ((sender as GridView).DataSource is DataView)
{
var name = (e.Row as DataRowView).Row[columnDuplicate].ToString();
var categoriesText = duplicates.Where(c => c.Name.ToString() == name.ToString()).FirstOrDefault()?.Count;
e.Value = categoriesText;
}
else
{
var curent = JsonConvert.SerializeObject(e.Row);
JObject rss = JObject.Parse(curent);
var name = rss[columnDuplicate];
var categoriesText = duplicates.Where(c => c.Name.ToString() == name.ToString()).FirstOrDefault()?.Count;
e.Value = categoriesText;
}
}
public static void GridView1_RowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e, List<(string, int, Color)> duplicate, string nameColumnFindDuplicate)
{
if (duplicate == null)
{
if (e.Column.FieldName.Equals(nameColumnFindDuplicate))
{
e.Appearance.BackColor = DevExpress.XtraEditors.XtraForm.DefaultBackColor;
}
return;
}
var val = (sender as GridView).GetRowCellValue(e.RowHandle, nameColumnFindDuplicate);
if (val == null)
return;
string svalue = val.ToString();
var datass = columnValues.Where(s => s.Equals(svalue)).ToList();
if (columnValues.Where(s => s.Equals(svalue)).ToList().Count > 1)
{
if (e.Column.FieldName.Equals(nameColumnFindDuplicate))
{
var color = duplicate.Where(x => x.Item1 == e.CellValue.ToString()).FirstOrDefault().Item3;
e.Appearance.BackColor = color;
}
}
}
public static List<Color> colors = new List<Color>();
public static Random rand = new Random();
public static Color GetRandomColour()
{
Color coltemp = Color.FromArgb(125, rand.Next(256), rand.Next(256), rand.Next(256));
while (colors.Contains(coltemp))
{
coltemp = Color.FromArgb(125, rand.Next(256), rand.Next(256), rand.Next(256));
}
return coltemp;
}
}
}
Ở form main các bạn chỉ cần gọi sự kiện PopupMenuShowing là xong.
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.Grid;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace FindDuplicateColumnValue
{
public partial class Form1 : DevExpress.XtraEditors.XtraForm
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
gridControl1.DataSource = CreateDataSourceObject();
gridView1.PopupMenuShowing += (ss, ee) => { GridViewHelper.FindDuplicateAndCount(ss, ee, gridControl1, gridView1, this.Name); };
}
List<Employee> CreateDataSourceObject()
{
var dataTable = new List<Employee>();
dataTable.Add(new Employee("Nguyễn Thảo", "05/06/2013 23:23:11", "Sinh viên", "2013", new TimeSpan(4, 15, 40), true));
dataTable.Add(new Employee("Nguyễn Đình Tuyên", "01/01/2013", "Giáo Viên", "2013", new TimeSpan(6, 15, 40), false));
dataTable.Add(new Employee("Trịnh Quốc Khang", "09/05/2013", "Giảng Viên", "60", new TimeSpan(4, 25, 40), false));
dataTable.Add(new Employee("Nguyễn Phương Nhi", "09/05/2013","Sinh viên", "60", new TimeSpan(4, 25, 40), false));
dataTable.Add(new Employee("Cái Trí Minh", "09/05/2013","Giáo sư", "60", new TimeSpan(4, 25, 40), false));
dataTable.Add(new Employee("Cái Trí Minh", "09/05/2013", "Tiến Sĩ", "60", new TimeSpan(4, 25, 40), false));
dataTable.Add(new Employee("Võ Sơn Băng", "09/05/2013","Sinh viên", "60", new TimeSpan(4, 25, 40), false));
dataTable.Add(new Employee("Hoàng Thị Thảo", "09/05/2013", "Giảng Viên", "60", new TimeSpan(4, 25, 40), false));
dataTable.Add(new Employee("Thảo Meo", "09/05/2013", "Giảng Viên", "60", new TimeSpan(4, 25, 40), false));
dataTable.Add(new Employee("Nguyễn Thị Cẩm Tú", "09/05/2013", "Giảng Viên", "60", new TimeSpan(4, 25, 40), true));
dataTable.Add(new Employee("Nguyễn Thảo", "09/05/2013", "Giảng Viên", "60", new TimeSpan(4, 25, 40), false));
dataTable.Add(new Employee("Hoàng Dược Sư", "09/05/2013", "Tiến Sĩ", "60", new TimeSpan(4, 25, 40), false));
dataTable.Add(new Employee("Âu Dương Phong", "09/05/2013", "Tiến Sĩ", "60", new TimeSpan(4, 25, 40), false));
dataTable.Add(new Employee("Nguyễn Thảo", "09/05/2013", "Tiến Sĩ", "60", new TimeSpan(4, 25, 40), false));
dataTable.Add(new Employee("Tiểu Long Nữ", "09/05/2013", "Sinh viên", "60", new TimeSpan(4, 25, 40), false));
dataTable.Add(new Employee("Nguyễn Đình Tuyên", "09/05/2013", "Sinh viên", "60", new TimeSpan(4, 25, 40), false));
dataTable.Add(new Employee("CR7", "09/05/2013", "Sinh viên", "60", new TimeSpan(4, 25, 40), false));
dataTable.Add(new Employee("CR7", "09/05/2013", "Sinh viên", "60", new TimeSpan(4, 25, 40), false));
return dataTable;
}
}
}
class Employee
{
static int _id;
public int ID { get; private set; }
public string Name { get; set; }
public DateTime OrderDate { get; set; }
public int StartYear { get; set; }
public string Job { get; set; }
public bool Ready { get; set; }
public TimeSpan Time { get; set; }
public Employee(){}
public Employee(string name, string orderDate, string job, string startYear, TimeSpan time, bool ready)
{
ID = Interlocked.Increment(ref _id);
Name = name;
OrderDate =Convert.ToDateTime(orderDate);
StartYear = Convert.ToInt32(startYear);
Job = job;
Time = time;
Ready = ready;
}
}
Thanks for waching!