Какого черта я пропускаю?
Видимо, много. В вашей разметке вы объявили экземпляр System.Web.UI.WebControls.Table . В вашем экземпляре класса Page это будет иметь имя переменной «ButtonTable». Он также будет автоматически добавлен в коллекцию Page.Controls . Когда страница будет отображаться, коллекция Controls будет повторяться и отображаться по очереди.
В вашем коде default.aspx.cs вы просто указываете ссылку на ButtonTable на другой элемент управления Table - но вы не влияете на коллекцию Page.Controls. Когда придет время рендеринга, будет отображаться (пустая) таблица, определенная в разметке, а не результат вашего вызова BuildTable.
Все это довольно длинное слово "вы делаете это неправильно". Ответ на почему вы хотите, чтобы ваш код построения таблицы в отдельном классе пролил некоторый свет на "правильный путь". Но - и я имею в виду не обижаться - я думаю, что вам нужно изучить основы ASP.NET, прежде чем идти дальше.
При этом самое быстрое решение (но, скорее всего, не то, что вам действительно нужно ) - это добавить таблицу в коллекцию Controls, чтобы она отображалась:
GetData Buttons = new GetData();//create a reference to the class
ButtonTable = Buttons.BuildTable();
this.Controls.Add(ButtonTable);
OutPut.Text = ButtonTable.Rows.Count.ToString();
Обратите внимание, что он будет отображаться отдельно от вашей разметки, определенной ButtonTable, и поэтому будет помещен после метки вывода. Это потому, что он был добавлен после метки Output.