翻譯|使用教程|編輯:王香|2018-08-27 09:46:35.000|閱讀 554 次
概述:本文詳細介紹了在TeeChart如何自定義序列化
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
【下載TeeChart.Net最新版本】
自定義序列化是一個高級主題,它提供了正確保存和恢復開發人員設計的自定義元素的選項,這些自定義元素可能與TeeChart自己的功能集相關但不在其中,Steema將自定義序列化所能提供的支持限制在本教程中概述的技術范圍內。
TeeChart自動處理所有必要的序列化步驟,以允許保存和調用TeeChart。這包括圖表及其系列的所有修改元素。
TeeChart系列提供用戶需要的大部分功能,但用戶希望對其進行修改以包含自己的其他信息,以便系列發布或采取行動或在使用該系列時提供應用程序其他部分的參考。為此,可能希望創建自己的SeriesType,從TeeChart系列派生,添加自己的自定義元素。TeeChart的自定義序列化允許保存(序列化)和恢復這些元素。
請注意:保存自定義元素分為兩種技術:
假設用戶希望從TeeChart的系列中獲得系列,線系列包含需要的功能,但希望添加一些元素用于跟蹤目的或作為與任何特定數據集關聯的增值對象,以下是如何定義派生自Line Series的Custom Series的示例:
public class MyLine : Steema.TeeChart.Styles.Line 
{ 
  public MyLine(Chart c) : base(c) 
  { 
    myStrVar = "default"; 
  } 
 
  public MyLine() : this((Chart)null) { } 
 
  private string myStrVar = ""; 
  private int myIntVar = 0; 
 
  public string MyStrProp 
  { 
    get { return myStrVar; } 
    set { myStrVar = value; } 
  } 
 
  public int MyIntProp 
  { 
    get { return myIntVar; } 
    set { myIntVar = value; } 
  } 
}
您可以填充自定義變量并保存圖表,并在重新導入已保存的圖表時導入它們,只要變量屬于已知的系統類型(例如String,Integer,Double),就不需要額外的步驟。TeeChart將處理序列化和反序列化,例如:保存帶有修改系列的圖表
private void button1_Click(object sender, EventArgs e) 
{ 
  MyLine mLine=new MyLine(); 
 
  mLine.MyStrProp = "now set"; 
  mLine.MyIntProp = 43; 
 
  tChart1.Series.Add(mLine); 
  mLine.FillSampleValues(); 
 
  tChart1.Export.Template.Save(@"c:\files\customLine.ten"); 
}
導入帶有修改系列的圖表
private void button1_Click(object sender, EventArgs e) 
private void button2_Click(object sender, EventArgs e) 
{ 
  tChart1.Clear(); 
  tChart1.Import.Template.Load(@"c:\files\customLine.ten"); 
  label1.Text = ((MyLine)(tChart1[0])).MyStrProp; 
  label2.Text = ((MyLine)(tChart1[0])).MyIntProp.ToString(); 
}
Label1和Label2將顯示保存圖表之前設置的值。
使用自定義對象的元素創建自定義系列的步驟與具有已知類型元素的系列的步驟類似,以下是從Line Series派生的Series的示例,其中包括已知和未知類型的新元素(MyObj),由于TeeChart不知道如何序列化和反序列化未知類型,我們需要提供一種機制,您可以編寫例程來執行此操作并在序列化/反序列化時調用它。通過從Steema.TeeChart.Export.TemplateExport.ICustomSerialization接口繼承該類來提供該機制,這要求您向類添加2個方法:
using Steema.TeeChart.Export; 
 
// Custom Line class 
public class MyLine : Steema.TeeChart.Styles.Line, TemplateExport.ICustomSerialization 
{ 
  public MyLine(Chart c) : base(c) 
  { 
    myStrVar = "default"; 
  } 
 
  public MyLine() : this((Chart)null) { } 
 
  private string myStrVar = ""; 
  private int myIntVar = 0; 
  private MyObj myMyObj; 
 
  public string MyStrProp 
  { 
    get { return myStrVar; } 
    set { myStrVar = value; } 
  } 
 
  public int MyIntProp 
  { 
    get { return myIntVar; } 
    set { myIntVar = value; } 
  } 
 
  /// <summary> 
  /// Method to ease population of the myMyObj variable. 
  /// </summary> 
  public void setMyObj(int i, string s) 
  { 
    myMyObj = new MyObj(i, s); 
  } 
 
  /// <summary> 
  /// Property of Custom type, MyObj 
  /// </summary> 
  public MyObj MyObj 
  { 
    get { return myMyObj; } 
    set { myMyObj = value; } 
  } 
 
  /// <summary> 
  /// Obligatory method (TemplateExport.ICustomSerialization interface) 
  /// </summary> 
  public void Serialize(SerializationInfo info) 
  { 
    //save custom elements  
    info.AddValue("myObjStr", myMyObj.MyString, myMyObj.MyString.GetType()); 
    info.AddValue("myObjInt", myMyObj.MyInt); 
  } 
 
  /// <summary> 
  /// Obligatory method (TemplateExport.ICustomSerialization interface) 
  /// </summary> 
  public void DeSerialize(SerializationInfo info) 
  { 
    //recover custom elements into the myMyObj variable 
    myMyObj = new MyObj(info.GetInt32("myObjInt"), info.GetString("myObjStr")); 
  } 
} 
 
//custom object 
public class MyObj 
{ 
  private string myString; 
  private int myInt; 
 
  public MyObj(int i, string s) 
  { 
    myString = s; 
    myInt = i; 
  } 
 
  public int MyInt 
  { 
    get { return myInt; } 
    set { myInt = value; } 
  } 
 
  public string MyString 
  { 
    get { return myString; } 
    set { myString = value; } 
  } 
}
請注意,序列化使用'info.AddValue'來保存自定義元素的值,反序列化根據要保存的變量的類型使用“info.Getxxxx”。
一旦填充了自定義類中的例程以序列化和反序列化自定義元素,就可以像調用未修改的圖表一樣調用圖表保存和加載,如前所示,例如:保存帶有修改系列的圖表
private void button1_Click(object sender, EventArgs e) 
{ 
  MyLine mLine=new MyLine(); 
 
  mLine.MyStrProp = "now set"; 
  mLine.MyIntProp = 43; 
  mLine.setMyObj(43, "set val 43"); 
 
  tChart1.Series.Add(mLine); 
  mLine.FillSampleValues(); 
 
  tChart1.Export.Template.Save(@"c:\files\customLine.ten"); 
}
導入帶有修改系列的圖表
private void button2_Click(object sender, EventArgs e) 
{ 
  tChart1.Clear(); 
  tChart1.Import.Template.Load(@"c:\files\customLine.ten"); 
  label1.Text = ((MyLine)(tChart1[0])).MyStrProp; 
  label2.Text = ((MyLine)(tChart1[0])).MyIntProp.ToString(); 
  label3.Text = ((MyLine)(tChart1[0])).MyObj.MyInt.ToString(); 
  label4.Text = ((MyLine)(tChart1[0])).MyObj.MyString; 
}
Label1,Label2,Label3和Label4將顯示保存圖表之前設置的值。
序列化自定義圖表所需的步驟與應用于自定義系列的步驟略有不同,從Steema.TeeChart.Chart中導出自定義圖表,將其標記為Serializable并將其設置為ICustomSerialization類(請參閱下面的示例),已知類型將序列化,無需您執行上述系列示例中的任何必需步驟,對于未知類型的示例,我們將使用與Series示例MyObj中相同的對象。例如:包含已知和未知類型的自定義變量的示例圖表
[System.Serializable()] 
public class MyChart : Steema.TeeChart.Chart, TemplateExport.ICustomSerialization  
{ 
  private MyObj myMyObj; 
 
  public MyChart() : base() { } 
 
  //required constructor 
  protected MyChart(SerializationInfo info, StreamingContext context) : base(info, context) { } 
 
  private string myStrVar = ""; 
  private int myIntVar = 0; 
 
  public string MyStrProp 
  { 
    get { return myStrVar; } 
    set { myStrVar = value; } 
  } 
 
  public int MyIntProp 
  { 
    get { return myIntVar; } 
    set { myIntVar = value; } 
  } 
 
  public void setMyObj(int i, string s) 
  { 
    myMyObj = new MyObj(i, s); 
  } 
 
  public MyObj MyObj 
  { 
    get { return myMyObj; } 
    set { myMyObj = value; } 
  } 
 
  //required method 
  public void Serialize(SerializationInfo info) 
  { 
    object o = myMyObj.MyString; 
    info.AddValue("myObjStr", o, o.GetType()); 
    info.AddValue("myObjInt", myMyObj.MyInt); 
  } 
 
  //required method 
  public void DeSerialize(SerializationInfo info) 
  { 
    myMyObj = new MyObj(info.GetInt32("myObjInt"), info.GetString("myObjStr")); 
  } 
}
保存圖表時會自動處理序列化,例如:Serialise
private void button1_Click(object sender, EventArgs e) 
{ 
  MyChart myChart = new MyChart(); 
  myChart.Series.Add(new Steema.TeeChart.Styles.Bar()); 
  myChart[0].FillSampleValues(); 
  myChart.setMyObj(22, "set 22"); 
  myChart.MyStrProp = "set String Prop"; 
  myChart.Export.Template.IncludeData = true; 
  myChart.Export.Template.Save(@"c:\files\customChart.ten"); 
}
反序列化需要一個額外的步驟,TeeChart的反序列化器將MyChart類型綁定到序列化圖表,而不是圖表,因為它是默認類型,請注意設置活頁夾的行:
myChart.Import.Template.CustomType = myChart.ToString();
例如:DeSerialise
private void button2_Click(object sender, EventArgs e) 
{ 
  MyChart myChart = new MyChart(); 
  myChart.Import.Template.CustomType = myChart.ToString(); 
  myChart = (MyChart)(myChart.Import.Template.Load(@"c:\files\customChart.ten")); 
  myChart.Header.Text = myChart.MyObj.MyString; 
  myChart.Footer.Text = myChart.MyStrProp; 
  myChart.Footer.Visible = true; 
  myChart.Export.Template.Save(@"c:\files\testCustomChartmodded.ten"); 
  myChart.Export.Image.PNG.Save(@"c:\files\testCustomChart.png"); 
}
					本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn