Postavi jedan panel.
Napravi jedan integer koji pokazuje trenutan broj redova i čuvaj ga u viewstate-u, sesiji, url-u, kako hoćeš.
Napravi funkciju koja instancira određeni, dodatni, broj redova kontrola( broj tih redova određen je onim integerom). Dakle parametrom joj kažeš koliko dodatnih redova da instancira.
U Page_Init(object, eventargs) pozovi tu funkciju uvek( i kad je post back i kad nije), a predaješ onaj gore integer. Ovo ti je potrebno jer dinamički dodate kontrole "nestanu" zbog stateless prirode http-a. Kasnije će asp.net za tebe u te kontrole ubaciti vrednosti koje je koristik ranije uneo.
Napravi event OnClick za dugme "+", koje će samo inkrementirati integer koji pokazuje trenutni broj redova. Takođe ponovo pozovi funkciju za dodavanje i predaj joj da instancira onoliko redova za koliko si inkrementirao broj redova.
Ovo bi trebalo da radi i bez viewstate-a, što je jako zgodno. Predlažem da, ukoliko na stranici imaš i drugih ne-dinamički dodatih delova forme, gornju logiku izdvojiš u zasebne WebControl-e. Konkretno dve. Jedna koja bi predstavljala jedan red kontrola sa svim geterima za vrednosti i slično. Druga koja bi služila kao kontejner ovih prvih, u njoj bi se nalazila gore navedena logika. Napravi određeni interfejs koji će implementira ta kontrola, a koji će definisati sve funkcionalnosti koje ti trebaju.
Kod će ti biti dosta organizovaniji, a ukoliko budeš imao potrebe, implementaciju kontrola možeš lako zameniti.