{"id":457,"date":"2010-12-21T21:08:34","date_gmt":"2010-12-21T21:08:34","guid":{"rendered":"https:\/\/ibex.tech\/visualcpp\/?p=457"},"modified":"2022-02-17T06:24:04","modified_gmt":"2022-02-17T06:24:04","slug":"table-layout-panel-for-large-arrays","status":"publish","type":"post","link":"https:\/\/ibex.tech\/visualcpp\/table-layout-panel\/table-layout-panel-for-large-arrays","title":{"rendered":"Table Layout Panel For Large Arrays"},"content":{"rendered":"<p>This example assumes there is a form that has a TableLayoutPanel with a vertical and horizontal scroll bar.<br \/>\nThe form can be resized and when it is the TableLayoutPanel is re-created to only include what is visible.<br \/>\nThis means that only the controls that can be seen are created and makes creating and updating it as fast as possible.<\/p>\n<p>(IBEX library has ready made form with this)<\/p>\n<h5>For the TableLayoutPanel<\/h5>\n<pre><code>\r\nName\t\t\tTable1\r\nAnchor\t\t\tTop, Bottom, Left, Right\r\nAutoScroll\t\tFalse\r\nAutoSize\t\tFalse\r\n<\/code><\/pre>\n<h5>For the horizontal scroll bar<\/h5>\n<pre><code>\r\nName\t\t\tTableHozScrollBar1\r\nAnchor\t\t\tBottom, Left, Right\r\n<\/code><\/pre>\n<h5>For the vertical scroll bar<\/h5>\n<pre><code>\r\nName\t\t\tTableVertScrollBar1\r\nAnchor\t\t\tTop, Bottom, Right\r\n<\/code><\/pre>\n<h5>Create these in the class<\/h5>\n<pre><code>\r\n\t\/\/GLOBAL VARAIBLES\r\n\tprivate: int TotalNumOfColumns;\r\n\tprivate: int TotalNumOfRows;\r\n\tprivate: int NumOfColumnsShown;\r\n\tprivate: int NumOfRowsShown;\r\n\tprivate: int ShowingStartColumnIndex;\r\n\tprivate: int ShowingStartRowIndex;\r\n\tprivate: array&lt;System::Windows::Forms::TextBox^, 2&gt;  ^txtGridBoxes;\r\n<\/code><\/pre>\n<h5>In the form load event<\/h5>\n<pre><code>\r\n\t\/\/CREATE THE TABLE GRID\r\n\tTotalNumOfColumns = 150;\r\n\tTotalNumOfRows = 150;\r\n\tShownStartColumnIndex = 0;\r\n\tShownStartRowIndex = 0;\r\n\r\n\tEventArgs ^MyArgs = gcnew EventArgs();\r\n\tfrmGroupSetup_ResizeEnd(this, MyArgs);\t\t\/\/Trigger the rezize event\r\n<\/code><\/pre>\n<h5>These are the functions<\/h5>\n<pre><code>\r\n\r\n\/\/*********************************\r\n\/\/*********************************\r\n\/\/********** FORM RESIZE **********\r\n\/\/*********************************\r\n\/\/*********************************\r\nprivate: System::Void frmGroupSetup_Resize(System::Object^  sender, System::EventArgs^  e)\r\n{\r\n\tconst int ColumnsWidth = 100;\t\/\/Set required columns width\r\n\tconst int RowsHeight = 20;\t\t\/\/Set required columns height\r\n\tint Count;\r\n\tint Column;\r\n\tint Row;\r\n\r\n\t\/\/---------------------------------------------------------------------------\r\n\t\/\/----- CALCULATE HOW MANY ROWS AND COLUMNS WE CAN FIT INTO WINDOW SIZE -----\r\n\t\/\/---------------------------------------------------------------------------\r\n\tNumOfColumnsShown = (this-&gt;Width - 20) \/ ColumnsWidth;\t\t\/\/Subtract width of other items on form.\r\n\tNumOfColumnsShown++;\t\t\t\t\t\t\t\t\t\t\/\/We need 1 extra colum to act as the variable size column on the right\r\n\tNumOfRowsShown = (this-&gt;Height - 80) \/ RowsHeight;\t\t\t\/\/Subtract height of other items on form.\r\n\tNumOfRowsShown++;\t\t\t\t\t\t\t\t\t\t\/\/We need 1 extra row to act as the variable size column on the bottom\r\n\r\n\t\/\/Stop re-drawing while we update contents\r\n\tthis-&gt;SuspendLayout();\r\n\tTable1-&gt;SuspendLayout();\r\n\r\n\t\/\/--------------------------------------------\r\n\t\/\/----- REMOVE THE EXISTING CONTROLS ---------\r\n\t\/\/--------------------------------------------\r\n\twhile (Table1-&gt;Controls-&gt;Count)\r\n\t\tTable1-&gt;Controls-&gt;RemoveAt(0);\r\n\r\n\t\/\/-----------------------------\r\n\t\/\/----- RE-SIZE THE TABLE -----\r\n\t\/\/-----------------------------\r\n\t\/\/Remove existing styles so we can re-create\r\n\twhile (Table1-&gt;ColumnStyles-&gt;Count)\r\n\t\tTable1-&gt;ColumnStyles-&gt;RemoveAt(0);\r\n\twhile (Table1-&gt;RowStyles-&gt;Count)\r\n\t\tTable1-&gt;RowStyles-&gt;RemoveAt(0);\r\n\r\n\tTable1-&gt;ColumnCount = NumOfColumnsShown;\r\n\tTable1-&gt;RowCount = NumOfRowsShown;\r\n\r\n\tfor (Count = 0; Count &lt; NumOfColumnsShown; Count++)\r\n\t\tTable1-&gt;ColumnStyles-&gt;Add(gcnew System::Windows::Forms::ColumnStyle(System::Windows::Forms::SizeType::Absolute, ColumnsWidth));\r\n\r\n\tfor (Count = 0; Count &lt; NumOfRowsShown; Count++)\r\n\t\tTable1-&gt;RowStyles-&gt;Add(gcnew System::Windows::Forms::RowStyle(System::Windows::Forms::SizeType::Absolute, RowsHeight));\r\n\r\n\t\/\/----------------------------\r\n\t\/\/----- ADD THE CONTROLS -----\r\n\t\/\/----------------------------\r\n\tthis-&gt;txtGridBoxes = gcnew array&lt;System::Windows::Forms::TextBox^, 2&gt;(NumOfColumnsShown, NumOfRowsShown);\r\n\r\n\tfor (Column = 0; Column &lt; NumOfColumnsShown; Column++)\r\n\t{\r\n\t\tfor (Row = 0; Row &lt; NumOfRowsShown; Row++)\r\n\t\t{\r\n\t\t\tthis-&gt;txtGridBoxes[Column, Row] = (gcnew System::Windows::Forms::TextBox());\r\n\t\t\tthis-&gt;txtGridBoxes[Column, Row]-&gt;Margin = System::Windows::Forms::Padding(0, 0, 0, 0);\r\n\t\t\tthis-&gt;txtGridBoxes[Column, Row]-&gt;BorderStyle = System::Windows::Forms::BorderStyle::FixedSingle;\r\n\t\t\tthis-&gt;txtGridBoxes[Column, Row]-&gt;Dock = System::Windows::Forms::DockStyle::Fill;\r\n\t\t\tthis-&gt;txtGridBoxes[Column, Row]-&gt;ReadOnly = true;\r\n\r\n\t\t\tTable1-&gt;Controls-&gt;Add(this-&gt;txtGridBoxes[Column, Row], Column, Row);\r\n\t\t}\r\n\t}\r\n\r\n\t\/\/----------------------------------\r\n\t\/\/----- UPDATE THE SCROLL BARS -----\r\n\t\/\/----------------------------------\r\n\r\n\t\/\/----- HORIZONTAL -----\r\n\tTableHozScrollBar1-&gt;Minimum = 0;\r\n\r\n\tif (ShowingStartColumnIndex &gt; (TotalNumOfColumns - NumOfColumnsShown))\r\n\t{\r\n\t\tShowingStartColumnIndex = (TotalNumOfColumns - NumOfColumnsShown) + 1;\r\n\t\tif (ShowingStartColumnIndex &lt; 0)\r\n\t\t\tShowingStartColumnIndex = 0;\r\n\t\tif (ShowingStartColumnIndex &gt;= TotalNumOfColumns)\r\n\t\t\tShowingStartColumnIndex = TotalNumOfColumns - 1;\r\n\t\tTableHozScrollBar1-&gt;Value = ShowingStartColumnIndex;\r\n\t}\r\n\tif ((NumOfColumnsShown &gt; 1) &amp;&amp; (TotalNumOfColumns &gt; NumOfColumnsShown))\r\n\t\tTableHozScrollBar1-&gt;LargeChange = NumOfColumnsShown - 2;\r\n\telse\r\n\t\tTableHozScrollBar1-&gt;LargeChange = 1;\r\n\r\n\tif (TotalNumOfColumns &gt; NumOfColumnsShown)\r\n\t\tTableHozScrollBar1-&gt;Maximum = (TotalNumOfColumns - NumOfColumnsShown) + TableHozScrollBar1-&gt;LargeChange;\r\n\telse\r\n\t\tTableHozScrollBar1-&gt;Maximum = 0;\r\n\r\n\t\/\/----- VERTICAL -----\r\n\tTableVertScrollBar1-&gt;Minimum = 0;\r\n\r\n\tif (ShowingStartRowIndex &gt; (TotalNumOfRows - NumOfRowsShown))\r\n\t{\r\n\t\tShowingStartRowIndex = (TotalNumOfRows - NumOfRowsShown) + 1;\r\n\t\tif (ShowingStartRowIndex &lt; 0)\r\n\t\t\tShowingStartRowIndex = 0;\r\n\t\tif (ShowingStartRowIndex &gt;= TotalNumOfColumns)\r\n\t\t\tShowingStartRowIndex = TotalNumOfColumns - 1;\r\n\t\tTableVertScrollBar1-&gt;Value = ShowingStartRowIndex;\r\n\t}\r\n\tif ((NumOfRowsShown &gt; 1) &amp;&amp; (TotalNumOfRows &gt; NumOfRowsShown))\r\n\t\tTableVertScrollBar1-&gt;LargeChange = NumOfRowsShown - 2;\r\n\telse\r\n\t\tTableVertScrollBar1-&gt;LargeChange = 1;\r\n\r\n\tif (TotalNumOfRows &gt; NumOfRowsShown)\r\n\t\tTableVertScrollBar1-&gt;Maximum = (TotalNumOfRows - NumOfRowsShown) + TableVertScrollBar1-&gt;LargeChange;\r\n\telse\r\n\t\tTableVertScrollBar1-&gt;Maximum = 0;\r\n\r\n\t\/\/-------------------------------------\r\n\t\/\/----- UPDATE THE DISPLAYED DATA -----\r\n\t\/\/-------------------------------------\r\n\tUpdateTableGridData();\r\n\r\n\tTable1-&gt;ResumeLayout();\r\n\tthis-&gt;ResumeLayout();\r\n }\r\n\r\n\/\/********************************************************\r\n\/\/********************************************************\r\n\/\/********** GRID HORIZONTAL SCROLL BAR CHANGED **********\r\n\/\/********************************************************\r\n\/\/********************************************************\r\nprivate: System::Void TableHozScrollBar1_ValueChanged(System::Object^  sender, System::EventArgs^  e)\r\n{\r\n\tif (TableHozScrollBar1-&gt;Value &lt; TotalNumOfColumns)\r\n\t\tShowingStartColumnIndex = TableHozScrollBar1-&gt;Value;\r\n\telse\r\n\t\tShowingStartColumnIndex = TotalNumOfColumns - 1;\r\n\r\n\tUpdateTableGridData();\r\n}\r\n\r\n\/\/******************************************************\r\n\/\/******************************************************\r\n\/\/********** GRID VERTICAL SCROLL BAR CHANGED **********\r\n\/\/******************************************************\r\n\/\/******************************************************\r\nprivate: System::Void TableVertScrollBar1_ValueChanged(System::Object^  sender, System::EventArgs^  e)\r\n{\r\n\tif (TableVertScrollBar1-&gt;Value &lt; TotalNumOfRows)\r\n\t\tShowingStartRowIndex = TableVertScrollBar1-&gt;Value;\r\n\telse\r\n\t\tShowingStartRowIndex = TotalNumOfRows - 1;\r\n\r\n\tUpdateTableGridData();\r\n}\r\n\r\n\/\/***********************************************\r\n\/\/***********************************************\r\n\/\/********** UPDATE DATA IN TABLE GRID **********\r\n\/\/***********************************************\r\n\/\/***********************************************\r\nprivate: void UpdateTableGridData(void)\r\n{\r\n\tint Column;\r\n\tint Row;\r\n\tString ^NewText;\r\n\r\n\tTable1-&gt;SuspendLayout();\r\n\r\n\tfor (Column = 0; Column &lt; NumOfColumnsShown; Column++)\r\n\t{\r\n\t\tfor (Row = 0; Row &lt; NumOfRowsShown; Row++)\r\n\t\t{\r\n\t\t\tif (\r\n\t\t\t((Column + ShowingStartColumnIndex) &lt; TotalNumOfColumns) &amp;&amp;\r\n\t\t\t((Row + ShowingStartRowIndex) &lt; TotalNumOfRows)\r\n\t\t\t)\r\n\t\t\t{\r\n\t\t\t\t\/\/SET CELL CONTENTS\r\n\t\t\t\tNewText = Convert::ToString(Column + ShowingStartColumnIndex) + \",\" + Convert::ToString(Row + ShowingStartRowIndex);\r\n\t\t\t\tif (this-&gt;txtGridBoxes[Column, Row]-&gt;Text != NewText)\r\n\t\t\t\t\tthis-&gt;txtGridBoxes[Column, Row]-&gt;Text = NewText;\r\n\r\n\t\t\t\tthis-&gt;txtGridBoxes[Column, Row]-&gt;BackColor = System::Drawing::SystemColors::Control;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t\/\/UNUSED CELL\r\n\t\t\t\tNewText = \"\";\t\/\/Unused end of column or end of row text box  - blank\r\n\t\t\t\tif (this-&gt;txtGridBoxes[Column, Row]-&gt;Text != NewText)\r\n\t\t\t\t\tthis-&gt;txtGridBoxes[Column, Row]-&gt;Text = NewText;\r\n\r\n\t\t\t\tthis-&gt;txtGridBoxes[Column, Row]-&gt;BackColor = System::Drawing::SystemColors::Control;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tTable1-&gt;ResumeLayout();\r\n}\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>This example assumes there is a form that has a TableLayoutPanel with a vertical and horizontal scroll bar. The form can be resized and when it is the TableLayoutPanel is re-created to only include what is visible. This means that only the controls that can be seen are created and makes creating and updating it [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[58],"tags":[],"class_list":["post-457","post","type-post","status-publish","format-standard","hentry","category-table-layout-panel"],"_links":{"self":[{"href":"https:\/\/ibex.tech\/visualcpp\/wp-json\/wp\/v2\/posts\/457","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ibex.tech\/visualcpp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ibex.tech\/visualcpp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ibex.tech\/visualcpp\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/ibex.tech\/visualcpp\/wp-json\/wp\/v2\/comments?post=457"}],"version-history":[{"count":2,"href":"https:\/\/ibex.tech\/visualcpp\/wp-json\/wp\/v2\/posts\/457\/revisions"}],"predecessor-version":[{"id":1076,"href":"https:\/\/ibex.tech\/visualcpp\/wp-json\/wp\/v2\/posts\/457\/revisions\/1076"}],"wp:attachment":[{"href":"https:\/\/ibex.tech\/visualcpp\/wp-json\/wp\/v2\/media?parent=457"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ibex.tech\/visualcpp\/wp-json\/wp\/v2\/categories?post=457"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ibex.tech\/visualcpp\/wp-json\/wp\/v2\/tags?post=457"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}