3

在 VS 2008 (.Net 3.5) 中使用 C# WinForms

我正在尝试将一个可能为空的列表绑定到数据网格。

如果列表有元素,并且启用了 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 启用时,IsDataBound 设置为 true,列表中有一个或多个元素,但如果列表的初始元素为零,则为 false,尽管列的 DataPropertyName 属性已正确设置。

有没有办法将空列表绑定到数据网格,并允许用户在空白列表中添加行,并且所有内容都正确绑定?

我什至尝试在绑定之前将一个元素添加到一个空列表中,让它自动生成并绑定列......但是一旦删除了行,列就会消失并且绑定丢失。

其他实施细节:

我正在尝试绑定一个自定义列表/集合类型的数据源,该类型继承自:

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

列表中的对象是从ICustomTypeDescriptor继承的动态对象,并将属性映射到字典中的值。这些类型在 ObjectDefinition 类中定义,该类知道动态类型的可用属性信息(属性名称、类型、属性等...)每个列表都有一个分配给它的定义,因此列表中的每个对象都有相同的定义。

我不认为这很重要,因为只要列表中至少有一个元素,一切都会正确绑定,并且可以正常工作。

4

1 回答 1

3

对于列表,规则的不是 ICustomTypeDescriptor,而是 ITypedList。在列表级别实现这一点,您可以在运行时提供您认为合适的属性。因为这不依赖于任何行,所以它甚至应该适用于零行。

于 2012-08-01T21:39:51.210 回答