Intereting Posts
SMTP Send блокирует мои файлы – c # качество печати winform Очень близко, но не вполне можно переопределить основной вид nopcommerce Формат данных в DataGridView в приложении Windows Как я могу реализовать Ninject .InSingletonScope () при использовании Unity IoC visual studio express: бесплатный инструмент диаграммы classов Для SMTP-сервера требуется безопасное соединение, или клиент не прошел аутентификацию. если загрузка на godaddy В какой области я должен давать этот файл cookie? Приложение C # случайно зависает при вызове из Process.Start () Добавление в список repopulate с последним элементом Как выполнять параллельные сборки тестов MSpec? WP 8.1 Код времени выполнения звонка, отправка SMS и отправка электронной почты (а не Silverlight 8.1) Событие CellContentClick не всегда работает Должен ли я освобождать объект COM на каждой итерации foreach? C #: побитовый оператор в перечислении (пользовательская авторизация в MVC)

Как связать сложный объект с DataGridView?

У меня есть class, который следует за формой:

public class Cat { public string Name { get; set; } public string Description {get; set; } public List Cheezbugers { get; private set; } }; public class Cheezburger { public int PattyCount { get; set; } public bool CanHaz { get; set; } }; 

Я хочу иметь возможность отображать List кошек в DataGridView следующим образом:

 --------------------------------------------------------------------------------- | Name | Description | PattyCount | CanHaz | PattyCount | CanHaz | etc -------------------------------------------------------------------------------- | Felix | Classic Cat | 1 | true | 3 | false | etc | Garfield | Fat,Lazy Cat | 2 | false | 7 | true | etc 

И так далее … objective состоит в том, чтобы перечислить все Cat Cheezbuger s в той же строке. Если вы просто попробуете привязать список Cat вы не получите этого поведения.

Проблема в том, что я не могу понять, как сделать сложную привязку источника между DataGridView и отдельными элементами в списке Cats.Cheezbugers . Для чего это стоит, я точно знаю, что каждый Cat в списке имеет такое же количество Cheezbuger s в своем списке.

Изменить :

Я знаю, что сложная привязка DataGridView задает один и тот же вопрос, но принятый ответ работает только в том случае, если я знаю, сколько элементов в списке заблаговременно, и это не так. Все, что я знаю, это то, что все списки будут иметь одинаковую длину.

Это не просто «сложная привязка», это Pivot , где вы хотите преобразовать детали повторяющиеся данные (список o «cheezburgers») в одну строку, и эта строка имеет неопределенное количество столбцов.

Я считаю, что ваш лучший вариант – написать собственный сериализатор, который позволит вам преобразовывать ваши данные в строки в XML-файле, а затем привязываться к нему. Поскольку количество столбцов будет несовместимым, xml будет более прощающим, хотя я не уверен, как DataGridView обработает его.

EDIT FOLLOWS Так как я не «знал», как DataGridView обрабатывал XML DataTable, я решил написать его и протестировать. Я работаю так, как я ожидал, и я верю, как вы захотите.

  1. Вот ваши classы cat & cheezburger (слегка измененные)

     public class Cat { public string Name { get; set; } public string Description { get; set; } public List Cheezbugers { get; private set; } public void AddCheezburger(Cheezburger cheezburger) { if (this.Cheezbugers == null) this.Cheezbugers = new List(); this.Cheezbugers.Add(cheezburger); } }; public class Cheezburger { public int PattyCount { get; set; } public bool CanHaz { get; set; } }; 
  2. Затем вам нужно создать простую форму с двумя кнопками «bind to object» (button1) и «bind to datatable» (button2), а DataGridView привязан к основанию. и введите код формы:

// в редакторе эта следующая строка находится в кодовом блоке, как только я его сохраню, это не так.

 public partial class Form1 : Form { List cats = new List(); public Form1() { InitializeComponent(); cats.Add(new Cat() { Name = "Felix", Description = "Classic Cat" }); cats.Add(new Cat() { Name = "Garfield", Description = "Fat,Lazy" }); cats.Add(new Cat() { Name = "Tom", Description = "Wanna-Be-Mouser" }); cats[0].AddCheezburger(new Cheezburger() { CanHaz = true, PattyCount = 1 }); cats[0].AddCheezburger(new Cheezburger() { CanHaz = false, PattyCount = 3 }); cats[1].AddCheezburger(new Cheezburger() { CanHaz = false, PattyCount = 2 }); cats[1].AddCheezburger(new Cheezburger() { CanHaz = true, PattyCount = 7 }); cats[1].AddCheezburger(new Cheezburger() { CanHaz = true, PattyCount = 99 }); cats[2].AddCheezburger(new Cheezburger() { CanHaz = true, PattyCount = 5 }); cats[2].AddCheezburger(new Cheezburger() { CanHaz = false, PattyCount = 14 }); } private void button1_Click(object sender, EventArgs e) { dataGridView1.DataSource = null; dataGridView1.DataSource = cats; } private void button2_Click(object sender, EventArgs e) { dataGridView1.DataSource = null; dataGridView1.DataSource = serializeCats(cats); } private DataTable serializeCats(List cats) { DataTable returnTable = new DataTable("Cats"); returnTable.Columns.Add(new DataColumn("Name")); returnTable.Columns.Add(new DataColumn("Description")); int setID = 1; foreach (Cat cat in cats) { //If the row requires more columns than are present then add additional columns int totalColumnsRequired = (cat.Cheezbugers.Count * 2) + 2; while (returnTable.Columns.Count < totalColumnsRequired) { returnTable.Columns.Add(new DataColumn("Can Haz " + setID.ToString())); returnTable.Columns.Add(new DataColumn("Patty Count " + setID.ToString())); setID++; } returnTable.AcceptChanges(); DataRow row = returnTable.NewRow(); row[0] = cat.Name; row[1] = cat.Description; int cbi = 2; //cheezburger index foreach (Cheezburger cheezburger in cat.Cheezbugers) { row[cbi] = cheezburger.CanHaz; cbi++; row[cbi] = cheezburger.PattyCount; cbi++; } returnTable.Rows.Add(row); } return returnTable; } } 

Не пытайтесь предопределять столбцы DataGridView, они будут создаваться динамически на основе источника данных. Привязка к списку кошек даст вам два столбца (имя / описание). Связывание с DataTable получает 8 столбцов, имя и описание + 6 столбцов информации cheezburger, выстроенных так, как вам кажется. Кошки Хаз Cheezeburgers

Если я правильно прочитал ваш вопрос, я думаю, что вы спрашиваете, как отобразить список элементов Cheezbugers для каждой кошки.

Один из способов концептуально выполнить это – привязать свойство Cheezbugers к Repeater с помощью настраиваемого шаблона столбца в сетке. Другими словами, гнездо ретранслятора в столбце специальной таблицы шаблонов и привяжите его там. Вы можете использовать шаблон списка или другой формат, чтобы представить список Cheezbugers. Он будет поддерживать любое количество элементов в списке.

EDIT: Я просто понял, что вы развиваетесь в формах окон, а не asp.net. Существует эквивалентный или разумный эквивалент ретранслятора в формах – DataRepeater . Возможно, вы сможете удовлетворить ваши потребности. Идея выше – то же самое.