在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類中定義的,所以,在列表中的每個對象有相同的定義。
我不認爲這個問題,因爲只要在列表中的一切至少一個元素正確綁定的,和正常工作。
嗯,我從我自己的工作中知道IBindingList是那裏最重要的一個。你是在你的集合類型上手動實現IBindingList,還是IBindingList?在我自己的工作中,我也實現了ICancelAddNew,這非常有用。 –
Nevyn
2012-08-01 21:18:41
上面列出了繼承類型的列表。我實現了IBindingList和ICancelAddNew。 IBindingList是否可以解決空列表問題? –
2012-08-01 21:29:58
您是在明確實現接口還是繼承自BindingList?我只是試着用BindingList 繼承的自定義列表,它對空列表工作得很好。我會建議繼承和重寫。 –
2012-08-01 21:36:01