我有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(); } } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。