加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 21:48:46 所属栏目:百科 来源:网络整理
导读:我有3个对象: public class Person{ public int Id { get; set; } public string Name { get; set; } public string Surname { get; set; } public ListOrder Orders { get; set; } public Person() { Orders= new ListOrder(); }}public class Order{ publ
我有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();
            }
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读