DataViewForm.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. using System;
  2. using System.Data;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5. using System.Collections;
  6. using FastReport.Data;
  7. using FastReport.Utils;
  8. namespace FastReport.Forms
  9. {
  10. internal partial class DataViewForm : BaseForm
  11. {
  12. #region Fields
  13. private DataGridView grid;
  14. private DataSourceBase data;
  15. private int currentFirstRow;
  16. private int rowsOnPage;
  17. private int rowsCount;
  18. #endregion Fields
  19. #region Properties
  20. private int CurrentFirstRow
  21. {
  22. get { return currentFirstRow; }
  23. set
  24. {
  25. if (value >= 0 && value < RowsCount)
  26. {
  27. currentFirstRow = value;
  28. }
  29. }
  30. }
  31. private int RowsOnPage
  32. {
  33. get { return rowsOnPage; }
  34. }
  35. private int RowsCount
  36. {
  37. get { return rowsCount; }
  38. }
  39. #endregion Properties
  40. #region Constructors
  41. /// <summary>
  42. /// Initializes a new instance of the <see cref="DataViewForm"/> class.
  43. /// </summary>
  44. public DataViewForm(DataSourceBase data)
  45. {
  46. this.data = data;
  47. InitializeComponent();
  48. // create grid
  49. grid = new DataGridView();
  50. grid.Dock = DockStyle.Fill;
  51. grid.AllowUserToAddRows = false;
  52. grid.AllowUserToDeleteRows = false;
  53. grid.BorderStyle = BorderStyle.None;
  54. grid.BackgroundColor = Color.White;
  55. grid.GridColor = Color.LightGray;
  56. grid.AlternatingRowsDefaultCellStyle.BackColor = Color.WhiteSmoke;
  57. grid.RowHeadersVisible = false;
  58. grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
  59. grid.DataError += new DataGridViewDataErrorEventHandler(grid_DataError);
  60. this.Controls.Add(grid);
  61. grid.BringToFront();
  62. Localize();
  63. Init();
  64. UIUtils.CheckRTL(this);
  65. UpdateDpiDependencies();
  66. currentFirstRow = 0;
  67. if (data is TableDataSource)
  68. {
  69. rowsCount = (data as TableDataSource).Table.Rows.Count;
  70. }
  71. else
  72. {
  73. rowsCount = data.Rows.Count;
  74. }
  75. // calc number of rows on page
  76. CalcRowsOnPage();
  77. // fill grid with RowsOnPage rows starting from CurrentFirstRow
  78. FillGridWithNRows();
  79. UpdateButtons();
  80. this.SizeChanged += new System.EventHandler(this.DataViewForm_SizeChanged);
  81. }
  82. #endregion Constructors
  83. #region Private Methods
  84. private void Init()
  85. {
  86. Text = data.Alias;
  87. Icon = Res.GetIcon(222, this.Dpi());
  88. Config.RestoreFormState(this);
  89. }
  90. private void Done()
  91. {
  92. Config.SaveFormState(this);
  93. }
  94. public override void Localize()
  95. {
  96. base.Localize();
  97. MyRes res = new MyRes("Preview");
  98. btnFirst.Text = "";
  99. btnPrior.Text = "";
  100. btnNext.Text = "";
  101. btnLast.Text = "";
  102. }
  103. public override void UpdateDpiDependencies()
  104. {
  105. base.UpdateDpiDependencies();
  106. btnFirst.Image = GetImage(185);
  107. btnPrior.Image = GetImage(186);
  108. btnNext.Image = GetImage(187);
  109. btnLast.Image = GetImage(188);
  110. }
  111. private void CalcRowsOnPage()
  112. {
  113. rowsOnPage = ClientRectangle.Height / grid.RowTemplate.Height - 3;
  114. if (RowsOnPage >= RowsCount)
  115. {
  116. CurrentFirstRow = 0;
  117. }
  118. }
  119. private string GetStatusString()
  120. {
  121. if (RowsOnPage > 0)
  122. {
  123. if (RowsOnPage == 1)
  124. {
  125. return String.Format(Res.Get("Designer,ToolWindow,Dictionary,RowMofNRows"), CurrentFirstRow + 1, RowsCount);
  126. }
  127. else if (CurrentFirstRow == RowsCount - 1)
  128. {
  129. return String.Format(Res.Get("Designer,ToolWindow,Dictionary,RowMofNRows"), CurrentFirstRow + 1, RowsCount);
  130. }
  131. else
  132. {
  133. int lastRowOnPage = CurrentFirstRow + RowsOnPage;
  134. if (lastRowOnPage > RowsCount)
  135. {
  136. lastRowOnPage = RowsCount;
  137. }
  138. return String.Format(Res.Get("Designer,ToolWindow,Dictionary,RowsKtoLofNRows"), CurrentFirstRow + 1, lastRowOnPage, RowsCount);
  139. }
  140. }
  141. return String.Format(Res.Get("Designer,ToolWindow,Dictionary,NRows"), RowsCount);
  142. }
  143. private void FillGridWithNRows()
  144. {
  145. if (data is TableDataSource)
  146. {
  147. DataTable fullTable = (data as TableDataSource).Table;
  148. DataTable table = new DataTable(fullTable.TableName);
  149. table = fullTable.Clone();
  150. for (int i = 0, j = CurrentFirstRow; i < RowsOnPage && j < RowsCount; i++, j++)
  151. {
  152. table.ImportRow(fullTable.Rows[j]);
  153. }
  154. // this limitation in 655 columns is needed to avoid error with FillWeight sum more than 65535
  155. if (table.Columns.Count <= 655)
  156. {
  157. grid.DataSource = table;
  158. }
  159. else
  160. {
  161. grid.Columns.Clear();
  162. grid.Rows.Clear();
  163. for (int i = 0; i < 655; i++)
  164. {
  165. DataColumn col = table.Columns[i];
  166. DataGridViewTextBoxColumn dc = new DataGridViewTextBoxColumn();
  167. dc.Frozen = false;
  168. dc.HeaderText = col.ColumnName;
  169. grid.Columns.Add(dc);
  170. }
  171. foreach (DataRow row in table.Rows)
  172. {
  173. grid.Rows.Add(row);
  174. }
  175. }
  176. }
  177. else
  178. {
  179. bool setDataSourse = false;
  180. IList list = new ArrayList();
  181. for (int i = 0, j = CurrentFirstRow; i < RowsOnPage && j < RowsCount; i++, j++)
  182. {
  183. if (data.Rows[j] is IList)
  184. {
  185. list = (data.Rows[j] as IList);
  186. if (j == CurrentFirstRow)
  187. {
  188. for (int k = 0; k < list.Count; k++)
  189. {
  190. grid.Columns.Add("Column " + (k + 1).ToString(), "Column " + (k + 1).ToString());
  191. }
  192. }
  193. grid.Rows.Add();
  194. for (int k = 0; k < list.Count; k++)
  195. {
  196. grid.Rows[j].Cells[k].Value = list[k];
  197. }
  198. }
  199. else
  200. {
  201. if (data.Rows[j] is ValueType)
  202. {
  203. if (j == CurrentFirstRow)
  204. grid.Columns.Add("Column 1", "Column 1");
  205. grid.Rows.Add(data.Rows[j]);
  206. }
  207. else
  208. {
  209. list.Add(data.Rows[j]);
  210. setDataSourse = true;
  211. }
  212. }
  213. }
  214. if(setDataSourse)
  215. grid.DataSource = list;
  216. }
  217. }
  218. private void UpdateButtons()
  219. {
  220. if (RowsCount <= RowsOnPage || RowsOnPage <= 0)
  221. {
  222. btnFirst.Enabled = false;
  223. btnPrior.Enabled = false;
  224. btnNext.Enabled = false;
  225. btnLast.Enabled = false;
  226. }
  227. else
  228. {
  229. if (CurrentFirstRow < RowsOnPage)
  230. {
  231. btnFirst.Enabled = false;
  232. btnPrior.Enabled = false;
  233. btnNext.Enabled = true;
  234. btnLast.Enabled = true;
  235. }
  236. else if (RowsOnPage > (RowsCount - CurrentFirstRow) || CurrentFirstRow == RowsCount - 1 || (CurrentFirstRow + RowsOnPage) == RowsCount)
  237. {
  238. btnFirst.Enabled = true;
  239. btnPrior.Enabled = true;
  240. btnNext.Enabled = false;
  241. btnLast.Enabled = false;
  242. }
  243. else
  244. {
  245. btnFirst.Enabled = true;
  246. btnPrior.Enabled = true;
  247. btnNext.Enabled = true;
  248. btnLast.Enabled = true;
  249. }
  250. }
  251. lblRows.Text = GetStatusString();
  252. }
  253. #endregion Private Methods
  254. #region Event Handlers
  255. private void btnFirst_Click(object sender, EventArgs e)
  256. {
  257. lblRows.Focus();
  258. CurrentFirstRow = 0;
  259. FillGridWithNRows();
  260. UpdateButtons();
  261. }
  262. private void btnPrior_Click(object sender, EventArgs e)
  263. {
  264. lblRows.Focus();
  265. CurrentFirstRow -= RowsOnPage;
  266. FillGridWithNRows();
  267. UpdateButtons();
  268. }
  269. private void btnNext_Click(object sender, EventArgs e)
  270. {
  271. lblRows.Focus();
  272. CurrentFirstRow += RowsOnPage;
  273. FillGridWithNRows();
  274. UpdateButtons();
  275. }
  276. private void btnLast_Click(object sender, EventArgs e)
  277. {
  278. lblRows.Focus();
  279. if (RowsOnPage == 1)
  280. {
  281. CurrentFirstRow = RowsCount - 1;
  282. }
  283. else
  284. {
  285. CurrentFirstRow = RowsCount % RowsOnPage == 0 ? RowsCount - RowsOnPage : RowsCount - RowsCount % RowsOnPage;
  286. }
  287. FillGridWithNRows();
  288. UpdateButtons();
  289. }
  290. private void DataViewForm_SizeChanged(object sender, EventArgs e)
  291. {
  292. CalcRowsOnPage();
  293. FillGridWithNRows();
  294. UpdateButtons();
  295. }
  296. private void DataViewForm_Shown(object sender, EventArgs e)
  297. {
  298. int i = 0;
  299. while (i < grid.Columns.Count)
  300. {
  301. Column c = data.Columns.FindByName(grid.Columns[i].HeaderText);
  302. if (c != null)
  303. {
  304. if (c.Enabled)
  305. grid.Columns[i].HeaderText = c.Alias;
  306. else
  307. {
  308. grid.Columns.RemoveAt(i);
  309. i--;
  310. }
  311. }
  312. i++;
  313. }
  314. }
  315. private void DataViewForm_FormClosed(object sender, FormClosedEventArgs e)
  316. {
  317. Done();
  318. }
  319. private void grid_DataError(object sender, DataGridViewDataErrorEventArgs e)
  320. {
  321. e.Cancel = true;
  322. }
  323. #endregion Event Handlers
  324. }
  325. }