DataTableConverter.cs
上传用户:szgaoree
上传日期:2009-01-05
资源大小:74k
文件大小:4k
源码类别:

Ajax

开发平台:

C#

  1. using System;
  2. using System.Text;
  3. using System.Data;
  4. namespace AjaxPro
  5. {
  6. /// <summary>
  7. /// Provides methods to serialize and deserialize a DataTable object.
  8. /// </summary>
  9. public class DataTableConverter : IJavaScriptConverter
  10. {
  11. private string clientType = "Ajax.Web.DataTable";
  12. public DataTableConverter() : base()
  13. {
  14. }
  15. public override string GetClientScript()
  16. {
  17. return @"addNamespace(""Ajax.Web"");
  18. Ajax.Web.DataTable = function(columns, rows) {
  19. this.__type = ""System.Data.DataTable, System.Data"";
  20. this.Columns = new Array();
  21. this.Rows = new Array();
  22. this.addColumn = function(name, type) {
  23. var c = new Object();
  24. c.Name = name;
  25. c.__type = type;
  26. this.Columns.push(c);
  27. }
  28. this.toJSON = function() {
  29. var dt = new Object();
  30. dt.Columns = [];
  31. for(var i=0; i<this.Columns.length; i++)
  32. dt.Columns.push([this.Columns[i].Name, this.Columns[i].__type]);
  33. dt.Rows = [];
  34. for(var i=0; i<this.Rows.length; i++) {
  35. var row = [];
  36. for(var j=0; j<this.Columns.length; j++)
  37. row.push(this.Rows[i][this.Columns[j].Name]);
  38. dt.Rows.push(row);
  39. }
  40. return AjaxPro.toJSON(dt);
  41. }
  42. this.addRow = function(row) {
  43. this.Rows.push(row);
  44. }
  45. if(columns != null) {
  46. for(var i=0; i<columns.length; i++) {
  47. this.addColumn(columns[i][0], columns[i][1]);
  48. }
  49. }
  50. if(rows != null) {
  51. for(var i=0; i<rows.length; i++) {
  52. var row = new Object();
  53. for(var c=0; c<this.Columns.length && c<rows[i].length; c++) {
  54. row[this.Columns[c].Name] = rows[i][c];
  55. }
  56. this.addRow(row);
  57. }
  58. }
  59. }
  60. ";
  61. }
  62. public override object Deserialize(IJavaScriptObject o, Type t)
  63. {
  64. if(!(o is JavaScriptObject))
  65. throw new NotSupportedException();
  66. JavaScriptObject ht = (JavaScriptObject)o;
  67. if(!ht.Contains("Columns") || !(ht["Columns"] is JavaScriptArray) ||
  68. !ht.Contains("Rows") || !(ht["Rows"] is JavaScriptArray))
  69. {
  70. throw new NotSupportedException();
  71. }
  72. JavaScriptArray columns = (JavaScriptArray)ht["Columns"];
  73. JavaScriptArray rows = (JavaScriptArray)ht["Rows"];
  74. DataTable dt = new DataTable();
  75. DataRow row = null;
  76. Type colType;
  77. if(ht.Contains("TableName") && ht["TableName"] is JavaScriptString)
  78. dt.TableName = ht["TableName"].ToString();
  79. foreach(JavaScriptArray column in columns)
  80. {
  81. colType = Type.GetType(column[1].ToString(), true);
  82. dt.Columns.Add(column[0].ToString(), colType);
  83. }
  84. JavaScriptArray cols = null;
  85. foreach(JavaScriptArray r in rows)
  86. {
  87. // if(!(r is JavaScriptArray))
  88. // continue;
  89. cols = (JavaScriptArray)r;
  90. row = dt.NewRow();
  91. for(int i=0; i<cols.Count; i++)
  92. row[i] = JavaScriptDeserializer.Deserialize((IJavaScriptObject)cols[i], dt.Columns[i].DataType);
  93. dt.Rows.Add(row);
  94. }
  95. return dt;
  96. }
  97. public override string Serialize(object o)
  98. {
  99. if(!(o is DataTable))
  100. throw new NotSupportedException();
  101. StringBuilder sb = new StringBuilder();
  102. DataTable dt = (DataTable)o;
  103. DataColumnCollection cols = dt.Columns;
  104. DataRowCollection rows = dt.Rows;
  105. bool b = true;
  106. sb.Append("new ");
  107. sb.Append(clientType);
  108. sb.Append("([");
  109. foreach(DataColumn col in cols)
  110. {
  111. if(b){ b = false; }
  112. else{ sb.Append(","); }
  113. sb.Append('[');
  114. sb.Append(JavaScriptSerializer.Serialize(col.ColumnName));
  115. sb.Append(',');
  116. sb.Append(JavaScriptSerializer.Serialize(col.DataType.FullName));
  117. sb.Append(']');
  118. }
  119. sb.Append("],[");
  120. b = true;
  121. foreach(DataRow row in rows)
  122. {
  123. if(b){ b = false; }
  124. else{ sb.Append(","); }
  125. sb.Append(JavaScriptSerializer.Serialize(row));
  126. }
  127. sb.Append("])");
  128. return sb.ToString();
  129. }
  130. public override Type[] SerializableTypes
  131. {
  132. get
  133. {
  134. return new Type[]{typeof(DataTable)};
  135. }
  136. }
  137. public override Type[] DeserializableTypes
  138. {
  139. get
  140. {
  141. return new Type[]{typeof(DataTable)};
  142. }
  143. }
  144. }
  145. }