CrossViewData.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. using System;
  2. using System.Collections;
  3. using FastReport.Data;
  4. namespace FastReport.CrossView
  5. {
  6. /// <summary>
  7. /// Contains a set of properties and methods to hold and manipulate the CrossView descriptors.
  8. /// </summary>
  9. /// <remarks>
  10. /// This class contains three collections of descriptors such as <see cref="Columns"/>,
  11. /// <see cref="Rows"/> and <see cref="Cells"/>. Descriptors are filled from FastCube Slice.
  12. /// </remarks>
  13. public class CrossViewData
  14. {
  15. #region Fields
  16. private CrossViewHeader columns;
  17. private CrossViewHeader rows;
  18. private CrossViewCells cells;
  19. internal int[] columnDescriptorsIndexes;
  20. internal int[] rowDescriptorsIndexes;
  21. internal int[] columnTerminalIndexes;
  22. internal int[] rowTerminalIndexes;
  23. #endregion
  24. #region FastCube properties (temporary)
  25. private CubeSourceBase cubeSource;
  26. /// <summary>
  27. ///
  28. /// </summary>
  29. public int XAxisFieldsCount { get { return cubeSource != null ? cubeSource.XAxisFieldsCount : 0; } }
  30. /// <summary>
  31. ///
  32. /// </summary>
  33. public int YAxisFieldsCount { get { return cubeSource != null ? cubeSource.YAxisFieldsCount : 0; } }
  34. /// <summary>
  35. ///
  36. /// </summary>
  37. public int MeasuresCount { get { return cubeSource != null ? cubeSource.MeasuresCount : 0; } }
  38. /// <summary>
  39. ///
  40. /// </summary>
  41. public int MeasuresLevel { get { return cubeSource != null ? cubeSource.MeasuresLevel : 0; } }
  42. /// <summary>
  43. ///
  44. /// </summary>
  45. public bool MeasuresInXAxis { get { return cubeSource != null ? cubeSource.MeasuresInXAxis : false; } }
  46. /// <summary>
  47. ///
  48. /// </summary>
  49. public bool MeasuresInYAxis { get { return cubeSource != null ? cubeSource.MeasuresInYAxis : false; } }
  50. /// <summary>
  51. ///
  52. /// </summary>
  53. public int DataColumnCount { get { return cubeSource != null ? cubeSource.DataColumnCount : 0; } }
  54. /// <summary>
  55. ///
  56. /// </summary>
  57. public int DataRowCount { get { return cubeSource != null ? cubeSource.DataRowCount : 0; } }
  58. /// <summary>
  59. ///
  60. /// </summary>
  61. public bool SourceAssigned { get { return cubeSource != null; } }
  62. #if !DOTNET_4
  63. private string intArrayToString(int[] intArray)
  64. {
  65. string res = "";
  66. foreach (int item in intArray)
  67. {
  68. if (res != "")
  69. res += ",";
  70. res += item.ToString();
  71. }
  72. return res;
  73. }
  74. private int[] stringToIntArray(string str)
  75. {
  76. string[] strArray = str.Split(',');
  77. int[] res = new int[strArray.Length];
  78. for (int i = 0; i < strArray.Length; i++)
  79. {
  80. res[i] = int.Parse(strArray[i]);
  81. }
  82. return res;
  83. }
  84. #endif
  85. /// <summary>
  86. ///
  87. /// </summary>
  88. public string ColumnDescriptorsIndexes
  89. {
  90. #if DOTNET_4
  91. get { return string.Join(",", columnDescriptorsIndexes); }
  92. set { columnDescriptorsIndexes = Array.ConvertAll(value.Split(','), int.Parse); }
  93. #else
  94. get { return intArrayToString(columnDescriptorsIndexes); }
  95. set { columnDescriptorsIndexes = stringToIntArray(value); }
  96. #endif
  97. }
  98. /// <summary>
  99. ///
  100. /// </summary>
  101. public string RowDescriptorsIndexes
  102. {
  103. #if DOTNET_4
  104. get { return string.Join(",", rowDescriptorsIndexes); }
  105. set { rowDescriptorsIndexes = Array.ConvertAll(value.Split(','), int.Parse); }
  106. #else
  107. get { return intArrayToString(rowDescriptorsIndexes); }
  108. set { rowDescriptorsIndexes = stringToIntArray(value); }
  109. #endif
  110. }
  111. /// <summary>
  112. ///
  113. /// </summary>
  114. public string ColumnTerminalIndexes
  115. {
  116. #if DOTNET_4
  117. get { return string.Join(",", columnTerminalIndexes); }
  118. set { columnTerminalIndexes = Array.ConvertAll(value.Split(','), int.Parse); }
  119. #else
  120. get { return intArrayToString(columnTerminalIndexes); }
  121. set { columnTerminalIndexes = stringToIntArray(value); }
  122. #endif
  123. }
  124. /// <summary>
  125. ///
  126. /// </summary>
  127. public string RowTerminalIndexes
  128. {
  129. #if DOTNET_4
  130. get { return string.Join(",", rowTerminalIndexes); }
  131. set { rowTerminalIndexes = Array.ConvertAll(value.Split(','), int.Parse); }
  132. #else
  133. get { return intArrayToString(rowTerminalIndexes); }
  134. set { rowTerminalIndexes = stringToIntArray(value); }
  135. #endif
  136. }
  137. internal CubeSourceBase CubeSource
  138. {
  139. get { return cubeSource; }
  140. set
  141. {
  142. if (cubeSource != value)
  143. {
  144. cubeSource = value;
  145. }
  146. }
  147. }
  148. internal void CreateDescriptors()
  149. {
  150. columnDescriptorsIndexes = new int[0];
  151. rowDescriptorsIndexes = new int[0];
  152. columnTerminalIndexes = new int[0];
  153. rowTerminalIndexes = new int[0];
  154. CrossViewHeaderDescriptor crossViewHeaderDescriptor;
  155. Columns.Clear();
  156. Rows.Clear();
  157. Cells.Clear();
  158. if (!SourceAssigned)
  159. return;
  160. int cell = 0;
  161. for (int i = 0; i < XAxisFieldsCount; i++)
  162. {
  163. cell = 0;
  164. if (MeasuresInXAxis && (MeasuresLevel <= i))
  165. {
  166. if (MeasuresLevel == i)
  167. {
  168. for (int k = 0; k <= i; k++)
  169. {
  170. for (int j = 0; j < MeasuresCount; j++)
  171. {
  172. if (k == i)
  173. {
  174. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor("", CubeSource.GetMeasureName(j), false, false, true);
  175. crossViewHeaderDescriptor.cellsize = 1;
  176. crossViewHeaderDescriptor.levelsize = XAxisFieldsCount - i;
  177. }
  178. else
  179. {
  180. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor(CubeSource.GetXAxisFieldName(k), CubeSource.GetMeasureName(j), false, false, true);
  181. crossViewHeaderDescriptor.cellsize = (XAxisFieldsCount - i);
  182. crossViewHeaderDescriptor.levelsize = 1;
  183. }
  184. crossViewHeaderDescriptor.level = i;
  185. crossViewHeaderDescriptor.cell = cell;
  186. cell += crossViewHeaderDescriptor.cellsize;
  187. Columns.Add(crossViewHeaderDescriptor);
  188. if ((j == 0) && (k == 0))
  189. {
  190. Array.Resize(ref rowDescriptorsIndexes, rowDescriptorsIndexes.Length + 1);
  191. rowDescriptorsIndexes[rowDescriptorsIndexes.Length - 1] = Columns.Count - 1;
  192. }
  193. if ((k == i) || (i == (XAxisFieldsCount - 1)))
  194. {
  195. Array.Resize(ref columnTerminalIndexes, columnTerminalIndexes.Length + 1);
  196. columnTerminalIndexes[columnTerminalIndexes.Length - 1] = Columns.Count - 1;
  197. }
  198. }
  199. }
  200. }
  201. else
  202. {
  203. for (int j = 0; j < MeasuresCount; j++)
  204. {
  205. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor(CubeSource.GetXAxisFieldName(i), "", false, false, false);
  206. crossViewHeaderDescriptor.level = i;
  207. crossViewHeaderDescriptor.levelsize = 1;
  208. crossViewHeaderDescriptor.cell = cell;
  209. crossViewHeaderDescriptor.cellsize = XAxisFieldsCount - i;
  210. cell += crossViewHeaderDescriptor.cellsize;
  211. Columns.Add(crossViewHeaderDescriptor);
  212. if (j == 0)
  213. {
  214. Array.Resize(ref rowDescriptorsIndexes, rowDescriptorsIndexes.Length + 1);
  215. rowDescriptorsIndexes[rowDescriptorsIndexes.Length - 1] = Columns.Count - 1;
  216. }
  217. if (i == 1)
  218. {
  219. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor("", "", false, true, false);
  220. }
  221. else
  222. if (i == (MeasuresLevel + 1))
  223. {
  224. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor(CubeSource.GetXAxisFieldName(i - 2), "", true, false, false);
  225. }
  226. else
  227. {
  228. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor(CubeSource.GetXAxisFieldName(i - 1), "", true, false, false);
  229. }
  230. crossViewHeaderDescriptor.level = i;
  231. crossViewHeaderDescriptor.levelsize = XAxisFieldsCount - i;
  232. crossViewHeaderDescriptor.cell = cell;
  233. crossViewHeaderDescriptor.cellsize = 1;
  234. cell += crossViewHeaderDescriptor.cellsize;
  235. Columns.Add(crossViewHeaderDescriptor);
  236. if ((crossViewHeaderDescriptor.level + crossViewHeaderDescriptor.levelsize == XAxisFieldsCount))
  237. {
  238. Array.Resize(ref columnTerminalIndexes, columnTerminalIndexes.Length + 1);
  239. columnTerminalIndexes[columnTerminalIndexes.Length - 1] = Columns.Count - 1;
  240. }
  241. }
  242. }
  243. }
  244. else
  245. {
  246. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor(CubeSource.GetXAxisFieldName(i), "", false, false, false);
  247. crossViewHeaderDescriptor.level = i;
  248. crossViewHeaderDescriptor.levelsize = 1;
  249. crossViewHeaderDescriptor.cell = cell;
  250. if (MeasuresInXAxis)
  251. {
  252. crossViewHeaderDescriptor.cellsize = (XAxisFieldsCount - i - 1) * MeasuresCount;
  253. if (crossViewHeaderDescriptor.cellsize == 0)
  254. crossViewHeaderDescriptor.cellsize = MeasuresCount;
  255. }
  256. else
  257. {
  258. crossViewHeaderDescriptor.cellsize = XAxisFieldsCount - i;
  259. }
  260. cell += crossViewHeaderDescriptor.cellsize;
  261. Columns.Add(crossViewHeaderDescriptor);
  262. if ((crossViewHeaderDescriptor.level + crossViewHeaderDescriptor.levelsize == XAxisFieldsCount))
  263. {
  264. Array.Resize(ref columnTerminalIndexes, columnTerminalIndexes.Length + 1);
  265. columnTerminalIndexes[columnTerminalIndexes.Length - 1] = Columns.Count - 1;
  266. }
  267. Array.Resize(ref rowDescriptorsIndexes, rowDescriptorsIndexes.Length + 1);
  268. rowDescriptorsIndexes[rowDescriptorsIndexes.Length - 1] = Columns.Count - 1;
  269. if (i == 0)
  270. {
  271. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor("", "", false, true, false);
  272. }
  273. else
  274. {
  275. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor(CubeSource.GetXAxisFieldName(i - 1), "", true, false, false);
  276. }
  277. crossViewHeaderDescriptor.level = i;
  278. crossViewHeaderDescriptor.cell = cell;
  279. if (MeasuresInXAxis)
  280. {
  281. crossViewHeaderDescriptor.levelsize = MeasuresLevel - i;
  282. crossViewHeaderDescriptor.cellsize = MeasuresCount;
  283. }
  284. else
  285. {
  286. crossViewHeaderDescriptor.levelsize = XAxisFieldsCount - i;
  287. crossViewHeaderDescriptor.cellsize = 1;
  288. }
  289. cell += crossViewHeaderDescriptor.cellsize;
  290. Columns.Add(crossViewHeaderDescriptor);
  291. if ((crossViewHeaderDescriptor.level + crossViewHeaderDescriptor.levelsize == XAxisFieldsCount))
  292. {
  293. Array.Resize(ref columnTerminalIndexes, columnTerminalIndexes.Length + 1);
  294. columnTerminalIndexes[columnTerminalIndexes.Length - 1] = Columns.Count - 1;
  295. }
  296. }
  297. }
  298. if (Columns.Count == 0)
  299. {
  300. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor("", "", false, true, false);
  301. crossViewHeaderDescriptor.level = 0;
  302. crossViewHeaderDescriptor.levelsize = 1;
  303. crossViewHeaderDescriptor.cell = 0;
  304. crossViewHeaderDescriptor.cellsize = 1;
  305. Columns.Add(crossViewHeaderDescriptor);
  306. Array.Resize(ref rowDescriptorsIndexes, rowDescriptorsIndexes.Length + 1);
  307. rowDescriptorsIndexes[rowDescriptorsIndexes.Length - 1] = Columns.Count - 1;
  308. Array.Resize(ref columnTerminalIndexes, columnTerminalIndexes.Length + 1);
  309. columnTerminalIndexes[columnTerminalIndexes.Length - 1] = Columns.Count - 1;
  310. }
  311. for (int i = 0; i < YAxisFieldsCount; i++)
  312. {
  313. cell = 0;
  314. if (MeasuresInYAxis && (MeasuresLevel <= i))
  315. {
  316. if (MeasuresLevel == i)
  317. {
  318. for (int k = 0; k <= i; k++)
  319. {
  320. for (int j = 0; j < MeasuresCount; j++)
  321. {
  322. if (k == i)
  323. {
  324. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor("", CubeSource.GetMeasureName(j), false, false, true);
  325. crossViewHeaderDescriptor.cellsize = 1;
  326. crossViewHeaderDescriptor.levelsize = YAxisFieldsCount - i;
  327. }
  328. else
  329. {
  330. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor(CubeSource.GetYAxisFieldName(k), CubeSource.GetMeasureName(j), false, false, true);
  331. crossViewHeaderDescriptor.cellsize = (YAxisFieldsCount - i);
  332. crossViewHeaderDescriptor.levelsize = 1;
  333. }
  334. crossViewHeaderDescriptor.level = i;
  335. crossViewHeaderDescriptor.cell = cell;
  336. cell += crossViewHeaderDescriptor.cellsize;
  337. Rows.Add(crossViewHeaderDescriptor);
  338. if ((j == 0) && (k == 0))
  339. {
  340. Array.Resize(ref columnDescriptorsIndexes, columnDescriptorsIndexes.Length + 1);
  341. columnDescriptorsIndexes[columnDescriptorsIndexes.Length - 1] = Rows.Count - 1;
  342. }
  343. if ((k == i) || (i == (YAxisFieldsCount - 1)))
  344. {
  345. Array.Resize(ref rowTerminalIndexes, rowTerminalIndexes.Length + 1);
  346. rowTerminalIndexes[rowTerminalIndexes.Length - 1] = Rows.Count - 1;
  347. }
  348. }
  349. }
  350. }
  351. else
  352. {
  353. for (int j = 0; j < MeasuresCount; j++)
  354. {
  355. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor(CubeSource.GetYAxisFieldName(i), "", false, false, false);
  356. crossViewHeaderDescriptor.level = i;
  357. crossViewHeaderDescriptor.levelsize = 1;
  358. crossViewHeaderDescriptor.cell = cell;
  359. crossViewHeaderDescriptor.cellsize = YAxisFieldsCount - i;
  360. cell += crossViewHeaderDescriptor.cellsize;
  361. Rows.Add(crossViewHeaderDescriptor);
  362. if (j == 0)
  363. {
  364. Array.Resize(ref columnDescriptorsIndexes, columnDescriptorsIndexes.Length + 1);
  365. columnDescriptorsIndexes[columnDescriptorsIndexes.Length - 1] = Rows.Count - 1;
  366. }
  367. if (i == 1)
  368. {
  369. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor("", "", false, true, false);
  370. }
  371. else
  372. if (i == (MeasuresLevel + 1))
  373. {
  374. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor(CubeSource.GetYAxisFieldName(i - 2), "", true, false, false);
  375. }
  376. else
  377. {
  378. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor(CubeSource.GetYAxisFieldName(i - 1), "", true, false, false);
  379. }
  380. crossViewHeaderDescriptor.level = i;
  381. crossViewHeaderDescriptor.levelsize = YAxisFieldsCount - i;
  382. crossViewHeaderDescriptor.cell = cell;
  383. crossViewHeaderDescriptor.cellsize = 1;
  384. cell += crossViewHeaderDescriptor.cellsize;
  385. Rows.Add(crossViewHeaderDescriptor);
  386. if ((crossViewHeaderDescriptor.level + crossViewHeaderDescriptor.levelsize == YAxisFieldsCount))
  387. {
  388. Array.Resize(ref rowTerminalIndexes, rowTerminalIndexes.Length + 1);
  389. rowTerminalIndexes[rowTerminalIndexes.Length - 1] = Rows.Count - 1;
  390. }
  391. }
  392. }
  393. }
  394. else
  395. {
  396. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor(CubeSource.GetYAxisFieldName(i), "", false, false, false);
  397. crossViewHeaderDescriptor.level = i;
  398. crossViewHeaderDescriptor.levelsize = 1;
  399. crossViewHeaderDescriptor.cell = cell;
  400. if (MeasuresInYAxis)
  401. {
  402. crossViewHeaderDescriptor.cellsize = (YAxisFieldsCount - i - 1) * MeasuresCount;
  403. if (crossViewHeaderDescriptor.cellsize == 0)
  404. crossViewHeaderDescriptor.cellsize = MeasuresCount;
  405. }
  406. else
  407. {
  408. crossViewHeaderDescriptor.cellsize = YAxisFieldsCount - i;
  409. }
  410. cell += crossViewHeaderDescriptor.cellsize;
  411. Rows.Add(crossViewHeaderDescriptor);
  412. if ((crossViewHeaderDescriptor.level + crossViewHeaderDescriptor.levelsize == YAxisFieldsCount))
  413. {
  414. Array.Resize(ref rowTerminalIndexes, rowTerminalIndexes.Length + 1);
  415. rowTerminalIndexes[rowTerminalIndexes.Length - 1] = Rows.Count - 1;
  416. }
  417. Array.Resize(ref columnDescriptorsIndexes, columnDescriptorsIndexes.Length + 1);
  418. columnDescriptorsIndexes[columnDescriptorsIndexes.Length - 1] = Rows.Count - 1;
  419. if (i == 0)
  420. {
  421. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor("", "", false, true, false);
  422. }
  423. else
  424. {
  425. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor(CubeSource.GetYAxisFieldName(i - 1), "", true, false, false);
  426. }
  427. crossViewHeaderDescriptor.level = i;
  428. crossViewHeaderDescriptor.cell = cell;
  429. if (MeasuresInYAxis)
  430. {
  431. crossViewHeaderDescriptor.levelsize = MeasuresLevel - i;
  432. crossViewHeaderDescriptor.cellsize = MeasuresCount;
  433. }
  434. else
  435. {
  436. crossViewHeaderDescriptor.levelsize = YAxisFieldsCount - i;
  437. crossViewHeaderDescriptor.cellsize = 1;
  438. }
  439. cell += crossViewHeaderDescriptor.cellsize;
  440. Rows.Add(crossViewHeaderDescriptor);
  441. if ((crossViewHeaderDescriptor.level + crossViewHeaderDescriptor.levelsize == YAxisFieldsCount))
  442. {
  443. Array.Resize(ref rowTerminalIndexes, rowTerminalIndexes.Length + 1);
  444. rowTerminalIndexes[rowTerminalIndexes.Length - 1] = Rows.Count - 1;
  445. }
  446. }
  447. }
  448. if (Rows.Count == 0)
  449. {
  450. crossViewHeaderDescriptor = new CrossViewHeaderDescriptor("", "", false, true, false);
  451. crossViewHeaderDescriptor.level = 0;
  452. crossViewHeaderDescriptor.levelsize = 1;
  453. crossViewHeaderDescriptor.cell = 0;
  454. crossViewHeaderDescriptor.cellsize = 1;
  455. Rows.Add(crossViewHeaderDescriptor);
  456. Array.Resize(ref columnDescriptorsIndexes, columnDescriptorsIndexes.Length + 1);
  457. columnDescriptorsIndexes[columnDescriptorsIndexes.Length - 1] = Rows.Count - 1;
  458. Array.Resize(ref rowTerminalIndexes, rowTerminalIndexes.Length + 1);
  459. rowTerminalIndexes[rowTerminalIndexes.Length - 1] = Rows.Count - 1;
  460. }
  461. CrossViewCellDescriptor crossViewCellDescriptor;
  462. for (int i = 0; i < columnTerminalIndexes.Length; i++)
  463. {
  464. for (int j = 0; j < rowTerminalIndexes.Length; j++)
  465. {
  466. crossViewCellDescriptor = new CrossViewCellDescriptor(Columns[columnTerminalIndexes[i]].fieldName, Rows[rowTerminalIndexes[j]].fieldName, Columns[columnTerminalIndexes[i]].measureName + Rows[rowTerminalIndexes[j]].measureName, Columns[columnTerminalIndexes[i]].isTotal, Rows[rowTerminalIndexes[j]].isTotal, Columns[columnTerminalIndexes[i]].isGrandTotal, Rows[rowTerminalIndexes[j]].isGrandTotal);
  467. crossViewCellDescriptor.x = i;
  468. crossViewCellDescriptor.y = j;
  469. Cells.Add(crossViewCellDescriptor);
  470. }
  471. }
  472. }
  473. internal CrossViewHeaderDescriptor GetRowDescriptor(int index)
  474. {
  475. int tempXAxisFieldsCount = (!SourceAssigned) ? 1 : XAxisFieldsCount;
  476. if (index < tempXAxisFieldsCount)
  477. {
  478. return Columns[rowDescriptorsIndexes[index]];
  479. }
  480. else
  481. {
  482. return Rows[rowTerminalIndexes[index - tempXAxisFieldsCount]];
  483. }
  484. }
  485. internal CrossViewHeaderDescriptor GetColumnDescriptor(int index)
  486. {
  487. int tempYAxisFieldsCount = (!SourceAssigned) ? 1 : YAxisFieldsCount;
  488. if (index < tempYAxisFieldsCount)
  489. {
  490. return Rows[columnDescriptorsIndexes[index]];
  491. }
  492. else
  493. {
  494. return Columns[columnTerminalIndexes[index - tempYAxisFieldsCount]];
  495. }
  496. }
  497. #endregion
  498. #region Properties
  499. /// <summary>
  500. /// Gets a collection of column descriptors.
  501. /// </summary>
  502. /// <remarks>
  503. /// Note: after you change something in this collection, call the
  504. /// <see cref="CrossViewObject.BuildTemplate"/> method to refresh the CrossView.
  505. /// </remarks>
  506. public CrossViewHeader Columns
  507. {
  508. get { return columns; }
  509. }
  510. /// <summary>
  511. /// Gets a collection of row descriptors.
  512. /// </summary>
  513. /// <remarks>
  514. /// Note: after you change something in this collection, call the
  515. /// <see cref="CrossViewObject.BuildTemplate"/> method to refresh the CrossView.
  516. /// </remarks>
  517. public CrossViewHeader Rows
  518. {
  519. get { return rows; }
  520. }
  521. /// <summary>
  522. /// Gets a collection of data cell descriptors.
  523. /// </summary>
  524. /// <remarks>
  525. /// Note: after you change something in this collection, call the
  526. /// <see cref="CrossViewObject.BuildTemplate"/> method to refresh the CrossView.
  527. /// </remarks>
  528. public CrossViewCells Cells
  529. {
  530. get { return cells; }
  531. }
  532. #endregion
  533. #region Public Methods
  534. #endregion
  535. internal CrossViewData()
  536. {
  537. columns = new CrossViewHeader();
  538. columns.Name = "CrossViewColumns";
  539. rows = new CrossViewHeader();
  540. rows.Name = "CrossViewRows";
  541. cells = new CrossViewCells();
  542. cells.Name = "CrossViewCells";
  543. CreateDescriptors();
  544. }
  545. }
  546. }