Accendo / Publikované

AJAX: Multiple controls were found with the same id

 

Autor: Libor Bešenyi

Dátum: 24.5 .2009

 

            Mal som implementovaný jeden pomerne komplikovaný User Control (Visual Studio 2008, ASPX .Net 3.5) s pár Ajax toolbox objektmi v DataGridView. Všetko chodilo, kým neprišla požiadavka, že záznamy sa nebudú editovať v gride, ale vo fieldoch pod gridom (príliš veľa záznamov, preto také rozhodnutie).

 

            Nič jednoduchšie neexistuje, že? No bol som prekvapený, keď po „copy – paste“ v run-time som začal dostávať javascript chybu! Po dlhodobom krokovaní, som zistil, že nie je iná možnosť, ako „opraviť“ FindControl() routinu zdedenú z Form triedy.

 

            Našťastie všetky moje formuláre dedia z predka, ktorého som napísal. Tak som začal pátrať, ako to do prdele robí Microsoft v gride a našiel som. Moja predtucha bola správa, výsledok je tu:

 

using System.Collections.Generic;
2    
3    ...
4    
5        public abstract partial class FormularZaklad : System.Web.UI.Page
6        {
7                // --------------------------------------------------------------------
8                private Dictionary<string, Control> _findControlHelperCache = new Dictionary<string, Control>();
9    
10   ...
11   
12               // --------------------------------------------------------------------
13               public override Control FindControl(string id)
14               {
15                        Control control = null;
16                        if (_findControlHelperCache.ContainsKey(id))
17                                 control = _findControlHelperCache[id];
18                        else
19                        {
20                                 control = base.FindControl(id);
21                                 Control nc = NamingContainer;
22                                 while ((null == control) && (null != nc))
23                                 {
24                                          control = nc.FindControl(id);
25                                          nc = nc.NamingContainer;
26                                 } // while
27                                 if (null != control)
28                                 {
29                                          _findControlHelperCache[id] = control;
30                                 } // if
31                        } // else
32                        return control;
33               }

 

http://forums.asp.net/p/1135399/3183833.aspx#3183833