Это не просто «сложная привязка», это Pivot , где вы хотите преобразовать повторяющиеся данные (список чизбургеров) в одну строку, и эта строка имеетнеопределенное количество столбцов.
Я считаю, что ваш лучший вариант здесь - написать собственный сериализатор, который позволит вам преобразовывать ваши данные в строки в формате данных XML и затем связываться с ним.Поскольку количество столбцов будет нестабильным, xml будет более щадящим, хотя я не уверен, как DataGridView справится с этим.
EDIT FOLLOWS Поскольку я не «знал», какDataGridView будет обрабатывать таблицу данных XML. Я решил написать ее и протестировать.Я работаю так, как я ожидал, и я верю, что вы захотите.
Вот ваши классы кошек и чизбургеров (немного изменены)
public class Cat
{
public string Name { get; set; }
public string Description { get; set; }
public List<Cheezburger> Cheezbugers { get; private set; }
public void AddCheezburger(Cheezburger cheezburger)
{
if (this.Cheezbugers == null)
this.Cheezbugers = new List<Cheezburger>();
this.Cheezbugers.Add(cheezburger);
}
};
public class Cheezburger
{
public int PattyCount { get; set; }
public bool CanHaz { get; set; }
};
Затем вам нужно создать простую форму с двумя кнопками «привязать к объекту» (button1) и «привязать к датируемому объекту» (button2) с DataGridView, привязанным к нижней части.и закодируйте форму как:
// в редакторе следующая строка находится в блоке кода, как только я сохраню его, это не будет ..
public partial class Form1 : Form
{
List<Cat> cats = new List<Cat>();
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<Cat> 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, они будут создаваться динамически на основе источника данных.При связывании со списком кошек вы получите два столбца (имя / описание). При связывании с таблицей данных будет получено 8 столбцов, имя и описание + 6 столбцов информации о cheezburger, которые выстроены в ряд (я полагаю), как вы хотите.