[ASP.NET] Custom User Control -> aantal vraagjes

Pagina: 1
Acties:

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 09:47
Na heel wat ervaring met de winforms usercontrols te hebben, heb ik de draad met ASP.NET maar weer eens opgepakt.

Ik ben bezig om een kalender (jscalander van sf.net) (http://dynarch.com/mishoo/calendar.epl) om te zetten naar een ASP.NET custom user control, zodat ik deze makkelijk kan gebruiken in een project en designtime support krijgt.

De usercontrol bestaat uit een input field, en een knupske om de calendar te laten zien

Maar nu ben ik tegen een aantal vreemde dingen aangelopen. Als er gebruik wordt gemaakt van grid positioning, dan kan je de user control zelf op het scherm slepen vanuit de toolbox, en blijft daar ook staaan in design time.

maar in run time, zet de control zich ergens random neer.

Dit heb ik opgevangen, door de style tags van CUC over te nemen in een span element
code:
1
2
3
4
5
6
7
8
9
IEnumerator inum = this.Style.Keys.GetEnumerator();
while(inum.MoveNext())
{
    output.Write(inum.Current.ToString());
    output.Write(" : ");
    output.Write(this.Style[inum.Current.ToString()]);
    output.Write(" ;");
}
output.Write("\">");

Volgens mij kan dit veel beter. hoe dan?

ASP.NET controls hebben altijd een soort underscore in de ID staan van de controsl in runtime. Mijn control heeft dit niet. Daar specificeer ik de ID zelf van de input control, en de button voor de calendar.
code:
1
2
3
4
5
6
7
8
9
10
11
12
sb.Append("\n<input type=\"text\" name=\"date\" id=\"" + this.ID + "\" value=\"" 
+ text.Trim() + "\"/><button type=\"reset\" id=\"" + this.ID + "_b\">...</button>");
sb.Append("\n<script type=\"text/javascript\">");
sb.Append("\nCalendar.setup({");
sb.Append("\ninputField     :    \"" + this.ID + "\",      ");
sb.Append("\nifFormat       :    \"%m/%d/%Y %I:%M %p\",       ");
sb.Append("\nshowsTime      :    true,            ");
sb.Append("\nbutton         :    \"" + this.ID + "_b\",   ");
sb.Append("\nsingleClick    :    false,           ");
sb.Append("\nstep           :    1             ");
sb.Append("\n});");
sb.Append("\n</script>");

Heeft iemand een idee hoe dit beter kan? OnPreRender

En dan nog iets. Het (de?) user control heeft ook een aantal javascript includes nodig om goed te functioneren. Deze javascript bestanden staan in de root van IIS en hebben een referentie nodig in de HEAD van de aspx pagina.

Is dit te automatiseren?

Met het ophalen van de string uit het input veld, heb ik volgens mij een aantal kunstgrepen uitgehaald:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Bindable(true), 
Category("Appearance"), 
DefaultValue("")] 
public string Text 
{
    get
    {               
        return this.Parent.Page.Request[this.ID];
    }
    set
    {
        text = value;
    }
}

Volgens mij moet dit ook veel beter kunnen...

Ik heb zo een control wel eens eerder gemaakt, maar toen met een popup met daarin de standaard calendar control, en twee listboxes voor de tijd. Maar aangezien popup blockers dit eventueel kunnen blocken, wil ik toch voor de javascript manier gaan.

[ Voor 69% gewijzigd door PhoneTech op 14-05-2004 15:54 . Reden: Was nog een paar dingen vergeten ]


  • Folkert
  • Registratie: September 2001
  • Laatst online: 15:53
Misschien moet je hier eens kijken:
http://www.eworldui.net/CustomControls/CalendarPopup.aspx

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 09:47
Nadeel van dat control is dat het geen gecombineerde tijd/datum control is. En dat het ook nog eens closed source is...

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 09:47
beschaafd schopje

  • Crysania
  • Registratie: September 2000
  • Laatst online: 12:44
die javascript includes in de parent gaan nooit lukken, want je kunt in een user control niets veranderen in de parent.

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 09:47
THE_CR0SS schreef op 13 mei 2004 @ 15:06:
die javascript includes in de parent gaan nooit lukken, want je kunt in een user control niets veranderen in de parent.
Dit is inmiddels al gelukt ;)

code:
1
2
3
4
5
6
7
8
9
10
protected override void OnPreRender(EventArgs e)
{

    if((!Page.IsStartupScriptRegistered("DateTimePicker"))  && (this.Enabled) && (!Page.IsPostBack))
    {
        Page.RegisterStartupScript("DateTimePicker",HTMLHeaders());
    }
    
    base.OnPreRender (e);
}


Ik probeerde dit eerst te doen, in de constructor, maar via het zo handige MSDN kwam ik er achter, dat ik dit in de OnPreRender moest doen. Startpost is geupdate ;)

Op een of andere manier voegt asp.net het javascript blok aan de onderkant van de pagina in plaats van in de head. Solution anyone?

edit:

stomme naamgeving. Met startup script zou je toch denken dat deze bovenaan geinclude wordt...maar dat is dus RegisterClientScriptBlock...

RegisterClientScriptBlock

[ Voor 26% gewijzigd door PhoneTech op 14-05-2004 16:35 . Reden: Oplossing er bij gegooid ;) ]

Pagina: 1