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

打印编程

开发平台:

Others

  1. using System;
  2. using System.Drawing;
  3. using System.Collections;
  4. namespace GoldPrinter
  5. {
  6. /// <summary>
  7. /// 二维网格基类。
  8. /// 
  9. /// 作 者:长江支流(周方勇)
  10. /// Email:flygoldfish@163.com  QQ:150439795
  11. /// 网 址:www.webmis.com.cn
  12. /// ★★★★★您可以免费使用此程序,但是请您完整保留此说明,以维护知识产权★★★★★
  13. /// 
  14. /// </summary>
  15. public class GridBase:IGrid,IDisposable
  16. {
  17. //注意,带△的,一般改变后会联带其它数据的改变,因此特写出相应的过程 “ChangeField属性名()”
  18. //如行数、列数、行高、列宽的改变会引起相应的改变
  19. //用ArrayList便于插入行列,因为ArrayList有Insert()方法,直接用RowHeight/PreferredColWidth初始插入的行高或列宽
  20. protected ArrayList _arrRowsHeight; //行高数组,内部用,可用Set/GetRowHeight()设置或取指定行的行高
  21. protected ArrayList _arrColsWidth; //列宽数组,内部用,可用Set/GetColWidth()设置或取指定列的列宽
  22. protected ArrayList _arrColsAlign; //列对齐数组,内部用,可用Set/GetColAlign()设置或取指定列的列宽
  23. protected string[,] _arrStrGrid = new string[0,0]; //△网格数据(二维数组),属性改变会重新设置行与列数
  24. //我想到一个很好的方法,解决了行列的插入、增加,还能容纳单元格文本、行高、列宽等等,这样不用重新定义数组什么的,效率大大提高
  25. #region 想法
  26. //用DataTable,将所要保留的东东以二维表的形式保存,每一个字段是一个要记载的东东
  27. //protected System.Data.DataTable mdtGridAttributes = new System.Data.DataTable("GridAttributes"); //记录网格属性
  28. /*
  29.  * mdataTable.Rows.Count 为网格的行数
  30.  * mdataTable.Columns.Count 为网格的列数
  31.  * mdataTable.Rows.Add() 可以新增加一行
  32.  * mdataTable.Rows.InsertAt() 可以插入一行
  33. _____________________________________________________________________________________________
  34. | | 行高 |  |  ...
  35. ____|_______|_______|_______|________________________________________________________________
  36. | | 18 | |
  37. --》行指针__|_______|_______|_______|________________________________________________________________
  38.   | | ... | |  ...
  39. ____|_______|_______|_______|________________________________________________________________
  40. | | 18 | |
  41. ____|_______|_______|_______|________________________________________________________________
  42. 行 列 文本 图像 前景色 背景色 。。。
  43. 0 0 0*0 无 blank white
  44. 0 1 0*1 无 blank white
  45. ... ...
  46. 100 100 100*100 无 blank white
  47. */
  48. #endregion
  49. #region IGridBase 成员*********网格通用*********
  50. private Point _location = new Point(0,0); //网格起点坐标
  51. private int _Width = 300; //网格宽
  52. private int _Height = 200; //网格高
  53. private Font _font = new Font("宋体",10); //文本字体
  54. #region 网格起点及宽、高
  55. /// <summary>
  56. /// 网格起点坐标
  57. /// </summary>
  58. public Point Location
  59. {
  60. get
  61. return this._location;
  62. }
  63. set
  64. {
  65. this._location = value;
  66. }
  67. }
  68. /// <summary>
  69. /// 获取对象的宽
  70. /// </summary>
  71. public int Width
  72. {
  73. get
  74. {
  75. return this._Width;
  76. }
  77. set
  78. {
  79. this._Width = this.GetValidIntValue(value);
  80. }
  81. }
  82. /// <summary>
  83. /// 获取对象的高
  84. /// </summary>
  85. public int Height
  86. {
  87. get
  88. {
  89. return this._Height;
  90. }
  91. set
  92. {
  93. this._Height = this.GetValidIntValue(value);
  94. }
  95. }
  96. /// <summary>
  97. /// 网格文本字体,默认字体名为宋体大小为10。改变字体,只有在重绘时才起作用
  98. /// </summary>
  99. public Font Font
  100. {
  101. get
  102. {
  103. return this._font;
  104. }
  105. set
  106. {
  107. this._font = value;
  108. }
  109. }
  110. #endregion
  111. private AlignFlag _alignFlag = AlignFlag.Left; //△网格整体对齐方式,属性改变会改变列宽字符串列表
  112. private GridLineFlag _gridLineFlag = GridLineFlag.Both; //网格线类型
  113. private GridMergeFlag _gridMergeFlag = GridMergeFlag.None ; //单元格合并方式
  114. private GridBorderFlag _gridBorderFlag = GridBorderFlag.Single; //网格边框类型
  115. #region 字段属性AlignMentLineMergeBorder
  116. /// <summary>
  117. /// 网格整体对齐方式
  118. /// </summary>
  119. public AlignFlag AlignMent
  120. {
  121. get
  122. {
  123. return this._alignFlag;
  124. }
  125. set
  126. {
  127. this._alignFlag = value;
  128. ChangeFieldAlignMent();
  129. }
  130. }
  131. /// <summary>
  132. /// 网格线类型
  133. /// </summary>
  134. public GridLineFlag Line
  135. {
  136. get
  137. {
  138. return this._gridLineFlag;
  139. }
  140. set
  141. {
  142. this._gridLineFlag = value;
  143. }
  144. }
  145. /// <summary>
  146. /// 单元格合并方式
  147. /// </summary>
  148. public GridMergeFlag Merge
  149. {
  150. get
  151. {
  152. return this._gridMergeFlag;
  153. }
  154. set
  155. {
  156. this._gridMergeFlag = value;
  157. }
  158. }
  159. /// <summary>
  160. /// 网格边框类型
  161. /// </summary>
  162. public GridBorderFlag Border
  163. {
  164. get
  165. {
  166. return this._gridBorderFlag;
  167. }
  168. set
  169. {
  170. this._gridBorderFlag = value;
  171. }
  172. }
  173. #endregion
  174. private int _rows = 0; //△行数,属性改变会重定义数组,并且会重设置行高
  175. private int _cols = 0; //△列数,属性改变会重定义数组,并会重新设置列对齐列表
  176. private int _fixedRows = 0; //固定行数,打印时也重复打印,滚动滚动条时固定
  177. private int _fixedCols = 0; //固定列数,打印时也重复打印,滚动滚动条时固定
  178. private int _row = 0; //当前行,当前选定范围起始行
  179. private int _col = 0; //当前列,当前选定范围起始列
  180. private int _rowSel = 0; //当前选定范围结束行
  181. private int _colSel = 0; //当前选定范围结束列
  182. //获取有效的行列数、整数,这是对属性赋值时要调用的
  183. private int GetValidIntValue(int val)
  184. {
  185. int mval = val;
  186. if (mval < 0)
  187. {
  188. mval = 0;
  189. }
  190. if (mval > int.MaxValue)
  191. {
  192. mval = int.MaxValue;
  193. }
  194. return mval;
  195. }
  196. #region 字段属性RowsColsFixedRowsFixedColsRowColRowSelColSel(行列数、固定行列数、当前行列、选定行列数)
  197. /// <summary>
  198. /// 行数,注意改变行数会,会影响网格文本,并且会重设置行高
  199. /// </summary>
  200. public int Rows
  201. {
  202. get
  203. {
  204. return this._rows;
  205. }
  206. set
  207. {
  208. this._rows = GetValidIntValue(value);
  209. //改变了行字段
  210. this.ChangeFieldRows();
  211. }
  212. }
  213. /// <summary>
  214. /// 列数,注意改变列数,会影响网格文本
  215. /// </summary>
  216. public int Cols
  217. {
  218. get
  219. {
  220. return this._cols;
  221. }
  222. set
  223. {
  224. this._cols = GetValidIntValue(value);
  225. //改变了列字段
  226. this.ChangeFieldCols();
  227. }
  228. }
  229. /// <summary>
  230. /// 固定行数,打印时也重复打印,滚动滚动条时固定。最小为0,最大为行数。
  231. /// </summary>
  232. public int FixedRows
  233. {
  234. get
  235. {
  236. return this._fixedRows;
  237. }
  238. set
  239. {
  240. this._fixedRows = GetValidIntValue(value);
  241. if (this._fixedRows > this.Rows)
  242. {
  243. this._fixedRows = this.Rows;
  244. }
  245. }
  246. }
  247. /// <summary>
  248. /// 固定列数,打印时也重复打印,滚动滚动条时固定。最小为0,最大为列数。
  249. /// </summary>
  250. public int FixedCols
  251. {
  252. get
  253. {
  254. return this._fixedCols;
  255. }
  256. set
  257. {
  258. this._fixedCols = GetValidIntValue(value);
  259. if (this._fixedCols > this.Cols)
  260. {
  261. this._fixedCols = this.Cols;
  262. }
  263. }
  264. }
  265. /// <summary>
  266. /// 当前行,或当前选定范围起始行
  267. /// </summary>
  268. public int Row
  269. {
  270. get
  271. {
  272. return this._row;
  273. }
  274. set
  275. {
  276. this._row = GetValidIntValue(value);
  277. if (this._row >= this.Rows)
  278. {
  279. this._row = this.Rows - 1;
  280. }
  281. }
  282. }
  283. /// <summary>
  284. /// 当前列,或当前选定范围起始列
  285. /// </summary>
  286. public int Col
  287. {
  288. get
  289. {
  290. return this._col;
  291. }
  292. set
  293. {
  294. this._col = GetValidIntValue(value);
  295. if (this._col >= this.Cols)
  296. {
  297. this._col = this.Cols - 1;
  298. }
  299. }
  300. }
  301. /// <summary>
  302. /// 选定行,即当前选定范围结束行
  303. /// </summary>
  304. public int RowSel
  305. {
  306. get
  307. {
  308. return this._rowSel;
  309. }
  310. set
  311. {
  312. int mrow = GetValidIntValue(value);
  313. //选定行为0到最后一行
  314. if(mrow >= this._rows)
  315. {
  316. mrow = this._rows - 1;
  317. }
  318. this._rowSel = mrow;
  319. }
  320. }
  321. /// <summary>
  322. /// 选定列,即当前选定范围结束列
  323. /// </summary>
  324. public int ColSel
  325. {
  326. get
  327. {
  328. return this._colSel;
  329. }
  330. set
  331. {
  332. int mcol = GetValidIntValue(value);
  333. //选定列为0到最后一列
  334. if(mcol >= this._cols)
  335. {
  336. mcol = this._cols - 1;
  337. }
  338. this._rowSel = mcol;
  339. }
  340. }
  341. #endregion
  342. private int _rowheight = 20; //△行高,用于初始每行的行高。属性改变会使_arrRowsHeight重新设置
  343. private int _colWidth = 75; //△列宽,用于初始每列的列宽。属性改变会使_arrColsWidth重新设置,基本是5个汉字的宽
  344. #region (每)行高、列宽 及RowHeight、PreferredColWidth及返回对应的数组
  345. /// <summary>
  346. /// 获取或设置首选行高,以像素为单位
  347. /// </summary>
  348. public int PreferredRowHeight
  349. {
  350. get
  351. {
  352. return this._rowheight;
  353. }
  354. set
  355. {
  356. this._rowheight = GetValidIntValue(value);
  357. this.ChangeFieldPreferredRowHeight();
  358. }
  359. }
  360. /// <summary>
  361. /// 获取或设置默认的列宽,以像素为单位
  362. /// </summary>
  363. public int PreferredColWidth
  364. {
  365. get
  366. {
  367. return this._rowheight;
  368. }
  369. set
  370. {
  371. this._rowheight = GetValidIntValue(value);
  372. this.ChangeFieldPreferredColWidth();
  373. }
  374. }
  375. /// <summary>
  376. /// 获取指定行的行高
  377. /// </summary>
  378. /// <param name="index"></param>
  379. /// <returns></returns>
  380. public int get_RowHeight(int index)
  381. {
  382. return (int)(_arrRowsHeight[index]);
  383. }
  384. /// <summary>
  385. /// 设置指定行的行高
  386. /// </summary>
  387. /// <param name="index"></param>
  388. /// <param name="rowHeight"></param>
  389. public void set_RowHeight(int index,int rowHeight)
  390. {
  391. int mRowHeight = GetValidIntValue(rowHeight);
  392. _arrRowsHeight[index] = mRowHeight;
  393. }
  394. /// <summary>
  395. /// 获取指定列的列宽
  396. /// </summary>
  397. /// <param name="index"></param>
  398. /// <returns></returns>
  399. public int get_ColWidth(int index)
  400. {
  401. return (int)(_arrColsWidth[index]);
  402. }
  403. /// <summary>
  404. /// 设置指定列的列宽
  405. /// </summary>
  406. /// <param name="index"></param>
  407. /// <param name="colWidth"></param>
  408. /// <returns></returns>
  409. public void set_ColWidth(int index,int colWidth)
  410. {
  411. int mcolWidth = GetValidIntValue(colWidth);
  412. _arrColsWidth[index] = mcolWidth;
  413. }
  414. /// <summary>
  415. /// 设置水平列对齐方式
  416. /// </summary>
  417. /// <param name="index"></param>
  418. /// <returns></returns>
  419. public AlignFlag  get_ColAlignment(int index)
  420. {
  421. return (AlignFlag)(_arrColsAlign[index]);
  422. }
  423. /// <summary>
  424. /// 获取水平列对齐方式
  425. /// </summary>
  426. /// <param name="index"></param>
  427. /// <param name="colAlignment"></param>
  428. public void set_ColAlignment(int index, AlignFlag colAlignment)
  429. {
  430. _arrColsAlign[index] = colAlignment;
  431. }
  432. /// <summary>
  433. /// 获取或设置行高数组,设置值数组长度少于行数时只赋数组指定部分,其余的行高不变。
  434. /// </summary>
  435. /// <returns></returns>
  436. public int[] RowsHeight
  437. {
  438. get
  439. {
  440. //定义返回的列宽数组
  441. int[] arr = new int[this._rows];
  442. int c = 0;
  443. for(int i = 0 ; i < this._rows ; i++)
  444. {
  445. arr[i] = (int)(this._arrRowsHeight[i]);
  446. }
  447. return arr;
  448. }
  449. set
  450. {
  451. int c = 0;
  452. int[] arr = value;
  453. for(int i = 0 ; i < this._rows && i < arr.Length; i++)
  454. {
  455. this._arrRowsHeight[i] = arr[i];
  456. }
  457. }
  458. }
  459. /// <summary>
  460. /// 获取或设置列宽数组,设置值数组长度少于列数时只赋数组指定部分,其余的列宽不变。
  461. /// </summary>
  462. /// <returns></returns>
  463. public int[] ColsWidth
  464. {
  465. get
  466. {
  467. //定义返回的列宽数组
  468. int[] arr = new int[this._cols];
  469. int c = 0;
  470. for(int i = 0 ; i < this._cols ; i++)
  471. {
  472. arr[i] = (int)(this._arrColsWidth[i]);
  473. }
  474. return arr;
  475. }
  476. set
  477. {
  478. int c = 0;
  479. int[] arr = value;
  480. for(int i = 0 ; i < this._cols && i < arr.Length; i++)
  481. {
  482. this._arrColsWidth[i] = arr[i];
  483. }
  484. }
  485. }
  486. /// <summary>
  487. /// 返回列对齐数组
  488. /// </summary>
  489. /// <returns></returns>
  490. public AlignFlag[] ColsAlignment
  491. {
  492. get
  493. {
  494. //定义返回的列宽数组
  495. AlignFlag[] arr = new AlignFlag[this._cols];
  496. int c = 0;
  497. for(int i = 0 ; i < this._cols ; i++)
  498. {
  499. arr[i] = (AlignFlag)(this._arrColsAlign[i]);
  500. }
  501. return arr;
  502. }
  503. set
  504. {
  505. //定义返回的列宽数组
  506. AlignFlag[] arr = new AlignFlag[this._cols];
  507. int c = 0;
  508. for(int i = 0 ; i < this._cols && i < arr.Length; i++)
  509. {
  510. this._arrColsAlign[i] = arr[i];
  511. }
  512. }
  513. }
  514. #endregion
  515. #region 单元格文本
  516. /// <summary>
  517. /// 获取或设置当前单元格文本
  518. /// </summary>
  519. public string Text
  520. {
  521. get
  522. {
  523. return _arrStrGrid[this._row,this._col];
  524. }
  525. set
  526. {
  527. _arrStrGrid[this._row,this._col] = value;
  528. }
  529. }
  530. /// <summary>
  531. /// 获取指定行列单元格文本
  532. /// </summary>
  533. /// <param name="row"></param>
  534. /// <param name="col"></param>
  535. /// <returns></returns>
  536. public string get_TextMatrix(int row,int col)
  537. {
  538. return _arrStrGrid[row,col];
  539. }
  540. /// <summary>
  541. /// 设置指定单元格文本
  542. /// </summary>
  543. /// <param name="row"></param>
  544. /// <param name="col"></param>
  545. /// <param name="textMatrix"></param>
  546. /// <returns></returns>
  547. public void set_TextMatrix(int row,int col,string textMatrix)
  548. {
  549. _arrStrGrid[row,col] = textMatrix;
  550. }
  551. #endregion
  552. #endregion
  553. //Begin*****IGridBase支持函数*****
  554. #region 相应字段属性改变时,引发的过程调用
  555. //改变了行高字段,当RowHeight属性set时调用
  556. protected virtual void ChangeFieldPreferredRowHeight()
  557. {
  558. InitRowHeight();
  559. }
  560. //改变了行高字段,当PreferredColWidth属性set时调用
  561. protected virtual void ChangeFieldPreferredColWidth()
  562. {
  563. InitColWidth();
  564. }
  565. //改变了对齐方式字段,当AlignMent属性set时调用
  566. protected virtual void ChangeFieldAlignMent()
  567. {
  568. InitColAlignMent();
  569. }
  570. //改变了列字段,当Rows属性set时调用
  571. protected virtual void ChangeFieldRows()
  572. {
  573. ReDimArrString(ref _arrStrGrid,this._rows,this._cols);
  574. ResetRowHeight();
  575. }
  576. //改变了列字段,当Cols属性set时调用
  577. protected virtual void ChangeFieldCols()
  578. {
  579. ReDimArrString(ref _arrStrGrid,this._rows,this._cols);
  580. ResetColWidth();
  581. }
  582. #endregion
  583. #region 改变默认的行高、列宽、列对齐时调用 protected void InitRowHeight/InitColWidth()/InitColAlignMent()
  584. /// <summary>
  585. /// 初始设置行高
  586. /// </summary>
  587. protected void InitRowHeight()
  588. {
  589. this._arrRowsHeight = new ArrayList();
  590. for(int i = 0 ; i < this._rows ; i++)
  591. {
  592. this._arrRowsHeight.Add(this._rowheight);
  593. }
  594. }
  595. /// <summary>
  596. /// 初始设置列宽
  597. /// </summary>
  598. protected void InitColWidth()
  599. {
  600. this._arrColsWidth = new ArrayList();
  601. for(int i = 0 ; i < this._cols ; i++)
  602. {
  603. this._arrColsWidth.Add(this._colWidth);
  604. }
  605. }
  606. /// <summary>
  607. /// 初始设置列对齐
  608. /// </summary>
  609. protected void InitColAlignMent()
  610. {
  611. this._arrColsAlign = new ArrayList();
  612. for(int i = 0 ; i < this._cols ; i++)
  613. {
  614. this._arrColsAlign.Add(this._alignFlag);
  615. }
  616. }
  617. #endregion
  618. #region 改变行列数时被调用 protected void ResetRowHeight/ResetColWidth()
  619. /// <summary>
  620. /// 改变行列数时,重新设置行高
  621. /// </summary>
  622. protected void ResetRowHeight()
  623. {
  624. int c = 0;
  625. c = this._arrRowsHeight.Count - this._cols;
  626. //行变少,清除多余的
  627. if (c > 0)
  628. {
  629. c = System.Math.Abs(c);
  630. for(int i=0;i<c;i++)
  631. {
  632. this._arrRowsHeight.RemoveAt(this._arrRowsHeight.Count-1);
  633. }
  634. }
  635. else if (c < 0)
  636. {
  637. //行增加,用初始行高
  638. c = System.Math.Abs(c);
  639. for(int i=0;i<c;i++)
  640. {
  641. this._arrRowsHeight.Add(this._rowheight);
  642. }
  643. }
  644. }
  645. /// <summary>
  646. /// 改变行列数时,重新设置列宽
  647. /// </summary>
  648. protected void ResetColWidth()
  649. {
  650. int c = 0;
  651. c = this._arrColsWidth.Count - this._cols;
  652. //列变少,清除多余的
  653. if (c > 0)
  654. {
  655. c = System.Math.Abs(c);
  656. for(int i=0;i<c;i++)
  657. {
  658. this._arrColsWidth.RemoveAt(this._arrColsWidth.Count-1);
  659. }
  660. }
  661. else if (c < 0)
  662. {
  663. //列增加,用初始列宽
  664. c = System.Math.Abs(c);
  665. for(int i=0;i<c;i++)
  666. {
  667. this._arrColsWidth.Add(this._colWidth);
  668. }
  669. }
  670. }
  671. #endregion
  672. //End*****IGridBase支持函数*****
  673. #region IDisposable 成员
  674. /// <summary>
  675. /// 释放由此对象所用的所有资源
  676. /// </summary>
  677. public virtual void Dispose()
  678. {
  679. this.Font.Dispose();
  680. }
  681. #endregion
  682. #region 构造函数
  683. public GridBase():this(3,4)
  684. {
  685. }
  686. public GridBase(int rows,int cols)
  687. {  
  688. //行列改变要触发其它的改变
  689. this._rows = rows;
  690. this._cols = cols;
  691. Initialize(rows,cols);
  692. }
  693. #endregion
  694. /// <summary>
  695. /// 创建当前对象的浅表副本
  696. /// </summary>
  697. /// <returns></returns>
  698. public IGrid Clone()
  699. {
  700. return (IGrid)(base.MemberwiseClone());
  701. }
  702. /// <summary>
  703. /// 初始对象的行列数,注意带参构造函数自动调用此方法
  704. /// </summary>
  705. /// <param name="rows"></param>
  706. /// <param name="cols"></param>
  707. public void Initialize(int rows,int cols)
  708. {
  709. this._rows = rows;
  710. this._cols = cols;
  711. ReDimArrString(ref _arrStrGrid,rows,cols);
  712. InitRowHeight();
  713. InitColWidth();
  714. InitColAlignMent();
  715. }
  716. /// <summary>
  717. /// 返回对象所有列宽和
  718. /// </summary>
  719. public int GetAllColsWidthSum()
  720. {
  721. #region 实现...
  722. int mwidth = 0;
  723. for(int i = 0 ; i < this.Cols ; i++)
  724. {
  725. mwidth += (int)_arrColsWidth[i];
  726. }
  727. return mwidth;
  728. #endregion
  729. }
  730. /// <summary>
  731. /// 返回对象所有行高和
  732. /// </summary>
  733. public int GetAllRowsHeightSum()
  734. {
  735. #region 实现...
  736. int mheight = 0;
  737. for(int i = 0 ; i < this.Rows ; i++)
  738. {
  739. mheight += (int)_arrRowsHeight[i];
  740. }
  741. return mheight;
  742. #endregion
  743. }
  744. public string[,] GridText
  745. {
  746. get
  747. {
  748. return _arrStrGrid;
  749. }
  750. set
  751. {
  752. _arrStrGrid = value;
  753. //重新设置行列数
  754. this._rows = _arrStrGrid.GetLength(0);
  755. this._cols = _arrStrGrid.GetLength(1);
  756. InitRowHeight();
  757. InitColWidth();
  758. InitColAlignMent();
  759. }
  760. }
  761. /// <summary>
  762. /// 返回网格的平均列宽数组
  763. /// </summary>
  764. /// <param name="IsAverageWidth">是否平均网格的宽为列宽</param>
  765. /// <returns></returns>
  766. public int[] GetAverageColsWidth()
  767. {
  768. #region 实现...
  769. //定义返回的列宽数组
  770. int[] arrReturn = new int[this._cols];
  771. int c = 0;
  772. //平均列宽
  773. int avgWidth = this._Width / this._cols;
  774. for(int i = 0 ; i < this._cols - 1 ; i++)
  775. {
  776. arrReturn[i] = avgWidth;
  777. c++;
  778. }
  779. //最后一列为剩下的值,这样做是为了平均时产生的小数和与总宽不相等
  780. arrReturn[arrReturn.Length - 1] = this._Width - avgWidth * c;
  781. return arrReturn;
  782. #endregion
  783. }
  784. //支持函数
  785. #region 重定义二维字符数组并保留原有数据 protected void ReDimArrString(string[,] arrStr,int rows,int cols)
  786. /// <summary>
  787. /// 用指定的行列重定义二维字符数组,数组将保留交集范围内的原有数据,扩充的用空串""填充
  788. /// </summary>
  789. /// <param name="arrStr">原二维字符数组</param>
  790. /// <param name="rows">新行数</param>
  791. /// <param name="cols">新列数</param>
  792. protected void ReDimArrString(ref string[,] arrStr,int rows,int cols)
  793. {
  794. if(arrStr == null || arrStr.Length == 0)
  795. {
  796. arrStr = new string[rows,cols];
  797. //用""填充
  798. for(int i = 0 ; i < rows ; i++)
  799. {
  800. for(int j = 0 ; j < cols ; j++)
  801. {
  802. arrStr[i,j] = "";  
  803. }  
  804. }
  805. }
  806. else
  807. {
  808. string[,] arr = new string[rows,cols];
  809. int mOriginalRows = arrStr.GetLength(0); //原有的行数
  810. int mOriginalCols = arrStr.GetLength(1); //原有的列数
  811. int mBackRows = 0; //需要备份原有数据的行列数,以便用原有数据初始
  812. int mBackcols = 0;
  813. //排列组合...
  814. #region 增加了行数,列可能变大也可能变小
  815. if(rows >= mOriginalRows)
  816. {
  817. //列变大
  818. if(cols >= mOriginalCols)
  819. { //完全在原有网格范围内或完全包含原有网格,用原有数据初始
  820. mBackRows = mOriginalRows;
  821. mBackcols = mOriginalCols;
  822. //扩大的列用""初始
  823. for(int i = 0 ; i < mOriginalRows ; i++)
  824. {
  825. for(int j = 0 ; j < cols ; j++)
  826. {
  827. arr[i,j] = "";  
  828. }  
  829. }
  830. //扩大的行用""初始
  831. for(int i = mOriginalRows ; i < rows ; i++)
  832. {
  833. for(int j = 0 ; j < cols ; j++)
  834. {
  835. arr[i,j] = "";  
  836. }  
  837. }
  838. }
  839. //列变小
  840. if(cols <= mOriginalCols)
  841. {
  842. mBackRows = mOriginalRows;
  843. mBackcols = cols;
  844. //行扩的用""初始
  845. for(int i = mOriginalRows ; i < rows ; i++)
  846. {
  847. for(int j = 0 ; j < mOriginalCols ; j++)
  848. {
  849. arr[i,j] = "";  
  850. }  
  851. }
  852. }
  853. }
  854. #endregion
  855. #region 减少了行数,列可能变大也可能变小
  856. if(rows <= mOriginalRows)
  857. {
  858. //列变大
  859. if(cols >= mOriginalCols)
  860. {
  861. mBackRows = rows;
  862. mBackcols = mOriginalCols;
  863. //行在原有范围内,但列扩大了,把扩大的用""初始
  864. for(int i = 0 ; i < mOriginalRows ; i++)
  865. {
  866. for(int j = mOriginalCols ; j < cols ; j++)
  867. {
  868. arr[i,j] = "";  
  869. }  
  870. }
  871. }
  872. //列变小
  873. if(cols <= mOriginalCols)
  874. { //完全在原有网格范围内或完全包含原有网格,用原有数据初始
  875. mBackRows = rows;
  876. mBackcols = cols;
  877. }
  878. }
  879. #endregion
  880. //用原有数据填充
  881. for(int i = 0 ; i < mBackRows ; i++)
  882. {
  883. for(int j = 0 ; j < mBackcols ; j++)
  884. {
  885. arr[i,j] = arrStr[i,j];  
  886. }  
  887. }
  888. arrStr = arr;
  889. }
  890. }
  891. #endregion
  892.   
  893. }//End Class
  894. }//End Namespace