На самом деле вы можете использовать встроенную функциональность treenode для написания поведения типа Ajax.
Существует два свойства узла TreeNode, которыми вы можете воспользоваться:
PopulateOnDemand : установите для этого свойства каждого TreeNode значение true, для которого вы хотите ленивую загрузку его дочерних узлов.
OnTreeNodePopulate : Это свойство TreeView, в котором необходимо определить метод, который вызывается при расширении TreeNode.
Воспользуйтесь этим и поместите ваш вызов БД (или поиск в кэшированном значении) в метод, определенный OnTreeNodePopulate.
После того, как это сделано, он должен работать очень хорошо (и эффективно).
Вот ссылка на документацию MS, относящуюся к ней (довольно хороший пример)