Отображение списка объектов, содержащих список в виде сетки

В настоящее время я работаю над приложением менеджера закладок (Windows Forms) с расширенными возможностями поиска.

Я создал class Links , и каждый раз, когда пользователь вводит URL-адрес, я создам объект Link и сохраняю там детали. В настоящее время он имеет свойства Name , URL и Tags , где Tags являются списком.

Во время выполнения, когда я устанавливаю свойство DataSource gridview для объектов List , появляется Name и URL , но tags нет .

Как мне перейти к отображению списка тегов внутри объекта List в gridview?

EDIT: Просто идея. Что делать, если я пишу функцию для преобразования List в DataTable , а затем DataSource свойство DataSource DataGrid для DataTable ?

Проблема заключается в том, что каждый раз, когда происходят изменения в List мне придется снова создавать DataTable , что не кажется идеальным с точки зрения производительности.

EDIT 2: Я хочу отобразить каждый элемент в списке как столбец DataGridViewTextBox.

Спасибо,

Abijeet.

Возможно, это то, что вы хотите … объект, который, как представляется, имеет больше свойств, которые он имеет на самом деле.

DataGridView управления DataGridView поддерживает пространство имен ComponentModel чтобы вы могли создавать classы, которые, как представляется, не имеют свойств, которые не существуют. Это тот же механизм, что и PropertyGrid .

Образец кода

Этот образец является полностью рабочим classом форм Windows, с формой, содержащей DataGridView . Я добавляю некоторые объекты в is, используя список, который затем устанавливается в свойство DataSource .

Объекты внутри этого списка не имеют свойств вообще … но они используют модель компонента для описания «виртуальных» свойств DataGridView .

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; namespace WindowsFormsApplication1 { public class Form1 : Form { public Form1() { InitializeComponent(); this.dataGridView1.Dock = DockStyle.Fill; } protected override void OnLoad(EventArgs e) { base.OnLoad(e); dataGridView1.DataSource = new List { new MyClass("value 1", "value 2", "value 3"), new MyClass("value 1", "value 2"), }; } class MyClass : CustomTypeDescriptor { public MyClass(params string[] tags) { this.tags = new List(tags); } public override PropertyDescriptorCollection GetProperties(Attribute[] attributes) { var listProps = new List(); // adding properties dynamically for (int i = 0; i < tags.Count; i++) listProps.Add(new PropDesc("Tag" + i, i)); return new PropertyDescriptorCollection(listProps.ToArray()); } private List tags = new List(); class PropDesc : PropertyDescriptor { private int index; public PropDesc(string propName, int index) : base(propName, new Attribute[0]) { this.index = index; } public override bool CanResetValue(object component) { return false; } public override Type ComponentType { get { return typeof(MyClass); } } public override object GetValue(object component) { if (index >= ((MyClass)component).tags.Count) return null; return ((MyClass)component).tags[index]; } public override bool IsReadOnly { get { return true; } } public override Type PropertyType { get { return typeof(string); } } public override void ResetValue(object component) { } public override void SetValue(object component, object value) { } public override bool ShouldSerializeValue(object component) { return false; } } } private void InitializeComponent() { this.dataGridView1 = new DataGridView(); ((ISupportInitialize)(this.dataGridView1)).BeginInit(); this.SuspendLayout(); // dataGridView1 this.dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dataGridView1.Dock = DockStyle.Fill; this.dataGridView1.Location = new System.Drawing.Point(0, 0); this.dataGridView1.Name = "dataGridView1"; this.dataGridView1.Size = new System.Drawing.Size(284, 262); this.dataGridView1.TabIndex = 1; // Form1 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 262); this.Controls.Add(this.dataGridView1); this.Name = "Form1"; this.Text = "Form1"; ((ISupportInitialize)(this.dataGridView1)).EndInit(); this.ResumeLayout(false); } private DataGridView dataGridView1; } } 

Если вы работаете в WPF, как мне кажется, почему бы не использовать шаблон детали данных DataGridView? У вас может быть вторая grid в виде шаблона детали строки, который вы связываете с списком тегов.