GoldGrid.cs
上传用户:jx_fiona
上传日期:2014-03-08
资源大小:1387k
文件大小:11k
源码类别:

打印编程

开发平台:

Others

  1. using System;
  2. using System.Drawing;
  3. using System.Collections;
  4. namespace GoldPrinter
  5. {
  6. /// <summary>
  7. /// GoldGrid 的摘要说明。
  8. /// 
  9. /// 作 者:长江支流(周方勇)
  10. /// Email:flygoldfish@163.com  QQ:150439795
  11. /// 网 址:www.webmis.com.cn
  12. /// ★★★★★您可以免费使用此程序,但是请您完整保留此说明,以维护知识产权★★★★★
  13. /// 
  14. /// </summary>
  15. public class GoldGrid:GridBase
  16. {
  17. public GoldGrid()
  18. {
  19. //
  20. // TODO: 在此处添加构造函数逻辑
  21. //
  22. }
  23. #region _arrStrGrid相关的属性与方法 GridText获取设置_arrStrGrid、SetText(int row,int col,string text)、GetText(int row,int col)获取单元格文本
  24. /// <summary>
  25. /// 设置指定单元格文本
  26. /// </summary>
  27. /// <param name="row"></param>
  28. /// <param name="col"></param>
  29. /// <param name="text"></param>
  30. public void SetText(int row,int col,string text)
  31. {
  32. _arrStrGrid[row,col] = text;
  33. }
  34. public void SetText(string text)
  35. {
  36. _arrStrGrid[RowSel,ColSel] = text;
  37. }
  38. /// <summary>
  39. /// 获取指定单元格文本
  40. /// </summary>
  41. /// <param name="row"></param>
  42. /// <param name="col"></param>
  43. /// <returns></returns>
  44. public string GetText(int row,int col)
  45. {
  46. return _arrStrGrid[row,col];
  47. }
  48. public string GetText()
  49. {
  50. return _arrStrGrid[RowSel,ColSel];
  51. }
  52. #endregion
  53. private string _colsAlignList = ""; //列对齐列表,由Left,Center,Right第一个字母组成的串的对齐方式的串
  54. /// <summary>
  55. /// 获取或设置列对齐列表对象,由Left,Center,Right第一个字母组成的串的对齐方式的串
  56. /// </summary>
  57. public string ColsAlignString
  58. {
  59. get
  60. {
  61. return this._colsAlignList;
  62. }
  63. set
  64. {
  65. if (value != null)
  66. {
  67. this._colsAlignList = value;
  68. }
  69. }
  70. }
  71. //重要属性
  72. private object _DataSource = null; //△会改变行列及其它属性
  73. #region DataSource
  74. /// <summary>
  75. /// 或取或设置数据源,可以是任意的二维数组型的,如二维数组、网格等
  76. /// </summary>
  77. public object DataSource
  78. {
  79. get
  80. {
  81. return this._DataSource;
  82. }
  83. set
  84. {
  85. if (value != null)
  86. {
  87. _DataSource = value;
  88. //将数据转换成二维数组
  89. switch(value.GetType().ToString())
  90. {
  91. case "System.String": //字符串
  92. //...
  93. break;
  94. case "System.String[]": //一维数组
  95. string[] arr1 = (System.String[])_DataSource;
  96. string[,] arr2 = new string[1,arr1.Length];
  97. for(int i = 0 ; i < arr1.Length ; i++)
  98. {
  99. arr2[0,i] = arr1[i];
  100. }
  101. this.DataSource = arr2;
  102. break;
  103. case "System.String[,]": //二维数组
  104. this.GridText = (System.String[,])_DataSource;
  105. break;
  106. case "System.Data.DataTable": //数据表格
  107. this.GridText = ToArrFromDataTable((System.Data.DataTable)_DataSource);
  108. break;
  109. case "System.Windows.Forms.DataGrid":
  110. this.GridText = ToArrFromDataGrid((System.Windows.Forms.DataGrid)_DataSource);
  111. break;
  112. case "System.Web.UI.WebControls.DataGrid":
  113. this.GridText = ToArrFromDataGrid((System.Web.UI.WebControls.DataGrid)_DataSource);
  114. break;
  115. case "System.Web.UI.HtmlControls.HtmlTable":
  116. this.GridText = ToArrFromHtmlTable((System.Web.UI.HtmlControls.HtmlTable)_DataSource);
  117. break;
  118. //...太多了,不够的自己加,只要能转换成二维数组
  119. // case "MSHFlexGrid的类型,自己转吧";
  120. // this.GridText = ToArrFromMSHFlexGrid((MSHFlexGrid的类型,自己转吧)_DataSource);
  121. // break;
  122. }
  123. }
  124. }
  125. }
  126. #endregion
  127. public void SetTextOnRowSel(int rowSel, int startCol,int endCol, string text)
  128. {
  129. for(int i = startCol ; i <= endCol ; i++)
  130. {
  131. SetText(rowSel, i, text);
  132. }
  133. }
  134. public void SetTextOnColSel(int colSel, int startRow,int endRow, string text)
  135. {
  136. for(int i = startRow ; i <= endRow ; i++)
  137. {
  138. SetText(i,colSel, text);
  139. }
  140. }
  141. /// <summary>
  142. /// 查找当前单元格左顶宽高
  143. /// </summary>
  144. /// <returns></returns>
  145. public CellRectangle GetMergeCell()
  146. {
  147. return GetMergeCell(this.Location,_arrStrGrid,this.PreferredRowHeight,this.ColsWidth,RowSel,ColSel);
  148. }
  149. /// <summary>
  150. /// 初始列对齐字符串,在设置AlignMent、Cols时调用
  151. /// </summary>
  152. private void InitColsAlignString()
  153. {
  154. string malignString = "";
  155. string malignChar = "";
  156. switch(this.AlignMent)
  157. {
  158. case AlignFlag.Left:
  159. malignChar = "L";
  160. break;
  161. case AlignFlag.Center:
  162. malignChar = "C";
  163. break;
  164. case AlignFlag.Right:
  165. malignChar = "R";
  166. break;
  167. }
  168. for(int i = _colsAlignList.Length ; i < this.Cols ; i++)
  169. {
  170. malignString += malignChar;
  171. }
  172. this._colsAlignList = malignString;
  173. if (_colsAlignList.Length > Cols)
  174. {
  175. _colsAlignList.Substring(0,Cols);
  176. }
  177. }
  178. #region 所有要用到的二维表格的东东都放到这里吧,不过,最好独立于一个类中
  179. public string[,] ToArrFromDataTable(System.Data.DataTable source)
  180. {
  181. if (source == null)
  182. {
  183. return new string[0,0];
  184. }
  185. int mRows,mCols;
  186. string[,] arrGridText;
  187. mRows = source.Rows.Count;
  188. mCols = source.Columns.Count;
  189. arrGridText = new string[mRows,mCols];
  190. for(int i = 0 ; i < mRows ; i++)
  191. {
  192. for(int j = 0 ; j < mCols ; j++)
  193. {
  194. arrGridText[i,j] = source.Rows[i][j].ToString();
  195. }
  196. }
  197. return arrGridText;
  198. }
  199. public string[,] ToArrFromDataGrid(System.Windows.Forms.DataGrid source)
  200. {
  201. if (source == null)
  202. {
  203. return new string[0,0];
  204. }
  205. int mRows = 0;
  206. int mCols = 0;
  207. string[,] arrGridText;
  208. //TimeDef.Start(); //用捕获错误的方法第一次耗时太大,50行6列的基本上用了4秒多,而第二次只用20.0288毫秒
  209. //用时:4.656696秒
  210. //用时:4656.696毫秒
  211. //可能原因是第一次要加载mscorlib.resources.dll
  212. try
  213. {
  214. string s = "";
  215. for(int i = 0 ; i < int.MaxValue - 1 ; i ++)
  216. {
  217. s = source[0,i].ToString();
  218. mCols++;
  219. }
  220. }
  221. catch(Exception e){}
  222. try
  223. {
  224. string s = "";
  225. for(int i = 0 ; i < int.MaxValue - 1 ; i ++)
  226. {
  227. s = source[i,0].ToString();
  228. mRows++;
  229. }
  230. }
  231. catch(Exception e){}
  232. //TimeDef.End();
  233. arrGridText = new string[mRows,mCols];
  234. try
  235. {
  236. for(int i = 0 ; i < mRows ; i++)
  237. {
  238. for(int j = 0 ; j < mCols ; j++)
  239. {
  240. arrGridText[i,j] = source[i,j].ToString();
  241. }
  242. }
  243. }
  244. catch(Exception e)
  245. {}
  246. return arrGridText;
  247. }
  248. public string[,] ToArrFromDataGrid(System.Web.UI.WebControls.DataGrid source)
  249. {
  250. if (source == null)
  251. {
  252. return new string[0,0];
  253. }
  254. int mRows = 0;
  255. int mCols = 0;
  256. string[,] arrGridText;
  257. mRows = source.Items.Count;
  258. mCols = source.Columns.Count;
  259. arrGridText = new string[mRows,mCols];
  260. for(int i = 0 ; i < mRows ; i++)
  261. {
  262. for(int j = 0 ; j < mCols ; j++)
  263. {
  264. arrGridText[i,j] = source.Items[i].Cells[j].Text;
  265. }
  266. }
  267. return arrGridText;
  268. }
  269. public string[,] ToArrFromHtmlTable(System.Web.UI.HtmlControls.HtmlTable source)
  270. {
  271. if (source == null)
  272. {
  273. return new string[0,0];
  274. }
  275. int mRows = source.Rows.Count;
  276. int mCols = source.Rows[0].Cells.Count;
  277. string[,] arrGridText = new string[mRows,mCols];
  278. for(int i = 0 ; i < mRows ; i++)
  279. {
  280. for(int j = 0 ; j < mCols ; j++)
  281. {
  282. arrGridText[i,j] = source.Rows[i].Cells[j].InnerText;
  283. }
  284. }
  285. return arrGridText;
  286. }
  287. #endregion
  288. #region protected virtual GetAlignFlag[] GetColsAlign(string alignment)
  289. /// <summary>
  290. /// 返回由Left,Center,Right第一个字母组成的串的对齐方式的数组
  291. /// </summary>
  292. /// <param name="Alignment">由Left,Center,Right第一个字母组成的串</param>
  293. /// <returns></returns>
  294. protected virtual AlignFlag[] GetColsAlign(string alignment)
  295. {
  296. if (alignment == null || alignment.Length == 0)
  297. {
  298. return (new AlignFlag[0]); 
  299. }
  300. int len = alignment.Length;
  301. AlignFlag[] arrAlign = new AlignFlag[len];
  302. string strAlign = "";
  303. for(int i = 0 ; i < len ; i++)
  304. {
  305. strAlign = alignment.Substring(i,1).ToUpper();
  306. switch(strAlign)
  307. {
  308. // case "L":
  309. // break;
  310. case "C":
  311. arrAlign[i] = AlignFlag.Center;
  312. break;
  313. case "R":
  314. arrAlign[i] = AlignFlag.Right;
  315. break;
  316. default:
  317. arrAlign[i] = AlignFlag.Left;
  318. break;
  319. }
  320. }
  321. return arrAlign;
  322. }
  323. #endregion
  324. #region protected virtual Cell GetMergeCell(Point GridLocation,string[,] arrStrGrid,int rowHeight,int[] ArrColWidth,int rowSel,int colSel)
  325. /// <summary>
  326. /// 任意合并方式下返回指定单元格左顶宽高
  327. /// </summary>
  328. /// <param name="GridLocation">网格起点坐标</param>
  329. /// <param name="arrStrGrid">二维网格</param>
  330. /// <param name="rowHeight">行高</param>
  331. /// <param name="ArrColWidth">列宽数组</param>
  332. /// <param name="rowSel">指定单元格行</param>
  333. /// <param name="colSel">指定单元格列</param>
  334. /// <returns></returns>
  335. protected virtual CellRectangle GetMergeCell(Point GridLocation,string[,] arrStrGrid,int rowHeight,int[] ArrColWidth,int rowSel,int colSel)
  336. {
  337. CellRectangle cell = new CellRectangle(0,0,0,0);
  338. int lngRows = arrStrGrid.GetLength(0); //行数
  339. int lngCols = arrStrGrid.GetLength(1); //列数
  340. int lngMergeRows = 1; //合并的行数
  341. int lngMergeCols = 1; //合并的列数
  342. int lngStartRow = rowSel; //记录与此单元格合并的起始行
  343. int lngEndRow = rowSel; //以便计算高及起点Y坐标
  344. int lngStartCol = colSel; //记录与此单元格合并的起始列
  345. int lngEndCol = colSel; //以便计算宽及起点X坐标
  346. //计算在"列"上进行行合并时起始行与合并的多少
  347. //往上查合并(列不变)
  348. for(int rowIndex = rowSel-1 ; rowIndex >= 0 ; rowIndex--)
  349. {
  350. if(arrStrGrid[rowSel,colSel] == arrStrGrid[rowIndex,colSel])
  351. {
  352. lngMergeRows++;
  353. lngStartRow--;
  354. }
  355. else
  356. {
  357. break;
  358. }
  359. }
  360. //往下查合并(列不变)
  361. for(int rowIndex = rowSel+1 ; rowIndex < lngRows ; rowIndex++)
  362. {
  363. if(arrStrGrid[rowSel,colSel] == arrStrGrid[rowIndex,colSel])
  364. {
  365. lngMergeRows++;
  366. lngEndRow++;
  367. }
  368. else
  369. {
  370. break;
  371. }
  372. }
  373. //计算在"行"上进行列合并时起始列与合并的多少
  374. //往左查合并(行不变)
  375. for(int colIndex = colSel-1 ; colIndex >= 0 ; colIndex--)
  376. {
  377. if(arrStrGrid[rowSel,colSel] == arrStrGrid[rowSel,colIndex])
  378. {
  379. lngMergeCols++;
  380. lngStartCol--;
  381. }
  382. else
  383. {
  384. break;
  385. }
  386. }
  387. //往右查合并(行不变)
  388. for(int colIndex = colSel+1 ; colIndex < lngCols ; colIndex++)
  389. {
  390. if(arrStrGrid[rowSel,colSel] == arrStrGrid[rowSel,colIndex])
  391. {
  392. lngMergeCols++;
  393. lngEndCol++;
  394. }
  395. else
  396. {
  397. break;
  398. }
  399. }
  400. //******************计算左顶宽高******************
  401. int cellLeft = GridLocation.X;
  402. int cellTop = GridLocation.Y + lngStartRow * rowHeight; //若行高不是固定行高,可以计算之前行的行高总和
  403. int cellWidth = 0;
  404. int cellHeight = 0;
  405. //单元格合并列的前边的单元格列宽和
  406. for(int i = lngStartCol-1 ; i >= 0 ; i--)
  407. {
  408. cellLeft += ArrColWidth[i];
  409. }
  410. //单元格合并列列宽和
  411. for(int i = lngStartCol ; i <= lngEndCol ; i++)
  412. {
  413. cellWidth += ArrColWidth[i];
  414. }
  415. cellHeight = lngMergeRows * rowHeight; //若行高不是固定行高,可以计算所有行的行高总和
  416. cell = new CellRectangle(cellLeft,cellTop,cellWidth,cellHeight);
  417. return cell;
  418. }
  419. #endregion
  420. }//End Class
  421. }//End Namespace