正确的方式来编辑对象的多层次的嵌套列表 [英] Proper way to edit multi-level nested list of objects

查看:135
本文介绍了正确的方式来编辑对象的多层次的嵌套列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

正如你可以看到每个人都可以有多个订单,每个订单可以有多个项目。

As You can see every person can have multiple orders and every order can have multiple items.

在来自DB我的应用程序的数据看起来像这样:

In my application data that comes from DB looks like so:

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的是这样的: 下面是我的code:

I've created custom User control with 2 labels and datagridview like this: below is my code:

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的(对于每一份订单的具体的人):

Then in main form I'm adding instances of that control to flowLayoutPanel (for every order for specific person):

private void RefreshView()
{
   flowLayoutPanel1.Controls.Clear();
   foreach (Order order in _persons[_currentPerson].Orders)
   {
      flowLayoutPanel1.Controls.Add(new OrderView {Order = order});
   }
}

通过以​​上的数据我的应用程序看起来像这样:

With above data my application looks like so:

我需要能够添加/编辑每次订单的每一个项目。 增加似乎是很容易 - 我创造新的形式,用户输入详细信息,然后我会做DB调用添加该项目。

I need to be able to add/edit every item of every order. Adding seems to be quite easy-I'll create new form, user will input details and then I'll do DB call to add that item.

我的问题是:
如何自动刷新视图后添加/编辑项目?我我的控制莫名其妙地绑定到该列表每次我更新我的观点的更新时间。 我需要能够将项目和命令添加到人。 什么是这样做的最简单的方法是什么?

My questions are:
How can I auto refresh view after add/edit item? Can I somehow bind my control to that list to every time I update it my view updates. I need to be able to add items and orders to person. What would be the easiest way of doing that?

是这样显示的是否正确?我可以改进?如果是的话怎么办?

推荐答案

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

One way to solve this problem would be to use a polling mechanism. This can be plumbed in using the System.Threading.Timer, which uses the System.Threading.ThreadPool.

您会反复询问,看看是否你的数据已经更新。你需要修改的日期来存储你的数据,我建议将其存储在UTC。或者,你可以只使用在每次更新数据时递增的整数标签,那么如果标签是过时的,你知道你需要更新你的显示的数据。

You would repeatedly query to see if your data has been updated. You'll need to store the modified date with your data, I'd recommend storing it in UTC. Alternatively, you could just use an integer tag that is incremented every time data is updated, then if the tag is out of date, you know you need to update your displayed data.

有关投票的危险的事情是刷新你的服务器需要多少负荷遇到,但如果你的并发用户基数小,这不会是一个问题。如果你发现它会导致性能问题,您可以调整轮询间隔,将缓存技术,并可能Farm的服务器(S)。

The dangerous thing about polling refreshes is how much load your server will encounter, but if your concurrent user base is small, this will not be a problem. If you find it causes performance problems, you can adjust your polling interval, incorporate caching techniques, and possibly farm your server(s).

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

Your new OrderView class will probably look similar to the following:

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

这篇关于正确的方式来编辑对象的多层次的嵌套列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆