Страницы

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

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

Как привязать контролы к иерархическим данным?

#c_sharp #winforms #binding


Возможно ли в WinForms привязать контролы к иерархическим данным?
Например, есть следующий xml:


    
        
            
        
    
    
        
            
        
    



Надо все значения level1 name вывести в один DataGridView. Все level2 name вывести
в другой DataGridView. И все level3 name - в третий.
Значения должны выводиться с учетом иерархии. Например, если в DataGridView для level1
текущей строкой является l11, то в DataGridView для level2 выводится l12.
Значения в каждом из DataGridView можно добавлять/удалять/редактировать и при этом
должен сразу выводиться измененный xml. 


    


Ответы

Ответ 1



В WinForms у контролов есть свойства DataSource и DataMember, которые позволяют привязывать контрол к источнику данных. Для создания xml-редактора в WinForms, как показано на рис., достаточно следующего кода. 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 = Model.Create(); var l1 = new DataGridView() { Bounds = new Rectangle(0, 0, 249, 400), BorderStyle = BorderStyle.None, ColumnHeadersVisible = false, DataSource = d, DataMember = "level1" }; var l2 = new DataGridView() { Bounds = new Rectangle(250, 0, 249, 199), BorderStyle = BorderStyle.None, ColumnHeadersVisible = false, DataSource = d, DataMember = "level1.level1_level2" }; var l3 = new DataGridView() { Bounds = new Rectangle(250, 200, 249, 200), BorderStyle = BorderStyle.None, ColumnHeadersVisible = false, DataSource = d, DataMember = "level1.level1_level2.level2_level3" }; var t = new RichTextBox() { Bounds = new Rectangle(501, 0, 349, 400), BorderStyle = BorderStyle.None, ReadOnly = true, Text = Model.GetXml(d) }; var f = new Form() { ClientSize = new Size(850, 400), FormBorderStyle = FormBorderStyle.FixedDialog, MaximizeBox = false, MinimizeBox = false }; f.Controls.AddRange(new Control[] { l3, l2, l1, t }); foreach (var g in f.Controls.OfType()) g.BindingContext[g.DataSource, g.DataMember].CurrentItemChanged += (s, e) => t.Text = Model.GetXml(d); f.ShowDialog(); } class Model { public static object Create() { var xml = @" "; var ds = new DataSet(); ds.ReadXml(new StringReader(xml)); return ds; } public static string GetXml(object model) { var ds = model as DataSet; var sw = new StringWriter(); ds.WriteXml(sw); return sw.ToString(); } } }

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

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