2012-11-16 31 views
2

我甚至不確定我是否正確地做到了這一點。但基本上我有一個由類/接口構建的對象列表。從那裏,我將列表綁定到Windows窗體(C#)上的DataGridView動態自動更新(到UI,網格)綁定列表在C#Winform?

這裏的列表是一個Sync列表,它將自動更新UI,在本例中爲DataGridView

現在每件事情都可以正常工作,但現在我想讓列表應該有一個動態對象,也就是對象默認具有兩個靜態屬性(ID,Name),並且在運行時用戶將選擇剩餘的屬性。這些應該綁定到數據網格。列表中的任何更新應自動反映在網格中。

我知道,我們可以使用動態對象,但我想知道,如何爲解決方案的方法,

datagridview.DataSource = myData; // myData is AutoUpdateList<IPersonInfo> 

現在IPersonInfo是對象的類型,需要爲它添加動態屬性在運行時鍵入。

public class AutoUpdateList<T> : BindingList<T> 
{ 
    private ISynchronizeInvoke _SyncObject; 
    private Action<ListChangedEventArgs> _FireEventAction; 

    public AutoUpdateList() 
     : this(null) 
    { 
    } 

    public AutoUpdateList(ISynchronizeInvoke syncObject) 
    { 
     _SyncObject = syncObject; 
     _FireEventAction = FireEvent; 
    } 

    protected override void OnListChanged(ListChangedEventArgs args) 
    { 
     try 
     { 
      if (_SyncObject == null) 
      { 
       FireEvent(args); 
      } 
      else 
      { 
       _SyncObject.Invoke(_FireEventAction, new object[] { args }); 
      } 
     } 
     catch (Exception) 
     { 
      // TODO: Log Here 
     } 
    } 

    private void FireEvent(ListChangedEventArgs args) 
    { 
     base.OnListChanged(args);    
    } 
} 

你能幫忙嗎?

回答

1

我想你最好的辦法是'模擬'的屬性。我想最好的辦法是ITypedList實施,最好的例子是here

曾經我遇到過類似的問題。對於我的情況,我採取了this的方法。這可能對你有所幫助。

此外,有一種方法(它不是關於任何'動態')有一個基類與全套屬性你會使用。但如果在運行時之前沒有所有屬性,它將不起作用。

+0

我可以通過動態屬性添加/刪除屬性。只關心這些應該在狀態網格中自動更新。 – Dhana

+0

而你有ITypedList方式。實現之後,您需要的所有內容都是在將新元素添加到集合時傳遞新屬性名稱。作爲集合,我的意思是MasterRecordCollection instanse,如[this](http://www.sturmnet.org/blog/2005/02/04/simulating-fields)文章中的示例。我昨天做了檢查。您只需在每次創建新屬性時更新DataGridView的DataSource。 – heq

+0

我的意思是在你更新數據源之後,新列將被自動添加 – heq

0

您應該考慮使用DataTable類。您可以通過添加列和行來動態構建表格,然後將其綁定到DataGridView