编辑多级嵌套对象列表的正确方法

时间:2013-03-07 19:48:52

标签: c# .net-3.5 webforms

我有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

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

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

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

1 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是使用轮询机制。这可以在使用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.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();
            }
        }
    }
}