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

标签 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; }
}

如您所见,每个人都可以有多个订单,每个订单可以有多个项目。

在我的应用程序中,来自数据库的数据如下所示:

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

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

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

这样的显示正确吗?我可以改进它吗?如果是那么怎么办?

最佳答案

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

关于c# - 编辑多级嵌套对象列表的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15280395/

相关文章:

javascript - 提交字段而不填写 "hidden"必填字段,除非它们被选中

javascript - Mootools 和 IE9

c# - 使用 Floyd-Warshall 算法寻找迷宫

C# Word Interop Automation 2013 - 将字体颜色设置为 RGB 值

c# - 如何将列表 <AudioTrack> 从类传递到类 AudioPlayer

.net - 为什么在我的面向 .net framework 3.5 的 .net 项目中 System.dll 的版本是 2.x?

visual-studio-2008 - 安装.NET 3.5 SP1后以VS 2008为目标

c# - 如何导航到 DNN 中的模块?

c# - 我可以在 .NET/C# 中为 Microsoft Dynamics AX 编码吗?

asp.net - ASP.NET 中的 Windows 身份验证模式使用 Active Directory 组名(Windows 2000 之前)?