c# – 编辑多级嵌套对象列表的正确方法
我有3个对象:
public class Person { public int Id { get; set; } public string Name { get; set; } public string Surname { get; set; } public List<Order> Orders { get; set; } public Person() { Orders= new List<Order>(); } } public class Order { public int Id { get; set; } public string Description { get; set; } public string Date { get; set; } public List<Item> Items { get; set; } public Order() { Items= new List<Item>(); } } public class Item { public int Id { get; set; } public string ProductName { get; set; } public int Number { get; set; } } 正如您所看到的,每个人都可以拥有多个订单,每个订单都可以包含多个商品. 在我的应用程序中,来自DB的数据如下所示: private List<Person> _persons; _persons = new List<Person> { new Person { Id = 1,Name = "John",Surname = "Smith",Orders = new List<Order> { new Order { Id = 1,Description = "First Order",Date = "2013-03-07",Items = new List<Item> { new Item {Id = 1,Number = 2,ProductName = "Chair"},new Item {Id = 2,Number = 1,ProductName = "Bed"} } },new Order { Id = 2,Description = "Second",ProductName = "Pen"},ProductName = "Pencil"} } } } },new Person { Id = 2,Name = "Adam",Surname = "West",Description = "Adams order",ProductName = "first"},ProductName = "second"} } },Description = "Adams second",ProductName = "Pencil"} } } } } }; 我用2个标签和datagridview创建了自定义用户控件,如下所示: 下面是我的代码: using System.Windows.Forms; using Demo.Model; namespace Demo.Controls { public partial class OrderView : UserControl { private Order _order; public Order Order { get { return _order; } set { _order = value; UpdateView(); } } private void UpdateView() { if (_order == null) return; IdLBL.Text = string.Format("ID: {0}",_order.Id); DateLBL.Text = string.Format("Date: {0}",_order.Date); ItemsDGV.DataSource = _order.Items; } public OrderView() { InitializeComponent(); } } } 然后在主窗体中我将该控件的实例添加到flowLayoutPanel(针对特定人员的每个订单): private void RefreshView() { flowLayoutPanel1.Controls.Clear(); foreach (Order order in _persons[_currentPerson].Orders) { flowLayoutPanel1.Controls.Add(new OrderView {Order = order}); } } 使用上面的数据,我的应用程序如下所示 我需要能够添加/编辑每个订单的每个项目. 我的问题是: 这种显示器是否正确?我能改进吗?如果是,那怎么样? 解决方法
解决此问题的一种方法是使用轮询机制.这可以在使用
System.Threading.Timer时检测,它使用System.Threading.ThreadPool.
您将反复查询以查看您的数据是否已更新.您需要将修改日期与数据一起存储,我建议将其存储在UTC中.或者,您可以使用每次更新数据时递增的整数标记,然后如果标记过期,您就知道需要更新显示的数据. 轮询刷新的危险之处在于服务器将遇到多少负载,但如果您的并发用户群很小,这将不会成为问题.如果您发现它会导致性能问题,您可以调整轮询间隔,合并缓存技术,并可能对服务器进行托管. 您的新OrderView类可能类似于以下内容: using System.Windows.Forms; using Demo.Model; using System.Threading; namespace Demo.Controls { public partial class OrderView : UserControl,IDisposable { private Order _order; private Timer poller; public Order Order { get { return _order; } set { _order = value; UpdateView(); } } private void UpdateView() { if (_order == null) return; IdLBL.Text = string.Format("ID: {0}",_order.Date); ItemsDGV.DataSource = _order.Items; } public OrderView() { InitializeComponent(); _poller = new Timer(CheckUpdate,null,timeSpan,timeSpan); } private void CheckUpdate(Object state) { //Do update check and update Order if it has changed } public void Dispose() { if (_poller != null) { _poller.Dispose(); } } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |