Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Как таблицу со связью “сама на себя” привязать к контролам для редактирования?

#c_sharp #winforms


Есть таблица со связью "сама на себя". Например:

Id, ParentId, Text
0,  null,     l1
1,  0,        l2
2,  1,        l3


В ней с помощью Id и ParentId - nested relations - определяется иерархия.
Возможно ли такую таблицу привязать к WinForms контролам?
В первом контроле надо выводить все строки, а во втором контроле надо выводить только
строки, у которых parentId равен Id строки, выделенной в первом контроле.
Должна быть возможность создавать иерархию с неограниченной вложенности.
Как это можно сделать на C#? Возможно ли данные из таблицы выводить/сохранять в csv
или xml?   



Слева два связанных грида, а справа данные из таблицы в csv- и xml-формате.
    


Ответы

Ответ 1



Таблицы c nested relations можно привязывать к контролам в WinForms. Все что требуется для редактирования такой таблицы находится в методе Main. using System; using System.Data; using System.Drawing; using System.Windows.Forms; using System.Linq; using System.IO; class Program { [STAThread] static void Main(string[] args) { var d = Data.LoadCsv(); var l1 = new DataGridView() { Bounds = new Rectangle(0, 0, 249, 400), BorderStyle = BorderStyle.None, ColumnHeadersVisible = false, DataSource = d, DataMember = "row" }; var l2 = new DataGridView() { Bounds = new Rectangle(250, 0, 249, 400), BorderStyle = BorderStyle.None, ColumnHeadersVisible = false, DataSource = d, DataMember = "row.row_row" }; var trace = new Func(data => Data.GetCsv(data) + "\n" + Data.GetXml(data)); var t = new RichTextBox() { Bounds = new Rectangle(501, 0, 349, 400), BorderStyle = BorderStyle.None, ReadOnly = true, Text = trace(d) }; var f = new Form() { ClientSize = new Size(850, 400), FormBorderStyle = FormBorderStyle.FixedDialog, MaximizeBox = false, MinimizeBox = false }; f.Controls.AddRange(new Control[] { l2, l1, t }); foreach (var g in f.Controls.OfType()) g.BindingContext[g.DataSource, g.DataMember].CurrentItemChanged += (s, e) => t.Text = trace(d); f.ShowDialog(); } class Data { public static object LoadCsv() { var ds = new DataSet(); // это для теста. а обычно данные загружают из базы данных // например, из SQL Server с помощью SqlDataAdapter ds.ReadXml(new StringReader(@" ")); return ds; } public static string GetXml(object model) { var ds = model as DataSet; var sw = new StringWriter(); ds.WriteXml(sw); return sw.ToString(); } public static string GetCsv(object model) { var ds = model as DataSet; var sw = new StringWriter(); var cs = ds.Tables[0].Columns.OfType(); sw.WriteLine(String.Join(",\t\t", new[] { "id", "parentId", "text" })); var pr = ds.Tables[0].ParentRelations[0]; var id = pr.ParentColumns[0]; var pid = pr.ChildColumns[0]; foreach (var r in ds.Tables[0].Rows.OfType()) sw.WriteLine(String.Join(",\t\t", new[] { r[id], r[pid], r["text"] })); return sw.ToString(); } } }

Комментариев нет:

Отправить комментарий