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é.
Theo LapTrinhVB.Net
No comments:
Post a Comment