2012-08-01 42 views
3

在VS 2008中使用C#的WinForms(.NET 3.5)綁定一個DataGridView到IBindingList的可能含有零個元素

我想綁定列表,可能爲空,到數據網格。

如果列表中的元素,和的AutoGenerateColumns被啓用,數據綁定到列表中,一切工作正常。

但是,如果列表爲空,或者如果列表爲空(通過刪除最後一個元素)什麼都沒有的顯示,就在灰色背景。

如果我手動創建的列,如:

   if (m_DataGrid.AutoGenerateColumns == false) 
       { 
        foreach (var pair in objData.PropertyDataTable 
         .Where(pair => pair.Value.IsNative == true 
            && pair.Value.IsList == false)) 
        { 
         string propertyName = pair.Key; 
         PropertyData propertyData = pair.Value; 

         if (propertyData.Type == typeof(bool)) 
         { 
          var column = new DataGridViewCheckBoxColumn() 
          { 
           Name = propertyName, 
           HeaderText = propertyName, 
           DataPropertyName = propertyName, 
           ValueType = propertyData.Type, 
          }; 
          m_DataGrid.Columns.Add(column); 
         } 
         else 
         { 
          var column = new DataGridViewTextBoxColumn() 
          { 
           Name = propertyName, 
           HeaderText = propertyName, 
           DataPropertyName = propertyName, 
           ValueType = propertyData.Type, 
          }; 
          m_DataGrid.Columns.Add(column); 
         } 
        } 
       } 

的列將出現,並且我能夠添加新行,但數據沒有實際的約束,併爲行沒有默認值當列自動生成時,它們就像通常那樣被填充。

當我離開的看法和回報,所添加的行仍然存在,但數據不會保留。

自動比較生成的列以在調試器的手動創建的列,則屬性是不同的兩者之間是上的DataGridViewColumn基類IsDataBound屬性。

當啓用AutoGenerateColumns並且列表中有一個或多個元素但爲false時,IsDataBound被設置爲true,即使該列的DataPropertyName屬性被正確設置,該列表也具有零初始元素。

有什麼辦法可以將空列表綁定到數據網格,並允許用戶將行添加到空白列表中,並將所有內容正確綁定?

我甚至試圖在綁定之前向空列表中添加一個元素,讓它自動生成並綁定列......但是一旦行被移除,列就會消失,綁定也會丟失。

其他實施細則:

我想這是一個繼承自定義列表/收藏型數據源綁定來自:

- ICustomTypeDescriptor 
- IBindingList 
- ICancelAddNew 
- IList<T> 
- ICollection<T> 
- IEnumerable<T> 
- IList 
- ICollection 
- IEnumerable 

在列表中的對象是從繼承的動態對象ICustomTypeDescriptor,和地圖屬性在字典中的值。該類型是在知道了動態類型可用的屬性信息(屬性名稱,類型,屬性等) 每個列表具有分配給它一個定義的ObjectDefinition類中定義的,所以,在列表中的每個對象有相同的定義。

我不認爲這個問題,因爲只要在列表中的一切至少一個元素正確綁定的,和正常工作。

+0

嗯,我從我自己的工作中知道IBindingList是那裏最重要的一個。你是在你的集合類型上手動實現IBindingList,還是IBindingList ?在我自己的工作中,我也實現了ICancelAddNew,這非常有用。 – Nevyn 2012-08-01 21:18:41

+0

上面列出了繼承類型的列表。我實現了IBindingList和ICancelAddNew。 IBindingList 是否可以解決空列表問題? – 2012-08-01 21:29:58

+0

您是在明確實現接口還是繼承自BindingList ?我只是試着用BindingList 繼承的自定義列表,它對空列表工作得很好。我會建議繼承和重寫。 – 2012-08-01 21:36:01

回答

3

對於列表,它不是ICustomTypeDescriptor掌管,但ITypedList。在列表級別實現此功能,並且您可以在運行時根據需要提供屬性。因爲這不依賴於任何行,所以即使對於零行也應該工作。

+0

哇,很好的答案!我想知道BindingList 是如何神奇的,只要我讀這個頁面http://msdn.microsoft.com/en-us/library/ms404298.aspx詳細說明ITypedList,並在我自己的自定義BindingList上實現了一切代碼。 – 2012-08-01 21:54:26

+0

謝謝,讓我試試... – 2012-08-01 21:56:29

+1

@DavidHall好吧,你需要注意 - 它比這更復雜:)如果它可以通過公共的非對象索引器識別可能的類型, SomeType this [int index] {get;}',那麼如果沒有ITypedList,它可以使用TypeDescriptor.GetProperties(typeof(SomeType)) - 這意味着TypeDescriptionProvider可能會*有機會干擾。 – 2012-08-01 21:58:31

相關問題