2015-04-28 28 views
-2

我需要創建一個用戶控件MyTypeListControl以使用用戶控件MyTypeDisplayControl實例爲每個對象顯示類型爲MyType的對象的集合。如何創建用戶控件以在WinForms中顯示其他用戶控件的集合?

,這樣我可以

  1. MyTypeListControl比如我的WinForm的,然後
  2. MyType
  3. 負荷收集其分配給MyTypeListControl的數據源。

在結果中,它應該在MyTypeListControl的實例中生成並顯示MyTypeDisplayControl個實例的適當計數。

在情況下,如果我需要顯示的屬性列表 - 等效將DataGrid與指派給特定DataGrid的列從MyType特定字段,但我想查看每個MyType項目作爲用戶控制 - 與視覺更多的功率表示和功能比DataGrid提供了它的行。

這可能嗎?

I found this SO resource如何創建我的集合類型,但是這是問題的解決只有小部分......

+0

爲什麼不使用FlowLayoutPanel?除非我誤解了你的問題,否則你可以通過將你的用戶控件添加到FlowLayoutPanel中來顯示你的用戶控件的列表,你也可以很容易地操作這個集合。 –

+0

@JoshL。我可以將控件的集合添加到FlowLayoutPanel,類似於DataGrid.DataSource = ICollection ?你的意思是使用Controls集合來操縱? – Prokurors

+0

@ downvoters - 這個問題有什麼問題?這將是有益的,如果你會說出什麼是錯的,所以我可以改善;) – Prokurors

回答

1

這是很容易的(如果你知道如何),並沒有考慮這麼多的努力,你可能會首先考慮(至少對於處理少於100個項目的集合的簡單實現)。

所以剛開始,讓我們創建一個MyType的:

public class MyType 
{ 
    public static MyType Empty = new MyType(String.Empty, DateTime.MinValue); 

    public MyType(string myName, DateTime myBirthday) 
    { 
     MyName = myName; 
     MyBirthday = myBirthday; 
    } 

    public DateTime MyBirthday { get; private set; } 

    public string MyName { get; private set; } 
} 

在未來,我們需要一個MyTypeControl:

public partial class MyTypeControl : UserControl 
{ 
    private MyType _MyType; 
    private Label labelBirthday; 
    private Label labelName; 
    private Label labelSeparator; 

    public MyTypeControl() 
    { 
     InitializeComponent(); 
    } 

    public event EventHandler MyTypeChanged; 

    public MyType MyType 
    { 
     get { return _MyType; } 
     set 
     { 
      if (_MyType == value) 
       return; 

      _MyType = value ?? MyType.Empty; 
      OnMyTypeChanged(EventArgs.Empty); 
     } 
    } 

    protected virtual void OnMyTypeChanged(EventArgs eventArgs) 
    { 
     UpdateVisualization(); 
     RaiseEvent(MyTypeChanged, eventArgs); 
    } 

    protected void UpdateVisualization() 
    { 
     SuspendLayout(); 

     labelName.Text = _MyType.MyName; 
     labelBirthday.Text = _MyType.MyBirthday.ToString("F"); 
     labelBirthday.Visible = _MyType.MyBirthday != DateTime.MinValue; 

     ResumeLayout(); 
    } 

    private void InitializeComponent() 
    { 
     labelName = new Label(); 
     labelBirthday = new Label(); 
     labelSeparator = new Label(); 
     SuspendLayout(); 
     labelName.Dock = DockStyle.Top; 
     labelName.Location = new Point(0, 0); 
     labelName.TextAlign = ContentAlignment.MiddleCenter; 
     labelBirthday.Dock = DockStyle.Top; 
     labelBirthday.TextAlign = ContentAlignment.MiddleCenter; 
     labelSeparator.BorderStyle = BorderStyle.Fixed3D; 
     labelSeparator.Dock = DockStyle.Top; 
     labelSeparator.Size = new Size(150, 2); 
     Controls.Add(labelSeparator); 
     Controls.Add(labelBirthday); 
     Controls.Add(labelName); 
     MinimumSize = new Size(0, 48); 
     Name = "MyTypeControl"; 
     Size = new Size(150, 48); 
     ResumeLayout(false); 
    } 

    private void RaiseEvent(EventHandler eventHandler, EventArgs eventArgs) 
    { 
     var temp = eventHandler; 

     if (temp != null) 
      temp(this, eventArgs); 
    } 
} 

然後是我們的神奇列表控件:

public class MyTypeListControl : UserControl 
{ 
    private ObservableCollection<MyType> _Items; 

    public MyTypeListControl() 
    { 
     AutoScroll = true; 
     _Items = new ObservableCollection<MyType>(); 
     _Items.CollectionChanged += OnItemsCollectionChanged; 
    } 

    public Collection<MyType> Items 
    { 
     get { return _Items; } 
    } 

    private void OnItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     UpdateVisualization(); 
    } 

    private void UpdateVisualization() 
    { 
     SuspendLayout(); 
     Controls.Clear(); 

     foreach (var item in _Items) 
     { 
      var control = new MyTypeControl { MyType = item, Dock = DockStyle.Top }; 
      Controls.Add(control); 
      Controls.SetChildIndex(control, 0); 
     } 

     ResumeLayout(); 
    } 
} 

而現在只需在窗體或父級控件中創建列表控件,並填充一些有意義的值:

myTypeListControl.Items.Add(new MyType("Adam", DateTime.UtcNow.Add(-TimeSpan.FromDays(365 * 40)))); 
myTypeListControl.Items.Add(new MyType("Eva", DateTime.UtcNow.Add(-TimeSpan.FromDays(365 * 38)))); 
+0

謝謝,這看起來很有前途 - 我會評論什麼時候我會檢查這個解決方案 – Prokurors

+0

是的,這是按預期工作!我仍然不明白爲什麼這個問題會得到如此負面的評價,但主要是我得到了一個很好的答案!如果您不介意我會添加一個小的更新 - 以便解決方案將接受MyType-s的收集 – Prokurors

相關問題