19 October, 2023

[C#] How To Use Object Listview in Winform

Trên bộ công cụ của Winform, có cung cấp cho chúng ta ListView.
Tuy nhiên, nếu chúng ta muốn thêm button hay hình ảnh, check box hoặc định dạng từng cell trên listview mặc định thì hơi phức tạp và khó sử dụng.

[C#] Chia sẻ source code sử dụng Object Listview trên Winform

Với Object Listview các bạn có thể thao tác một cách dễ dàng hơn.
Hình ảnh demo ứng dụng sử dụng Object ListView:

Các bạn có thể cài đặt thư viện từ Nuget:
PM> NuGet\Install-Package ObjectListView.Official -Version 2.9.2-alpha2

Video demo ứng dụng sử dụng Object ListView C#:

Đầu tiên, mình có 1 danh sách các Employee như bên dưới:
 private readonly List<Employee> _employees = new List<Employee>
 {
     new Employee
     {
         FirstName = "Alice",
         LastName = "Smith",
         Gender = Gender.Female,
         Job = "Accountant",
         Kpi = 4
     },
     new Employee
     {
         FirstName = "Bob",
         LastName = "Smith",
         Gender = Gender.Male,
         Job = "Manager",
         Kpi = 5
     },
     new Employee
     {
         FirstName = "Carol",
         LastName = "Smith",
         Gender = Gender.Female,
         Job = "Programmer",
         Kpi = 3
     },
     new Employee
     {
         FirstName = "James",
         LastName = "Smith",
         Gender = Gender.Male,
         Job = "Programmer",
         Kpi = 2
     },
     new Employee
     {
         FirstName = "Kate",
         LastName = "Green",
         Gender = Gender.Female,
         Job = "Manager",
         Kpi = 1
     },
     new Employee
     {
         FirstName = "Andy",
         LastName = "Brown",
         Gender = Gender.Male,
         Job = "Intern",
         Kpi = 0
     },
     new Employee
     {
         FirstName = "Bill",
         LastName = "Gates",
         Gender = Gender.Male,
         Job = "CEO",
         Photo = Program.AppDir + "bill.jpg",
         Kpi = 5,
         State = EmployeeState.Vacation
     },
 };

Tiếp đến, chúng ta cấu hình setup từng column vào object listview (OLVColumn).
colFullName.ImageGetter = obj =>
{
    var emp = (Employee)obj;

    // show a gender icon if no photo
    if (String.IsNullOrEmpty(emp.Photo) || !File.Exists(emp.Photo))
    {
        return (obj as Employee)?.Gender.ToString().ToLower();
    }

    // load photo from the file if not loaded yet
    if (!imglstPhotos.Images.ContainsKey(emp.Photo))
    {
        imglstPhotos.Images.Add(emp.Photo, Bitmap.FromFile(emp.Photo));
    }

    return emp.Photo;
};

// a render for big title + smaller description below
colFullName.Renderer = new DescribedTaskRenderer
{
    ImageList = imglstPhotos,
    DescriptionAspectName = "Job",
    TitleFont = new Font(this.Font.FontFamily, 12, FontStyle.Bold),
    DescriptionFont = new Font(this.Font.FontFamily, 10),
    UseGdiTextRendering = true,
    ImageTextSpace = 8,
    TitleDescriptionSpace = 1
};
colFullName.CellPadding = new Rectangle(4, 2, 4, 2); // Put a little bit of space around the cell

// group by the first last name letter
colFullName.GroupKeyGetter = obj =>
{
    var emp = (Employee)obj;
    return String.IsNullOrWhiteSpace(emp.LastName) ? "" : emp.LastName.Substring(0, 1);
};

// a renderer displaying multiple images instead of a number (like stars in ratings)
colKpi.Renderer = new MultiImageRenderer("money", 5, 0, 6)
{
    Spacing = -12 // overlap
};

colState.ImageGetter = obj => (obj as Employee)?.State.ToString().ToLower();
colState.AspectToStringConverter = val =>
{
    switch ((EmployeeState)val)
    {
        case EmployeeState.Vacation:
            return "On vacation";
        default:
            return val.ToString();
    }
};

colAction.AspectToStringConverter = val =>
{
    switch ((EmployeeState)val)
    {
        case EmployeeState.Working:
            return "Take a vacation";
        case EmployeeState.Vacation:
            return "Return to work";
        default:
            throw new ArgumentOutOfRangeException(nameof(val), val, null);
    }
};
lstEmployees.ButtonClick += (sender, e) =>
{
    var emp = (Employee)e.Model;

    switch (emp.State)
    {
        case EmployeeState.Working:
            emp.State = EmployeeState.Vacation;
            break;
        case EmployeeState.Vacation:
            emp.State = EmployeeState.Working;
            break;
        default:
            throw new ArgumentOutOfRangeException(nameof(emp.State), emp.State, null);
    }
};

Tiếp đến, chúng ta chỉ cần set object employee vào listview
 lstEmployees.SetObjects(_employees);

Chi tiết, các bạn có thể download source code bên dưới về để chạy và tham khảo.

DOWNLOAD SOURCE CODE

PASSWORD UNZIP : hung.pro.vn
Chúc mọi người thành công. với thủ thuật này và mọi người tìm hiểu và tích hợp vào chương trình mà mình đang phát triển dạng này nhé.

Hướng dẫn bình luận

Mọi người để lại bình luận góp ý, nhận xét về những bài viết mà mình chia sẽ văn minh lịch sự hay kích động, Không spam, không chèn link quảng cáo, bán hàng, Không sử dụng từ ngữ thô tục, xúc phạm, kích động, Link chỉ được phép khi thực sự liên quan đến nội dung bài viết, Không mạo danh người khác hoặc sử dụng email giả, Bình luận vi phạm sẽ bị xóa không cần thông báo trước.
Mọi người lưu ý răng, nếu muốn chia sẽ code ở bình luần thì cần mã hóa code trước khi bỏ vào khung nhé. :)
⑴ Chèn ℂ𝕤𝕤 theo mẫu : [pre css] ℂ𝕤𝕤 [/pre]
⑵ Chèn ℍ𝕥𝕞𝕝 theo mẫu : [pre html] ℍ𝕥𝕞𝕝 [/pre]
⑶ Chèn 𝕁𝕒𝕧𝕒𝕤𝕔𝕣𝕚𝕡𝕥 theo mẫu : [pre js] 𝕁𝕒𝕧𝕒𝕤𝕔𝕣𝕚𝕡𝕥 [/pre]

🖼️ Chèn 𝕀𝕞𝕒𝕘𝕖 theo mẫu : [img] 𝕃𝕚𝕟𝕜 𝕀𝕞𝕒𝕘𝕖 [/img]
🎞️ Chèn Video 𝕐𝕠𝕦𝕥𝕦𝕓𝕖 theo mẫu : [youtube] 𝕃𝕚𝕟𝕜 𝕪𝕠𝕦𝕥𝕦𝕓𝕖 [/youtube]

Post a Comment

@Tags

.NET (84) ANDROID (7) API (11) ASP.NET (1) AUTOIT (4) BLOGGER (74) BOT (2) Cam-Xuc (5) CHROME (17) CPP (7) CSHARP (115) CSS (40) DEVEXPRESS (24) DOMAIN (3) DOWNLOAD (74) EXCEL (6) EXTENSION (6) FACEBOOK (26) FIREFOX (3) GOOGLE (25) HTML (48) IOS (3) JAVASCRIPT (52) MICROSOFT (16) NUGET (10) OPERA BROWSER (1) PDF (4) PHP (7) POWERSHELL (1) PROGRAM (33) PYTHON (13) SECURITY (2) SEO (10) SOFTWARE (21) TELEGRAM (1) TIPS (100) TOOLS (13) UPDATE (3) VISUAL STUDIO (16) VPN (1) WINDOWS (113) WORDPRESS (8) YOUTUBE (4) ZALO (5)