In WinForms, controls have DataSource and DataMember properties that allow you to bind controls to a data source.
To create an xml editor in WinForms, as shown in the figure, the following code is sufficient.
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<DataGridView>()) g.BindingContext[g.DataSource, g.DataMember].CurrentItemChanged += (s, e) => t.Text = Model.GetXml(d); f.ShowDialog(); } class Model { public static object Create() { var xml = @" <data> <level1 name='l1'> <level2 name='l2'> <level3 name='l3' /> </level2> </level1> </data>"; 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(); } } }