2015-11-02 91 views
1


让我描述一下情况。 Winforms C#
我有数据的xml文件。我使用Deserialize将这些数据加载到用户定义的类对象中。
基于这个对象的数据,我构建了[在Form] UI中:自定义控件(textBox,groupBox中的2个按钮)的许多tabPages。我还可以使用Serialize将此用户定义的类对象保存为XML文件。

问: 当我在窗体在UI定制控制更新textBox.Text我不知道如何保持与数据(布局布局)的对象连接和保存更新的对象与数据的XML。文本的更改仅在用户自定义控件TextBox中发生。我想从数据对象(布局)中的UI更新数据,然后简单地用Serialization保存。C#XML。从XML获取数据到对象,在UI中更新,保存回XML

用户类:

public class Layout 
{ 
    public string type; 
    public List<TabPage> TabPageList; 
    public Layout() 
    { 
     this.TabPageList = new List<TabPage>(); 
    } 
} 
public class TabPage 
{ 
    public string text; 
    public List<ActionGroup> ActionGroupList; 

    public TabPage() 
    { 
     this.ActionGroupList = new List<ActionGroup>(); 
    } 
} 
public class ActionGroup 
{ 
    public string type; 
    public string text; 
    public string sourceLocal; 
    public string sourceRemote; 

    public ActionGroup() 
    { 
     this.type = string.Empty; 
     this.text = string.Empty; 
     this.sourceLocal = string.Empty; 
     this.sourceRemote = string.Empty; 
    } 
} 

自定义控制:

public partial class ViewActionGroup : UserControl 
{ 
    public string type; 
    public string text; 
    public string sourceLocal; 
    public string sourceRemote; 
    public bool isRemote; 
    public bool isDone; 

    public ViewActionGroup() 
    { 
     this.type = string.Empty; 
     this.text = string.Empty; 
     this.sourceLocal = string.Empty; 
     this.sourceRemote = string.Empty; 
     this.isRemote = false; 
     this.isDone = false; 
     InitializeComponent(); 
    } 
    public ViewActionGroup(ActionGroup actionGroup) 
    { 
     this.type = actionGroup.type; 
     this.text = actionGroup.text; 
     this.sourceLocal = actionGroup.sourceLocal; 
     this.sourceRemote = actionGroup.sourceRemote; 
     this.isRemote = false; 
     this.isDone = false; 
     InitializeComponent(); 

     groupBox1.Text = text; 
     button1.Text = type; 
     button1.Click += new EventHandler(Button_Click); 
     textBox1.Text = sourceLocal; 
     textBox1.TextChanged += new EventHandler(textBox1_TextChanged); 
    } 

    public void ChangeToRemote() 
    { 
     isRemote = true; 
     textBox1.Text = this.sourceRemote;    
    } 

    public void ChangeToLocal() 
    { 
     isRemote = false; 
     textBox1.Text = this.sourceLocal;    
    } 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     if (this.isRemote) 
     { 
      this.sourceRemote = textBox1.Text; 
     } 
     else 
     { 
      this.sourceLocal = textBox1.Text; 
     } 
    } 

创建UI其中I松散UI和数据对象之间的连接:

private void CreateLayout(Layout layout) 
    { 
     this.Text = layout.type; 
     TabControl tabControl = new TabControl(); 

     tabControl.Dock = DockStyle.Fill; 

     int tabCount = 0; 

     foreach (TabPage tabpage in layout.TabPageList) 
     { 
      int actionCount = 0; 

      tabControl.TabPages.Add(tabpage.text); 
      foreach (ActionGroup actionGroup in tabpage.ActionGroupList) 
      { 
       ViewActionGroup view = new ViewActionGroup(actionGroup); 
       view.Location = new Point(0, actionCount * view.Height); 
       tabControl.TabPages[tabCount].Controls.Add(view); 
       tabControl.TabPages[tabCount].AutoScroll = true; 
       tabControl.TabPages[tabCount].AutoScrollMinSize = new System.Drawing.Size(tabControl.Width/2,tabControl.Height); 
       actionCount++; 
      } 
      tabCount++; 
      this.panelMain.Controls.Add(tabControl); 
     } 

    } 
+0

这是WPF或WinForms的? – loopedcode

+0

@loopedcode这是Winforms C# – Lukasz

+0

嗨卢卡斯,请注意,专业人士在这里给出答案,渴望声望点。如果您的答案帮助您解决问题,那将是非常友善的答案,您应该将其标记为已接受的答案,这将向其他人展示此问题已解决。如果答案没有帮助,请发表评论,Thx! – Shnugo

回答

1

有两种常用方法:

其中一个是例程WriteDataIntoControls和另一个ReadDataFromControls,您可以手动将数据传输到您的可见控件(优势:最高控制度)。在这种情况下,您必须从XML源读取对象,将其反序列化为您的业务对象,并创建所有可见的控件及其值。在保存时,您必须将所有值传输到您的业务对象,并在此之后进行serizalize。

第二个是DataBinding(优势:自动化程度最高)。请阅读此处:https://msdn.microsoft.com/en-us/library/ef2xyb33%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

您可以绑定到简单值以及列表(包括导航)或复杂对象。

您可以找到一个教程:http://www.codeproject.com/Articles/24656/A-Detailed-Data-Binding-Tutorial

+0

我不能在这里格式化。我有个问题。我有这样的: view.DataBindings。添加(“SourceLocal”,actionGroup,“SourceLocal”,true,DataSourceUpdateMode.OnPropertyChanged); view.DataBindings.Add(“SourceRemote”,actionGroup,“SourceRemote”,true,DataSourceUpdateMode.OnPropertyChanged); 如何将对象中的两个字段绑定到来自自定义控件的两个字段? – Lukasz

+0

@Lukasz,你可以添加两个DataBindings ...请不要在评论中提出后续问题。他们不会引起任何关注...相反,开始一个新的问题,你可以在那里详细描述和描述... – Shnugo

1

@Shnugo非常感谢您的反馈意见。你发布的教程没有帮助,因为它对我来说太难了,但数据绑定主题给了我一些线索。

这里简单的VB教程其实很简单。它帮助我在C#中快速完成它。 https://www.youtube.com/watch?v=jqLQ2K9YY2A

C#解决方案

class MyObject 
{ 
    string name; 

    public MyObject() 
    { } 

    public string Name 
    { 
     get { return name;} 
     set { name = value; } 
    } 
} 

public partial class Form1 : Form 
{ 
    MyObject obj = new MyObject(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     obj.Name = "Lucas"; 
     textBox1.DataBindings.Add("Text", obj, "Name", true, DataSourceUpdateMode.OnPropertyChanged); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     label1.Text = obj.Name; 
    } 
} 
+0

太棒了!很高兴你能解决这个问题! – Shnugo