Imam dve svoji komponenti: TTable in TEdit.
Sedaj pa bi rad na formi na moji komponenti TEdit izbral TTable.
Na TEdit sem ustvari public property tipa TTable, vendar tega objekta nisem kreiral. Vse lepo in prav. (Skoraj) Dam TTable na formo, dam TEdit na formo, lahko izberem na TEdit-u en TTable, izbiram lahko med usemi TTable-i ki so na formi, in potem dobim plusek na temu property-u in lahko gledam in nastavljam property-e TTable-u kar na TEdit-u, vendar ko dam BUILD, mi javi:
Error 1 Cannot create an object of type 'TTable' from its string representation 'TTable1' for the 'Table' property. D:\projekti.NET\Test\Testi\Grid.aspx 10
Seveda, saj je v aspx datoteki: <cc2:TEdit ID="TEdit1" runat="server" Table="TTable1">
Mi zna kdo pomagati pri tem? Po mojem obstaja kakšen [.....] pred property-jem, vendar sem gledal, pa se mi po imenu nobeden ne zdi logičen.
o-MA-n-tjaz - torek, 23. januar 2007
Ja sedaj se pa razumemo. Bi prosil za kodo če je možno.Hvala in lep dan še naprej.
bojanv - torek, 23. januar 2007
Kontrola ima metodo FindControl (ki je zelo koristna), s katero lahko iščem v Control Tree-ju v kontroli. Se pa strinjam s izjavo Pril-a, kar je povedal.Če boš na SloDug-u, me potegni za rokav pa bova kako rekla na to temo....če te pa ne bo, pa povej pa ti prilepim par vrstic kode.... Si malce pred mano dal odgovor pa sem šele zdaj videl. Razumem, kaj hočeš narest. Ti bi rad preko designerja nastavil TTable in pole z njo počel, karkoli že maš namenjeno, zdaj te pa zanima, kako to nardit, da lahko ti nastaviš objekt, ki je na strani. Al sem te spet narobe razumel?
o-MA-n-tjaz - torek, 23. januar 2007
Ja FindControl bo vredu, če sem prav razumel, vendar se še vedno nismo razumeli.Jaz vržem na webFormo TTable in TGrid. Sedaj pa nebi rad v TGrid property TTableID vpisal na roke njegov string, da bom potem lahko v TGrid metodi na render se skliceval na njo, ampak bi rad ta TTable v property-u TGrid.TTableID izbrol z dropDown menijem. Tako da bi tm pri strani dal dropDown in bi mi zlistal use TTable, ki so na strani.Sej načeloma bi lahko tudi na roke vpisal tisti bogi ID, vendar jest tega nočem, ampak hočem da moram na WebFormi ibrat ga iz DropDown menija. Tako ne more priti do napake.
pril - torek, 23. januar 2007
Page.FindControl(imeKontrole) vrne referenco na kontrolo z id-jem imeKontrole. Pogoj je, da je kontrola že na strani (page objekt), kar seveda nekoč (v nekem delu izvajanja) zanesljivo je, če hočeš, da se uporabniku prikaže na web strani (ali pa web servisu ipd). Kakor sem razumel, želiš s stringom določit nek objekt (referenco oziroma točno določeno instanco). To ne gre, s stringom lahko določiš samo string - to je zgolj podatek, ki je v vsakem primeru tipa string.To je npr id kontrole, lahko pa je to tudi katera druga lastnost, na podlagi katere lahko potem enolično določiš (npr. najdeš po id-ju z uporabo findControl) objekt in nato na enega od načinov dobiš njegovo referenco (findControl funkcija že takoj vrne referenco). Se mi zdi da je Page.FindControl zato najbolj enostavna, je pa seveda še kar nekaj drugih možnosti. No, s stringom lahko določiš tudi integer, double in druge objekte, vendar je to samo podatek, ki se v nekem delu izvajanja konventira v pravilen tip objekta, ni pa to referenca objekta.Uh, upam da sem bil razumljiv???lp, pl
o-MA-n-tjaz - torek, 23. januar 2007
Tegale še vedno ne razumem. Imam dve kontroli, ki dedujeta iz System.Web.UI.Control in bi rad na eni izbral drugo kontrolo (property). Ne razumem, kaj ima to povezave z Page.FindControl, saj se propery ne tiče nič Page (ta dva objekta nič ne vesta o Page). Če napišem propety na prvi kontroli (npr. Grid), ki kaže na drugo komponento TTable takole: [Category("Data")] public TTable Table { get { return m_Table; } set { m_Table = value; } } je vse parav in dobro, tudi potem ko na Page na Gridu nastavim property, ki "kaže" na komponento TTable. Ko pa dam projekt buildat pa mi javi napako:Cannot create an object of type 'TTable' from its string representation 'TTable1' for the 'Table' property.
bojanv - petek, 19. januar 2007
Men so všeč take rešitve s templated kontrolami Se mi zdijo elegantne in uporabne. Vsak ma svoj način dela..Lahko narediš s to finto, da z find control nardiš. Lahko pa uporabiš reflection, samo jz bi se tega izogibal. V asp.net maš druge mehanizme zato. Bi še pa komentiral na odgovor fora-e. Tisto, kar ti poskušaš narediti, lahko narediš na 2 načina. Prvi je, da imaš odprt property, kjer določiš instanco "podkontrole". V codenehind-u potem to instanco naložiš (property get/set) in v drugi kontroli to uporabiš (preverjaš z is operatorjem). Varianta DataSource. Druga je pa varianta DataSourceID, kjer nastaviš id kontrole, ki jo moraš pa potem z eventi na strani pohendlat, da se ti prava instanca poveže. Najboljše rešiš to tako, da override-aš DataBind od kontrole, potem pa poskrbiš, da se ti instanca priredi. Seveda je pogoj, da se ti pokliče DataBind na page-u (pokliče se DataBind na child-ih), kar razrešiš globalno tako, da implementiraš svoj razred page, kjer nastaviš instance, povežeš kontrole v Init eventu, ... lahko pa se poigraš in implementiraš handler, ki pa posega v page procesiranje, torej PageHandler.Tebi fora tisto ne deluje, ker hočeš objektu podturit string, on pa hoče objekt tipa TTable. Poskusi drugo varianto, ki sem jo zgoraj navedel pa bo šlo. Maš tudi dost člankov na to temo, samo nimam jih v bookmarkih, za iskanje pa nimam časa.....
pril - petek, 19. januar 2007
tole, na hitro in na pamet, verjetno pa je zato kakšna napakica, ampak mislim da bo jasnoclass TEditpublic TTable as TTablesub OnNekEvent(e)Dim najdenaKontrola As System.Web.UI.Control = Page.FindControl("TTable1") If Not IsNothing(najdenaKontrola ) ThenTTable= ctype(najdenaKontrola,TTable) end ifend sub end class
fora - petek, 19. januar 2007
Em medtem, ko sem pisal prejšnje sporočilo je odgovoril še uporabnik pril. Po mojem je to to, kar rabim ja? Mi lahko poveš en stavek več, kako doseči to.Še vedno nisem prepričan, če je to to, kar rabim, vendar če s tem lahko dosežem, kar sem napisal v prejšnjem MSG-ju potem je to to.
fora - petek, 19. januar 2007
Em po mojem, če sem te prav razumel, se nisva razumela. Rad bi naredil isti učinek, kot ga ima devexpress za Grid in DataController.Grid ima property DataSourceID in tega lahko nastaviš na katero koli komponento ASPxDataController, ki je na formi.Za tiste, ki ne poznate komponent od devexpressa, pa nekako takole:Na formo bi dal TTable. Potem bi dal na formo še TEdit. Potem pa bi rad na formi nekako tedva povezal, zato da bi lahko na TEdit-u klical neko metodo na TTable-u, ki bi nekaj vračala.Tistle Container po mojem ni to, kar rabim.
pril - petek, 19. januar 2007
Če razumem prav se mi zdi to malo komplicirano; kaj pa če bi uporabil kar findControl pa najden objekt z id-jem TEdit1 potem kar prirediš prednastavljeni lastnosti? Al pa z reflection objektom? lp, pl
bojanv - petek, 19. januar 2007
Mogoče bom zgrešil tvoj namen, ampak sodeč po kodi mislim, da iščeš templated control. Ideja templated control je v tem, narediš za svojo kontrolo (TEdit) container, kamor boš dajal TTable-e. Za te table boš pa lahko potem spreminjal property-e, klical metode, itd.Kličeš pa lahko pole takole:<cc2:TEdit id="TEdit1" runat="server" > <Tables> <cc1:TTable id="neki" nekaLastnost=<%#Container.NekaLastnost%> /> </Tables></cc2:TEdit>Recimo, postopek:narediš dll projekt, dodaš referenco na System.Web.dll. implementiraš interface INamingContainerimplementiraš attribute ParseChildren (zato, da se vsebina prevede kot kontrola)property-e, ki jih nastavljaš, jim dodaj PersistanceMode na InnerProperty in TemplateContainer na ime INamingContainer-japrekriješ override, da se pokliče EnsureChildrenna koncu pa še prekriješ metodo CreateChildrenControls, da se pokliče InstanteIn v container-juLahko ti pa tudi kak primer napišem, če želiš......