4

私は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を使用してカスタムユーザーコントロールを作成しました。 ここに画像の説明を入力してください 以下は私のコードです。

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

上記のデータを使用すると、私のアプリケーションは次のようになります。 ここに画像の説明を入力してください

すべての注文のすべてのアイテムを追加/編集できる必要があります。追加は非常に簡単なようです。新しいフォームを作成し、ユーザーが詳細を入力してから、DB呼び出しを行ってそのアイテムを追加します。

私の質問は次のとおり
です。アイテムを追加/編集した後にビューを自動更新するにはどうすればよいですか?ビューを更新するたびに、コントロールをそのリストにバインドできますか?アイテムや注文を人に追加できるようにする必要があります。 それを行う最も簡単な方法は何でしょうか?

この種の表示は正しいですか?改善できますか?はいの場合、どのように?

4

1 に答える 1

1

この問題を解決する 1 つの方法は、ポーリング メカニズムを使用することです。これは、 System.Threading.ThreadPool を使用するSystem.Threading.Timerを使用して組み込むことができます。

データが更新されているかどうかを確認するために、繰り返しクエリを実行します。変更日をデータとともに保存する必要があります。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();
            }
        }
    }
}
于 2013-03-14T20:16:18.027 に答える