2013-03-07 119 views
4

的多级嵌套列表有道我有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", 
      Date = "2013-03-07", 
      Items = 
      new List<Item> 
      { 
       new Item {Id = 1, Number = 2, ProductName = "Pen"}, 
       new Item {Id = 2, Number = 1, ProductName = "Pencil"} 
      } 
      } 
     } 
     }, 
     new Person 
     { 
     Id = 2, 
     Name = "Adam", 
     Surname = "West", 
     Orders = new List<Order> 
     { 
     new Order 
      { 
      Id = 1, 
      Description = "Adams order", 
      Date = "2013-03-07", 
      Items = 
      new List<Item> 
      { 
       new Item {Id = 1, Number = 2, ProductName = "first"}, 
       new Item {Id = 2, Number = 1, ProductName = "second"} 
      } 
      }, 
     new Order 
      { 
      Id = 2, 
      Description = "Adams second", 
      Date = "2013-03-07", 
      Items = 
      new List<Item> 
      { 
       new Item {Id = 1, Number = 2, ProductName = "Pen"}, 
       new Item {Id = 2, Number = 1, ProductName = "Pencil"} 
      } 
      } 
     } 
     } 
    }; 

我已经创建自定义用户控件与2个标签和datagridview的是这样的: 下面enter image description here 是我的代码:

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}); 
    } 
} 

根据以上数据我的应用程序看起来像这样: enter image description here

我需要能够添加/编辑每一个订单的每一个项目。 添加似乎很容易 - 我将创建新表单,用户将输入详细信息,然后我将执行数据库调用以添加该项目。

我的问题是:
如何添加/编辑项目后自动刷新视图?可以以某种方式将我的控件绑定到该列表,以便每次更新它时查看更新。 我需要能够添加项目和订单给人。 这样做最简单的方法是什么?

这种显示是否正确?我可以改进它吗?如果是,那么如何?

+0

请添加评论,以澄清一些或标记为接受我的答案...谢谢! – 2013-04-10 13:51:36

回答

1

解决此问题的一种方法是使用轮询机制。这可以在使用System.Threading.Timer时使用System.Threading.ThreadPool。

您将反复查询以查看您的数据是否已更新。您需要将修改日期与您的数据一起存储,我建议将其存储在UTC中。或者,您可以使用每次更新数据时都会递增的整数标记,然后如果标记已过期,则需要更新显示的数据。

有关轮询刷新的危险之处在于您的服务器会遇到多少负载,但是如果您的并发用户基数很小,这不会成为问题。如果您发现它会导致性能问题,那么您可以调整轮询时间间隔,合并缓存技术,并可能使您的服务器出现故障。

您的新订单查看类可能会类似于以下内容:

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.Id); 
      DateLBL.Text = string.Format("Date: {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(); 
      } 
     } 
    } 
} 
+0

对不起,花了这么长时间。我的大学毕业了:)我试过了你的解决方案,但最后我决定为我的模型使用'INotifyPropertyChanged'接口,并进行绑定来处理自动更新。我会尝试用示例解决方案创建答案以显示一些代码。 – Misiu 2013-04-16 07:48:03