[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é.

PASSWORD UNZIP: HUNG.PRO.VN
Chúc Mọi Người Thành Công Với Thủ Thuật Trên.
Nếu mọi người có vướng mắc gì mình chia sẽ trên trang có thể gửi liên hê cho mình tại đây nhé.
Cảm ơn mọi người đã quan tâm.

No comments:

All Right Reserved © 2015 By Hung Pro VN