2015-11-02 92 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