Правильно, потому что runat интерпретируется во время компиляции, он фактически создает элемент управления в файле .designer, который в основном то, что вы делаете в себе .cs (код позади). Поэтому, создавая элемент управления во время выполнения, вам нужно вручную создать дерево элементов управления.что-то, что могло бы произойти автоматически, если бы вы использовали конструктор.
Я полагаю, вы бы создали какую-то Структуру, Массив, Словарь и т. д., которые бы отображали список ликов на их отдельные UL, тогда вы можете объединить этив коде, потянув список li по ключу UL, к которому хэшированы li.
Карта списков, если хотите.Таким образом, Map.get ("ulKey") возвращает список li, которые вы можете перебирать и запускать соответствующий код.Имеет смысл?