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);
                        }
                    }
                }

列が表示され、新しい行を追加できますが、データは実際にはバインドされておらず、列が自動生成されるときの通常のように行のデフォルト値が入力されません。

ビューを離れて戻ると、追加された行は残りますが、データは保持されません。

自動生成された列をデバッガーで手動で作成された列と比較すると、2つの間で異なる唯一のプロパティは、DataGridViewColumn基本クラスのIsDataBoundプロパティです。

AutoGenerateColumnsが有効になっている場合、IsDataBoundはtrueに設定され、リストに1つ以上の要素がありますが、falseは、列のDataPropertyNameプロパティが適切に設定されているにもかかわらず、リストの初期要素がゼロである場合です。

空のリストをデータグリッドにバインドし、すべてが適切にバインドされた状態で、ユーザーが空白のリストに行を追加できるようにする方法はありますか?

バインドする前に空のリストに要素を追加して、列を自動生成してバインドしようとしました...しかし、行が削除されるとすぐに列が消え、バインドが失われます。

その他の実装の詳細:

以下から継承するカスタムリスト/コレクションタイプであるデータソースをバインドしようとしています:

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

リスト内のオブジェクトは、 ICustomTypeDescriptorから継承する動的オブジェクトであり、プロパティをディクショナリ内の値にマップします。タイプは、動的タイプ(プロパティ名、タイプ、属性など)で使用可能なプロパティ情報を知っているObjectDefinitionクラスで定義されます。各リストには定義が割り当てられているため、リスト内のすべてのオブジェクトは同じです。意味。

リストに少なくとも1つの要素がある限り、すべてが適切にバインドされ、正常に機能するため、これは重要ではないと思います。

4

1 に答える 1

3

リストの場合、ルールを設定するのはICustomTypeDescriptorではなく、ITypedListです。これをリストレベルで実装すると、必要に応じて実行時にプロパティを提供できます。これはどの行にも依存しないため、ゼロ行でも機能するはずです。

于 2012-08-01T21:39:51.210 に答える