torsdag den 27. november 2014

Porada - Giolo : Lækkert spejl til væggen (Vægspejl)


Fandt dette lækre spejl til væggen (vægspejl) som jeg virkeligt godt kunne tænke mig.
Det var et man godt kunne bruge ude i gangen, som et fedt anderledes spejl som ikke så mange lige har. De fleste har et kedeligt almindeligt et som ligner en billedramme med et spejl, eller noget ikea eller et som er meget ordinært. Dette er specielt og fedt så overvejer jeg kraftigt om det ikke skal op i gangen.

tirsdag den 25. november 2014

ASYNC med store filer - fil kopiering


Når man skal kopiere store filer (fx 1-2-3 gb data), så kan du ikke bruge File.Copy, men skal ud i at flytte dem selv. Her benyttes original filestream og den nye filestream.
Ulempen ved denne er at der skal læses lidt fra orignal filestream, put det i en buffer, kopier ind i den nye filestream. Det er der en kerne der gør, hvilket gør at sådan en kopiering kan tage op imod en time for 1,5 gb data.

Fordi den ikke kan udnytte at læse og skrive samtidigt, gør det processen langsom.
Hvis man derimod benytter ASYNC, så sker det asynkront, og vil sige den kan fortsætte med næste stykke arbejde når den har kopieret data imens den skriver.
Ved at det er asynkront kan der kopieres imens der skrives, så den hele tiden har en buffer klar.

Det gjorde at den kom fra en time ned til et par minutter.

INDSÆT KODE

tirsdag den 11. november 2014

F9 til opdatering af referencer i Word


Når man laver referencer i word er det utroligt lækkert at lave referencer (krydshenvisning) til andre afsnit med nummer og tekst og eventuelt sidenummer.
Problemet er så bare at når du kommer videre så ændrer tekster sig, numre ændrer sig, sidetal opdateres, MEN word opdaterer dem ikke automatisk for dig.
Derfor skal du selv opdatere dem for ellers står der de forkerte afsnitsnumre, tekster og sidetal i dine henvisninger, hvilket altid kan blive et problem.

Det man gør er:
at markere alt tekst med Ctrl + A.
at opdatere referencer med F9
at vælge "opdater alt" og trykke OK.

Nu er dit dokument opdateret til den virkelighed som du har i hele dokumentet.

Kabelrod er no-go! Cordlets hjælper


Cordlets er et dejligt produkt!
Synes altid mine kabler ligger og flyder og nu kan man få dejligt styr på dem.
Om du så har til dine høretelefoner, til dine ladere eller andet så er der plads til at kunne fastgøre dem, og hvis nødvendigt er der plads til oprulning på enhederne også.

søndag den 9. november 2014

CSS3 Animations - Gør simple ting mere spændende


Med introduktionen af HTML5, fulgte CSS3 heldigvis med som en stor del af pakken for en webudvikler til at gøre hverdagen med at gøre web og webudvikling for webudviklere mere spændende, uanset platform. Du er helt uafhængig af at have plugins, eller javascript biblioteker såsom jquery lagt ind på din side.
To af de spændende ting som CSS3 bragte med sig var; CSS3 animations, og CSS3 transitions.

CSS3 Transitions er overgange fra en state til den næste.
Det vil sige at hvis fx at du på en hover effekt flytter et element 50px til højre, så vil din transition bestemme overgangen fra state A (startposition) til state B (50px til højre for start position).

CSS3 Animations er at du har mulighed for at lave en animation der afspilles.
Du kan opbygge en animation i punkter og så automatisk laves der "ruter" imellem dem.
Så fx hvis du har en animation med 6 punkter (0%, 20%, 40%, 60%, 80%, 100%), så vil den automatisk finde ud af hvordan den laver transitions fra state A til state B til state C osv.
Så hvis fx du i 0% har sagt at et element har opacity: 0 og i 20% har opacity: 1 så på den tid dette tager så laves en overgang fra 0 til 1.0. Hvis du så bagefter ændrer farven fra sort til rød, laves igen en automatisk overgang fra sort til rød.
Så du kan få et element til at flytte sig lidt til højre (20%), så flytte sig lidt op imens teksten ændrer sig til rød (40%), så flytte sig til venstre imens tekststørrelsen vokser (60%), og til sidst få baggrundsfarven til at skifte til en grøn baggrundsfarve (80%), for at afslutte ved at gå tilbage til sin første state (100%).
Her kan man bestemme hvor lang tid denne overgang (0-100%) skal tage, og hvordan den skal afvikles (start langsomt og afslut hurtigt, eller modsat, og mange andre muligheder.
Så kan man også sætte forskellige animationer på forskellige states - så du kunne sætte ovenstående animation på når der gås fra normal til :hover-state, og når man så går tilbage til normal så afspilles det hele igen baglæns fra en anden animation. Det giver en så ufatteligt mange muligheder.

Det er noget der gør at du nemt med lidt fodarbejde kan lave simple ting meget mere interessante ved at der er aktivitet på dine sider.

Billeder kan fade frem, elementer kan vokse når du peger på dem, tekster kan forstørres når du peger på dem, ikoner kan bevæge sig når du ser dem, menu'er kan danse når du åbner dem.
Alt sammen ting der gør en side lidt mere sjov og spændende (hvis man beherske sig), men nu heldigvis er relativt nemt fordi du har så mange muligheder og variationer der kan gøre dine sider mere spændende.

Fordi du kan bestemme flere punkter der udføres så gør det at dine muligheder er ret mange, fordi du kan få lavet så mange forskellige fede overgange så du vil tro det er løgn.

Da jeg er en meget passioneret og nysgerrig systemudvikler, så har jeg igennem noget tid rodet med både CSS3 transitions, men også med CSS3 animations, og begge er gode til hver sine ting.
Men efter jeg nu er blevet relativt god til dem, så er jeg helt vild med at gøre små bitte ting mere interessante med de muligheder CSS3 har givet mig.
Det skal ikke ligne min side er opbygget i Flash med et hav af effekter, men vil gerne have at der er lidt spil og ting der sker når man ser på min side for gør den interaktiv og dermed spændende.

fredag den 24. oktober 2014

ConnectionString "SqlConnection" - Brug et sigende navn! Udvikleren kan se fordelen


Vi har et projekt som viser en masse takst data og efter en rettelse sidste år er der opbygget ufatteligt meget forretningslogik. Derfor er dette projekt ret essentielt og logikken begynder nu at smitte af på andre projekter.
Det i sig selv er godt, MEN i et andet projekt skal vi så præsentere noget af de samme data som er i det første. For ikke at skulle opbygge samme struktur som der er lavet ovre i det andet projekt, så nu vil vi bruge dll'erne fra det første projekt så vi kan genbruge strukturen og objekterne.
DESVÆRRE for os er det så at disse dll'er pudsigt nok bruger "SqlConnection" som default, som også er den som vores nye projekt bruger. Derfor skal du vi nu lave vores eksisterende løsning om til at bruge noget andet end sqlconnection, så vi kan bruge sqlconnection til vores andre dll'er.

Jeg har altid været stor fortaler for at dine connection strings altid hedder noget unikt og noget sigende, for så støder du aldrig (eller meget sjældnere) på sådanne fejl ved at du giver dine connections strings unikke navne.


fredag den 17. oktober 2014

CSS Selectors forskellige til Chrome og IE (Avancerede jQuery)


Man skal være opmærksom på at når man laver CSS selectors der er lidt avancerede så er der forskellig syntaks der virker til Chrome og Internet Explorer (IE).

Vi havde et problem med at en selector ikke blev udført i Chrome, og det viste sig at være noget så simpelt som et MELLEMRUM!

Oprindeligt så vores script ud som følger:
$('td[style*="top: 200px"]').css({ 'top': '0px', 'left': '410px' });

Det virkede bare ikke i Chrome, og da vi så tilføjede følgende linie virkede det som det skulle:
$('td[style*="top:200px"]').css({ 'top': '0px', 'left': '410px' });

Så koden endte med at være:
$('td[style*="top: 200px"]').css({ 'top': '0px', 'left': '410px' });  //Works for IE
$('td[style*="top:200px"]').css({ 'top': '0px', 'left': '410px' });   //Works for Chrome

Så i DOM'en i Chrome der er ikke mellemrum, men i IE er der. Hvis du laver den uden mellemrum så virker den ikke i IE, og med mellemrum virker den ikke i Chrome. Så derfor bliver man nødt til at have forskellig kode til Chrome og til IE, som er STORT set identisk!

Som udvikler, så løber det en koldt ned af ryggen at det er lavet sådan, og man behøver at lave noget så ÅNDSVAGT! Problemet er ikke JQuery som vi har brugt, for det mellemrum KUNNE jo være noget der faktisk skulle søges på, hvor den i dette tilfælde er lige meget. Derfor kan man ikke bare sige til jQuery at den skal ignorere det mellemrum i midten, fordi den ved ikke at det er nødvendigt.
Derimod er det åndsvagt at de to implementeringer af udviklere fra team Chrome, og udvikler fra team Internet Explorer (IE) ikke er blevet enige om samme udførsel. Det i sig selv kan man til dels også forstå, men at det ER NØDVENDIGT med sådan en gang lortekode med dublet i en sådan skala får det til at krible over hele kroppen på mig fordi jeg er udvikler, og derfor synes det er ineffektivt kode der er grim og forfærdelig.

onsdag den 15. oktober 2014

Fejl i dansk sortering (Danish Dropdown globalization culture)

Hvis man har listen:
  • 12 måneder
  • År
  • Støvle
  • Stativ
  • Tiger

Så vil en almindelig sortering gøre at listen kommer med 12 måneder, så År, og så almindelig sortering for resten. Det er fordi at oftest vil den ikke vide at "Å" skal til sidst, og derfor kommer det før de almindelige bogstaver fordi den tager det som specieltegn på samme måde som fx tal.

Så nu kan din dropdown håndtere ÆØÅ og stadig sortere korrekt. Det er altid et problem med sortering i dansk i ASP.NET eller dropdowns, eller i lister. Dette hjælper.

Det kan løses ved at fortælle hvilken culture din comparer skal sammenligne i:

Public Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements       
            System.Collections.IComparer.Compare
                    Dim cb1 As ListItem = CType(o1, ListItem)
                    Dim cb2 As ListItem = CType(o2, ListItem)
                    Dim sp As StringComparer = StringComparer.Create(New  
                            Globalization.CultureInfo("da-DK"), True)
                    Return sp.Compare(cb1.Text, cb2.Text) * _modifier
                    'Return cb1.Text.CompareTo(cb2.Text) * _modifier
End Function

torsdag den 2. oktober 2014

Design til grundejer foreningen


Hvis man som udvikler vil lave en seriøs side kommer man ikke udenom at det gerne må se lidt godt ud, og desværre er der bare ret mange grundejer foreningers hjemmesider der ikke ser helt så godt ud.

Denne statistik vil vores grundejerforening ikke være med på, og vil levere en gennemarbejdet pæn grundejer forenings side. Dette skyldes nok mest at jeg som bestyrelsesmedlem er ASP.NET Webudvikler (C#), og derfor kan levere noget lidt større resultat fra en udvikler.

Da vi nuværende ikke har nogen hjemmeside, skal den starte webside (ASP.NET) vi får, have grundlæggende funktioner, såsom referater og andet information som kan være nyttigt for interesserede. Det kan være nye beboere eller ejendomsmæglere der har behov for informationen, som de derefter selv kan hente derinde.

Den skal opbygges pæn med rene linier så den fremstår tiltalende og ikke så "trist" som ret mange af de eksisterende eksempler der allerede er derude.

Første udkast er afgivet til bestyrelsen og var meget imponeret over mine udvikler kompetencer.

fredag den 26. september 2014

Windows 8 - Bruger din plads på log filer


Heldigvis for mig, så har min arbejdsplads FDC valgt at investere i at vi som udvikler skal have ny platform. Så alle udviklere har fået bærbare med SSD, eller stationære med almindelig disk.
Det gør så at når man som udvikler sidder med sin bærbar, så går det bragende stærkt, men pladsen er sparsom (200gb) og derfor skal man passe på med at have for mange databaser fordi de fylder godt.

Det med at bruge din plads skal Windows så nok hjælpe dig med! Den laver logfiler i bidder af 20mb, og dem får du et par af om dagen, specielt som udvikler.
Det betyder at på ca. 3 måneder har jeg fået brugt 8GB plads på logfiler som er ligegyldige. Det svarer ca til at den har brugt 6% af min plads på logfiler.

Det er lige noget man som udvikler skal være opmærksom på hvis du har begrænset plads eller mangler plads.

torsdag den 25. september 2014

Commando Promts rettigheder - Kør som admin eller dig?


Når vi skal lave en rettelse til produktion så optimerer vi vores kode så den bliver kompileret i en samlet fil, så man ikke kan få c# (cs) eller vb -filen, men alt er samlet i en .aspx (ASP.NET) -fil, og en kompileret fil i bin.
Dette har vi et script til, og i går oplevede jeg at når jeg kørte det ville den ikke forbinde til et netværksdrev og hente filer derfra.

Nu i dag viste det sig så at være fordi man kan køre kommando promt som dig selv ved at dobbeltklikke på den, eller trykke enter på den imens den er valgt.
Du kan også køre den som adminstrator, ved at højreklikke og sige "kør som adminstrator"/"run as administrator".

Jeg har altid kørt dem som administrator fordi ofte får man ikke helt adgang til ting hvis man ikke får kørt det som administrator.
I dette tilfælde viser det sig så at det skal køres som MIG, fordi ellers får den ikke samme mapning som jeg har.
Grunden til den ikke kunne finde k-drevet var at den ikke kørte som min bruger og derfor havde den IKKE den mapning min bruger har, og derfor kendte den ikke k-drevet.

Så IGNORER: http://csharpudvikler.blogspot.dk/2014/09/windows-explorer-snakker-ikke-sammen.html

onsdag den 24. september 2014

Windows Explorer snakker ikke sammen med Commando Promt (Netværksdrev)


DETTE ER LØST! Læs her: http://csharpudvikler.blogspot.dk/2014/09/commando-promts-rettigheder-kr-som.html

Vi har en speciel change procedure når der skal ændres noget til et eksisterende system og man skal have lagt en rettelse på serveren.
Alt skal kompileres så der ikke er c# (cs), eller vb -filer, men kun færdigt kompilerede sider.
Dette har vi et script til, fordi der er flere forskellige ting der skal tages med, MEN problemet her kommer så når filerne den skal bruge findes på et netværksdrev.

Når maskinen starter op er der et script der kører som skal sørge for at connecte vores forskellige netværksdrev, men det virker ikke. Man kan sagtens komme til fx K-drevet, for det står i listen og så snart man klikker på K-drevet skaber den forbindelsen korrekt.
DESVÆRRE så er det så bare sådan at den så opretter forbindelsen på samme måde som start-up scriptet gør.
For hvis du efterfølgende går ind med en commando promt og via xcopy forsøger at kopiere en fil fra k-drevet til et sted på din maskine så virker det ikke fordi den kan ikke genkende K-drevet.
Det er på trods af du kan stå på k-drevet i din file explorer og se filen eksisterer, men commando promten kan ikke finde ud af hvad k-drevet er.

Så netværksdrev skal mappes via commando promt før den kan finde ud af det, for når file explorer opretter forbindelse til netværksdrevet bliver det ikke lavet så din commando promt nu også kender det og kan tilgå det på samme måde som din file explorer.
Skuffer lidt at der ikke er tænkt over det fra Microsofts side.

tirsdag den 23. september 2014

Mediecenter / Medieafspiller - en nødvendighed!


Førhen da vi ikke havde en medie afspiller så vi film engang imellem, og fik os aldrig rigtigt taget sammen til at få set vores film.
Nogle gange kunne vi endda finde på at købe et sæt film, men ikke få dem allesammen set så det rent faktisk var "spildt".

Efter vi har fået et mediecenter så ELSKER vi at se film! Det er fordi det er så nemt og så smart at det fungerer så godt. En lille boks sluttet til tv'et, som du skruer over på som viser information og data om din filmsamling, og som afspiller fra dit netværkslager.
Således slipper du helt for at gå hen til hylden og hente dine film og skulle læse om dem eller finde en og sætte i dvd-afspilleren.

Nu tænder vi for tv'et og slår over på vores mediecenter og læser den igennem, eller vi tager en telefon eller tablet og ser den komplette filmsamling (som opdaterer sig selv hvis der kommer nye film ind i samlingen), og kan så se trailere, beskrivelser, og alt interessant for filmen for at vi ved om vi har lyst til at se den.

Netop det at det er så nemt gør at vi bruger det langt mere, og fordelen er også at du skal ikke "lede" efter fx The Matrix, velvidende den er der et eller andet sted på hylderne. Nu kan du bare søge og den kan nemt finde den.
HVIS der så skulle komme en med en DVD så er der sat et drev til vores medieafspiller så den kan klare almindeligt input også, og vi slipper for at have en separat DVD-afspiller sat op.

Udstyr:

  • Intel NUC
  • USB DVD Drev
  • NAS (Network Attatched Storage)

Du kan dermed rippe alle dine dvd-film og ligge ind på din NAS som så er på netværket.
Din Intel NUC vil så kunne gå på netværket og læse fra din NAS, og læse dine film.
Du installerer XBMC (To be; Kodi entertainment center) på din NUC og lader den have film fra din NAS som source.
Den vil herefter selv analysere dine film og finde coverbilleder, beskrivelser, og en masse gode data fra dine film til lækker præsentation, som du så kan afspille direkte fra NUC'en til dit TV.

Hvis du så vil have filmoversigten på andre steder end dit TV installerer du app'en Yatse, som giver dig et overblik over dine film på din android mobil eller android tablet, og gør du kan starte, stoppe, spole frem/tilbage, afspille trailers, se skuespillere, og meget meget mere.

Jeg har aldrig været så vild med film som jeg er nu fordi det er så nemt og så lækkert som jeg ønsker mig!

fredag den 19. september 2014

CSS selector der IKKE indholder noget specifikt

Hvis du gerne vil lave en generel selector der ramme alle <LI> tags, men IKKE dem der indholder attributten "sort" på sig.
Så kan du lave en meget effektiv og simpel css selector:

li:not([sort])

[sort] er det der fortæller den skal have attributten sort på sig,
:not( ) er det der fortæller at den IKKE må have sort attributten
li er den der fortæller det er et <LI> tag.

Så den rammer <LI> tags, der IKKE indholder attributten sort.

Se følgende eksempel
<ul>
  <li>
  <li sort="1">
  <li>
  <li sort="2">
  <li>
</ul>

Hver anden vil blive ramt, men ikke dem der har sort attributten på sig.

Name Analyzer - Omdøb filer til noget sigende

Først for nyligt har jeg fået lavet et rigtigt medie center, som gør at vi nyder alle vores medier langt langt mere fordi det er så tæt på og så nemt.
Det vi har gjort er at digitalisere alle vores DVD'er og musiksamlinger (CD'er), og lagt på vores NAS og fået sorteret og grupperet dem korrekt.
Problemet er med at man har film tilbage fra man gik i gymnasiet er at navngivningen er på 14 forskellige måder som man nu har syntes var smart igennem tiden. Derfor kan den første disney du havde, have et navn, og to'eren til selv samme film nu ikke ligger lige under med "2" bagefter, men et helt andet sted som du ikke kan se.

Det har resulteret i jeg har selv lavet en name analyzer, der kan analysere navne og finde dele af et navn og forsøge at finde ud af hvad det er.
Indtil nu har den virket på over 90% af min filmsamling som er blevet pæn og organiseret med ensartede navne - fx er alle disney film blevet navngivet "Disney - {filmnavn}", og de film hvor der stod årstal i kan nu finde årstallet i navnet og navngive den med (2014) efter filmnavnet.

Måden den finder filmnavnet er at finde dele som er tekst, indtil den støder på en del som ikke længere er tekst (eller splitter).


Den gennemsøger hele teksten, og opdeler den i logiske dele den har analyseret sig frem til.
Så den søger efter:

  • Tekst
  • Quality (1080p)
  • Splitter ("-", ":")
  • Årstal (1955)
  • Source (DVD)
Så hvis vi tager et eksempel
Lady and the Tramp 2 - Scamps Adventures.2001.DVD.720p

så bliver det til
[Lady, Text]
[and, Text]
[the, Text]
[Tramp, Text]
[2, Text]
[-, Splitter]
[Scamps, Text]
[Adventures, Text]
[2001, Year]
[DVD, Source]
[720p, Quality]

Så længe den finder tekst eller splitter, så forsætter den med at medtage den gamle information i det nye navn og derved kan du ofte nemmere få opbygget et mere retvisende navn der er mere ensartet.

Så det nye navn ville ende med:
Lady and the Tramp 2 - Scamps Adventures (2001)

Det har sparet mig for rigtigt mange timers retning fordi den gamle samling efterhånden er ved at være så stor.

tirsdag den 16. september 2014

Image Optimization for Visual Studio (extension)


Har du behov for at optimere dine billeder til lossless image optimization?

Det tilføjer en højrekliksmenu til at optimere alle PNG, GIF, og JPEG filer, og påvirker slet ikke kvaliteten i dine billeder fordi det er lossless image optimization.
Den bruger SmushIt og PunyPNG til at optimere dine billeder, uden at de taber kvaliteten.

Der er mange procent at spare i filstørrelse, som gør at dine billeder kan loades hurtigere, dermed loades din side hurtigere, og dermed rangerer du højere ved google med en hurtigere page speed.

mandag den 15. september 2014

TFS offline - Komme online igen


Hvis du arbejder i en solution og er forbundet til Team Foundation Server (TFS), men pludseligt er et sted uden netforbindelse spørg din solution om du vil arbejde offline.
Når man så siger ja, og arbejder videre så er det ikke sådan at næste gang du kommer online igen at den automatisk genforbinder til TFS. Den låser dine filer (write-protected/skrivebeskyttet), og lader dig ikke gemme noget før du er online igen.

Det er ikke nok at forbinde til TFS igen, for du er måske forbundet til TFS, men din solution forbinder så ikke til TFS. Du skal højreklikke på dit projekt, ikke din solution, derefter vælge Source Control > Go online.

Automatik eller et spørgsmål om den skal gøre det automatisk er der ikke indbygget i TFS, desværre - så det må du selv i gang med.


Desværre for mig, mente TFS så også at samtlige filer i min solution var ændret imens jeg var offline. Det var de ikke helt. Heldigvis kan den nu finde ud af at fjerne filer der ikke har ændringer når man checker ind, så de vil blive frasorteret der.

onsdag den 10. september 2014

Manglende film i XBMC?


Nu man har fået en XMBC maskine, og alt spiller, så kan man opdage nogle gange at de film man har lagt ind, ikke kan findes.
Så fx ældre film kan ikke findes fra en scraper, eller der er noget der ikke passer så den ikke kan finde dem. Dette gør at filen ikke vises i Movies, men skal findes manuelt i Video i listen af filer.

Det kan godt være ret irriterende, for selvom der ikke er noget information på filen vil man stadig gerne have den i Movies for så er alle film samlet i en liste, så man ikke skal i Video for at lede efter enkelte manglende filer.

Det er der en løsning på! Missing Movie Scanner (add-on):
http://wiki.xbmc.org/index.php?title=Add-on:Missing_Movie_Scanner

Jeg var selv gået i gang med at lave et lille program der kunne omdøbe mine mapper så de hed det korrekte, sammen med mediefilen indeni, men det viste sig så at være ligegyldigt.
Så mit program bliver nok bare brugt til at analysere mapper, få dem stuktureret og opstillet ensartet med samme format, så man nemmere kan se filsamlinger i filerne også fordi filformatering er ens.

Den kan analysere:
 - Tekst
 - Splitter ("-" eller ":")
 - Year (1994)
 - Source (DVDSrc)
 - Format (Xvid)
 - Quality (1080p)
 - Prefix ([LeAd]
 - Ripper (eksperimental)

Så den kan omdøbe din mappe og filer til noget mere korrekt, med et filnavn og årstal og fjerne de unødige elementer såsom "Source", "Format", "Quality", "Prefix" etc.

Det vil der komme mere om senere.

Validt HTML fra Visual Studio (Hvis det er XHTML)


Et avanceret værktøj som Visual Studio forventer man kan hjælpe dig i din færd med at skrive korrekt kode. Det er derfor den afslutter dine tags, giver dig fejl hvis du ikke har afslutninger etc. men når du så vil validere din html kan du rende ind i problemer.

Det viser sig at være fordi Visual Studio ALTID hjælper dig! Bare kun med at lave XHTML, så du skal altid have afslutning på dine tags.

Så selvom Visual Studio forsøger at gøre din HTML valid, så kan den ikke se på hvad den skal validere imod og hjælpe dig imod det mål du selv har sat. Så hvis du sætter doctype til
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
så hjælper Visual Studio dig med at arbejde væk fra det du selv har indskrevet du ønsker at ende med.

Man kan altid argumentere at hvis man ikke har styr på sine regler, kan man holde sig til Visual Studio's start forslag, og lade den hjælpe dig i mål med det, men det er et værktøj til hjælp, vel ikke diktatur?
Uanset hvad du forsøger at lave bør den hjælpe dig derhen, hvilket er pointen i en IDE som Visual Studio.

Så husk Visual Studio hjælper dig bare med at lave korrekt XHTML.

torsdag den 4. september 2014

CSS: Vælge element lige før/efter et andet


Ofte i en menu vil man gerne have en menuadskiller for hver menupunkt, men disse skal måske forsvinde når et menupunkt er valgt.
Eksempel:

Intet valgt element -situation (Situation 1)
Punkt 1 | Punkt 2 | Punkt 3 | Punkt 4 | Punkt 5

Valgt element -situation (Situation 2)
Punkt 1 (Punkt 2) Punkt 3 | Punkt 4 | Punkt 5

Ved det valgte element, forsvinder menuadskiller før og efter, men dette er ikke så nemt lige at gøre med CSS - UMIDDELBART!

Dette er fordi hvis vi opsætter kode og eksempel:
<ul>
<li>Punkt 1</li>
<li>Punkt 2</li>
<li>Punkt 3</li>
<li>Punkt 4</li>
<li>Punkt 5</li>
</ul>

Ovenstående viser (Situation 1)

Du kan få adskiller ved at sætte "background-image:url('image-splitter.png');" på hver li, og "background-repeat: none;", og når du så klikker på et element bliver det til:
<ul>
<li>Punkt 1</li>
<li class="marked">Punkt 2</li>
<li>Punkt 3</li>
<li>Punkt 4</li>
<li>Punkt 5</li>
</ul>

Ovenstående viser (Situation 2)

Problemet er at marked kan du sætte til "background-image: none", men den fjerner kun splitter på den ene side (i dette eksempel venstre).
Du har derfor brug for at kunne vælge den før/efter alt efter om din splitter vises i starten af din li, eller i slutningen.

DER ER DOG EN LØSNING!

Vælge element efter div i css:
.marked + li
Derved selecter du den li der er lige efter ".marked" -klassen og kan sætte "background-image: none", så den ikke vises.

Vælge element før div i css:
.marked ~ li
Derved selecter du den li der er lige før ".marked" -klassen og kan sætte "background-image: none", så den ikke vises.

Tags: css select element before another

Internet Explorer 11 (IE11) doesnt give round corners!


The problem exists because IE11, doesn't use the newest rendering engine, and therefor uses an engine that doesn't understand border-radius and round corners.
You can fix this with puttin a tag in head that forces it to use the latest rendering engine.

<meta http-equiv="X-UA-Compatible" content="IE=10"/>

or

<meta http-equiv="X-UA-Compatible" content="IE=edge"/>

The first forces it to use IE10 engine, where the second forces it to use the latest it can find and therefor more compatible with different IE browsers.

It is a funny fact that you can have Internet Explorer 11, and border-radius: 5px doesn't work, because the rendering engine it uses aren't from IE 11, and therefor doesn't understand the tag. The browser understands it, but just default doesn't use the latest engine that understands it.

fredag den 29. august 2014

Godt værktøj til din pizza!


Jeg har været en del pizzaskærere igennem og der er mange dårlige imellem.
Nogle har nogle "håndtag" foran ens hånd man skal kunne afsætte på så man kan presse bedre, men som enten bukker eller nemt går fra hinanden. Andrehar et hjul der kører let i 1/3 af vejen, så kører hårdt og så let igen hvilket kan blive virkeligt irriterende når man skal skære pizza.
Denne her skulle efter sigende ligge godt i hånden og  Quirky laver nogle gode produkter, så vil også gætte på Quirky Slice pizza skærer også er god at arbejde med. Design wise er den ihvertfald pæn at se på.

onsdag den 27. august 2014

Kravspecifikation med din kunde


Kravspecifikation er noget af det værste at få på plads som systemudvikler, for kunden glemmer ofte mange detaljer og dem opdager man ikke før tilbudet er afgivet, og man opdager mulige brugsmønstre som man ikke havde tænkt over til at starte med.

Her er et par ideer til hvordan du kan få det konkretiseret lidt mere.

Sæt dig ned sammen med kunden og tag fat i design oplæg, eller skitser det der skal opbygges.
Hvis det er web så skitser alle sider, med alle kontroller og gå dem derefter igennem helt slavisk:

STØRRELSE
- Fast bredde/højde? Dynamisk på en af lederne?
- Skal størrelsen være i pixels eller en relationel størrelse (procent)?

INDHOLD & FARVER
- Hvordan skal design være? Farvede kanter? Runde hjørner?
- Skal den kunne have et billede som baggrund? Skal dette være fast eller skal i kunne ændre det?
- Skal indholdet få den til at vokse i størrelse eller skal den være i fast størrelse?
-- Hvis indholdet er større end den definerede størrelse, skal det så gå ud over eller skal det overskydende skjules?

BRUG
- Skal den kun bruges dette sted/på denne side?
- Hvis den skal bruges på flere sider, skal alle sider så dele de samme data (global), eller skal den kunne have indhold per side (lokalt)?

FUNKTIONALITET
- Skal den kunne skifte farve?
- Skal den påvirke en anden kontrol, eller kun sig selv?
- Skal der ske noget når man klikker på den, eller en del af den?
- Skal den oprette noget et andet sted, vise data et andet sted/kontrol, når man indsætter noget?

VALIDERING
- Skal der kunne indtastes andre tegn and [a-å] - såsom specieltegn? (ex [.] [,] [?] )
- Skal der være mulighed for at indtaste HTML?
-- Skal HTML valideres korrekt? Eventuelt have en editor til at lave det korrekt?
- Hvilke muligheder skal der være under indtastning? Punktopstilling? Fed? Kursiv?
Dette skal sikre du ikke får et pludseligt problem som du ikke havde fået defineret.

tirsdag den 26. august 2014

Cache filer i ASP.NET MVC (HttpModul)


Hvis du udvikler en hjemmeside, vil du også gerne have den rangerer højt. Her er performance og load tid meget vigtig, og her kan caching hjælpe dig.
Den systemudvikler der laver din side ved det sandsynligvis godt, men der er flere måder at gøre det på.

Den ene er at tilføje en ActionFilterAttribut som cacher dit indhold, men denne gælder kun på dine actions (som siger lidt sig selv), men ofte vil du også cache billeder, javascript og andet fordi du genbruger dem i top og bund af siden på flere sider hvor der er samme layout indhold som kan caches.

Det er her at man som systemudvikler vender sig imod HttpModule, som kan reagere på alle requests og tilføje caching her (og dermed fange dine statiske resourcer).

Se koden herunder:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace HttpModules
{
    public class CachingModuleFiles : IHttpModule
    {
        public void Dispose() { }

        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += this.SetDefaultCacheHeader;
        }

        private void SetDefaultCacheHeader(object sender, EventArgs eventArgs)
        {
            HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);
            HttpContext.Current.Response.Cache.SetMaxAge(TimeSpan.FromSeconds(3600));
            HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddSeconds(3600));
        }
    }
}

OG HUSK AT AKTIVERE DEN I WEB.CONFIG DA DET ELLERS IKKE VIRKER!
Se her hvordan du gør:

<KODE>

Du kan her se hvordan du kan se at dine data er cachede:
<BILLEDE>

Udvikleren skal ha styr på detaljerne


Jeg er en af de udviklere der går meget op i detaljer, og at gøre det korrekt så vidt muligt.
Netop i øjeblikket kan jeg se hvor meget de små detaljer kan gøre i forskel på helhedsbilledet af en aflevering.
Det kan være små ting som at det testsite kunden skal logge ind på har sat noget op for at vise princippet som ligner korrekte data/billeder/tekster som kunne være reele i produktion, fremfor de testdata man har tildens til at altid lave og bruge.

Det kan være der ikke er fjernet en lille boks eller baggrund på et element der bruges mange steder.
Det kan være baggrundsfarven på en kasse er skrigblå, fordi man ikke har fundet den rigtige farvekode.
Det kan være der er for mange redigeringsmuligheder på billedet fordi man ikke har fået dem fjernet overalt.

Alle disse ting irriterer en som udvikler, men samtidigt er det også noget af det der gør stor forskel for kunden. Netop fordi det giver et førstegangsindtryk af noget der er meget lidt færdigt, og rodet.

Ofte kan man ved at rette sådanne små detaljer få et færdigt produkt der ser langt mere færdigt og professionelt ud, og så er den lille investering rigtigt godt givet ud fordi det ser meget bedre ud fra kundens synspunkt.

fredag den 22. august 2014

CSS selectors (advanced)


CSS selectors er et uunværligt værktøj at have, men der er rigtigt mange forskellige situationer de virker på, og man skal stykke dem sammen.

Så sent som i dag lærte jeg at der var forskel på

  1. div > a
  2. div a

fordi den første (1) er direct child selector og den anden er descendant/child selector.
Forskellen er om a ikke må ligge inde i noget andet under div, eller om den må være placeret alle steder så længe den er under div.
Situation 1 der er det kun tilladt at have a i første niveau under div, hvor i situation 2 er det tilladt alle steder bare den ligger under div.
Så følgende situation:
<div>
<span>
<a></a>
</span>
</div>

Der vil situation 1 ikke blive ændret noget, fordi din selector siger a skal være inde i div og ikke i en span, men situation 2 vil virke fordi så længe du har et a inde i en div vil selectoren virke uanset hvor langt inde den er placeret.


For mere information omkring CSS selectors se her: http://learn.shayhowe.com/advanced-html-css/complex-selectors/

torsdag den 21. august 2014

CSS3 keyframes er dejligt nemt at arbejde med

Nu er det jo heldigvis blevet meget dejligt nemt som udvikler at arbejde med grafisk frontend arbejde via CSS3.
Noget af det som CSS3 gør nemmere er at arbejde med er animationer, hvor at man bruger keyframes.
Det smarte her er at man nu som udvikler nu skal definere nogle punkter i ens animation og så vil browseren selv rendere hvordan den kommer fra forrige punkt til det næste.
Så nu kan du nemt lave en overgang fra en farve til en anden ved at lave en farve i 0% eller from, og så den anden farve i 100% eller to, og det mellemliggende vil browseren selv lave, og finde ud af hvordan den får skabt en overgang dertil. Det gør det MEGET nemmere både som C# udvikler, men også som systemudvikler.

Det samme gør sig gældende når du skal udvikle en animation med bevægelse, hvor elementer flytter sig fra punkt A til B. Du kan selv definere flere punkter den skal gå imellem, eller et start og slutpunkt.
Man kan enten lave from og to, så finder den selv ud af mellemvejen. Eller man kan også lave det i flere steps via %, som man selv bestemmer hvor langt i animationen den skal gøre dette.
Der er rigtigt mange properties man kan benytte både, font-size, width, border, border-left etc. som man kan lave nogle fine effekter ud af.

Som udvikler gør det ens arbejde MEGET nemmere at lave noget lidt mere interessant!

Der kommer et eksempel senere

tirsdag den 19. august 2014

C# udvikler ønsker mere

Jeg har igennem noget tid gået med tanken om at videreuddanne mig.
Det er noget jeg har kunne mærke jeg har haft lyst til igennem længere tid.
Dengang jeg tog min uddannelse tog jeg ingen pause imellem folkeskole og gymnasiet, eller videre derfra.
Derfor var jeg meget energisk for at komme "ud" af min uddannelse og bruge min viden til noget og udrette noget. Det har jeg så opnået nu, og jeg er kommet indenfor en gren i mit felt jeg absolut ELSKER!

Derfor ønsker jeg at videreuddanne mig fordi nu efter et par år i felten ønsker jeg at blive endnu dygtigere til det jeg laver, og kunne lave mere avancerede ting.

Til glæde for mig ønsker mit firma det samme, men det skal alt sammen tilpasses til arbejdslivet og opgaverne, samtidigt med at det passer med privatlivet.
Så overvejer om jeg skal tage en professionsbachelor, eller om jeg skal tage en "IT-diplomuddannelse".


Den ene har en del jeg gerne vil lære omkring generelt, og den anden har et niche område jeg ønsker at lære mere omkring - nemlig Umbraco.
Det er ikke helt nemt for IT-Diplomuddannelsen tages på Center for Diplomingeniøruddannelse, en del af DTU, og er lige ved siden af mit arbejde stort set.
Kender en der går der, der siger det er rigtigt godt, og har været til informationsaften og det virkede også spændende.

Som udvikler så har man en naturlig trang til at udvikle sig, og lære mere.

Jeg overvejer kraftigt at tage den fra DTU fordi det er lidt et kvalitetsstempel, og så kan jeg tage et kursus senere.

Er rigtigt glad for mit firma vil tillade mig at tage uddannelsen, som gør meget for min glæde ved at arbejde her.

Bibliotek til at tælle tal op (grafisk effekt)


I forbindelse med min udvikler side, skulle jeg have funktionalitet til at tælle et tal op.
På min forside står der hvor mange kompetencer jeg har, og ville gerne have den talte op når man kom ind.

Fandt CountUp.js, på denne side: http://inorganik.github.io/countUp.js/, og prøvede det af på jsfiddle.com.
Desværre kunne jeg ikke få det til at fungere, så jeg henvendte mig til udvikleren.dk, som kan ses her:
http://www.udvikleren.dk/forum/46150/tael-tal-op/

Det kom til at virke på min forside, på c# udvikler, og er fantastisk!
Når jeg får tid, skal det finjusteres med easing og tid, samt at den gør det forfra når man peger på kassen, men det nåede udvikleren ikke helt i går.

tirsdag den 22. juli 2014

Csharpudvikler.dk som serviceprovider


Igennem noget tid har jeg tænkt på der er mange der netop har behovet for at beregne alder præcist.
Derfor vil jeg lave en apps-sektion på min udvikler side, som skal have en app til timespan calculator.
Således kan man fx beregne alder præcist, via en side.
Dog vil jeg også udvide min udvikler side og udstille den som en service.

Så hvis nogle har behov for at kalde en service som kan beregne et præcist timespan så kan de kalde min service.

Således vil der være en Apps-side på min udvikler side, hvor man kan indtaste startdato [år, måned, dato], og en slutdato kan ændres, som standard vil være sat til dags dato, med samme format som ovenstående.
Den vil så kalde selv samme service, og returnere resultatet til siden for at præsentere det.
Derudover vil det være muligt at en anden systemudvikler kan kalde min service med AJAX med JSON, og modtage et JSON svar.

mandag den 21. juli 2014

Anmelderrost vinholder Wine Cell


Jeg er ikke den store vinkender, og/eller vinelsker.
Derfor vil jeg nok stadig gerne have et par flasker liggende når der kommer gæster som kan li et glas rødvin.
Har tænkt på at man kan få de gammeldags stativer til at sætte ovenpå et skab og så klare mig med det, men jeg er jo ret så vild med ting der er anderledes og som får folk til lige at stoppe op og sige hov hvad er det.
Det gør Wine Cell, for dine flasker hænger nu vandret ud af væggen på grund af dens unikke opbygning og så kan du jo ellers selv opbygge din vinkælder over grundplan som du ønsker det i alle de mønstre og farver du kan komme i tanke om.

tirsdag den 15. juli 2014

Udvikler du skal forstå processen for at bruge den


Hvis du ikke forstår konceptet i SCRUM og hvorfor det holdes, så lad være med at holde det bare fordi i altid gør det.
Der er scenarier hvor i har snakket sammen om de ting i som udviklere skal lave, hvor i er så få på projektet (fx i sommerferie perioden) at SCRUM er unødvendig.

Et maskerade spil fordi "det plejer vi at gøre" er ulogisk, men tænk over om behovet er der og om du eller andre udviklere har behov for det. Hvis i får snakket igennem det i snakker om på SCRUM i løbet af dagen og ikke skal interagere med andre parter og udviklere der ikke er med i disse snakke, så er daglig SCRUM blandt 2-3 personer unødvendigt!

mandag den 14. juli 2014

Få en hurtigere Samsung Galaxy S3 med mere plads


Der er flere der oplever at deres Samsung Galaxy S3, Samsung Galaxy S2, eller Samsung Galaxy S4 har problemer med at bruge for meget hukommelse og derfor bliver langsom.
Det er der en nem løsning på, så jeres telefon bliver hurtigere og får mere plads.
Løsningen er simpel og gavner din Samsung Galaxy telefon for problemer med for lidt hukommelse, problemer med plads og opdatering via Kies, samt gør den bliver hurtigere.
Gå ind på jeres telefon og tast *#9900# som om i skal ringe til nummeret, så kommer der en menu bar frem, vælg nummer to på listen “Delete dumpstate/logcat” og jeres tlf bliver tømt for ubruglige log filer og har massere af plads igen
https://www.facebook.com/SamsungDanmark/posts/556157257752222

tirsdag den 8. juli 2014

Vær en mand og tag ansvar som udvikler!

Jeg arbejder nuværende som udvikler sammen med en der er så ansvars-fraskrivende (eller distræt) som nogen jeg nogensinde har mødt!
Manden er rigtigt god til at finde på hans egne små smarte løsninger som ændrer alt muligt, men som han så ikke fortæller andre i gruppen.
Desværre så laver han så meget ofte sine egne ting om fordi de enten ikke virker, ødelægger allerede fungerende funktionalitet, eller han vil lave det på en anden måde igen og opfinde den dybe tallerken.
Det resulterer ret ofte i at når man merger sammen med hans version så er der kommet noget på, og lige efter skal det slettes og ændres.


Det kan godt forvirre en ret så meget, og det betyder så at man spørger til hvad med det og det.
På trods af man kan vise ham det kommer fra et change-set som han står for, så mener han hårdnakket stadig at man måske selv har lavet noget man har glemt noget om, for han har ihvertfald ikke glemt noget eller haft noget med det der at gøre.


Vær en mand og hvis du får beviserne for det så indrøm og sig det må være dig og fiks det, i stedet for at slå ud med armene og sige det kender jeg ikke til, i håb om anden tager en beslutning om det skal med eller ej, som han så bagefter kan gå til personen med og sige hov hov du har da lige lavet en fejl og være sur og irriteret på personen.

ASP.NET MVC er en fornøjelse at arbejde med


Nu da jeg som udvikleren skal til at lave en side for vores grundejer forening begynder jeg at skulle lave nogle lidt mere vilde ting, fordi jeg ønsker at have nem administration med smarte features.
Det gør jeg kaster mig selv ud i nogle mere avancerede hjørner af ASP.NET MVC end jeg plejer at arbejde med, men det er fedt at lære mere om muligheder og begrænsninger i ASP.NET MVC. Generelt når man er systemudvikler elsker man at lære nyt, men det her er rigtigt meget en fornøjelse fordi jeg synes ting virker nemme og lige til, netop fordi du har så meget kontrol selv over det du laver.
Der kan være nogle udfordringer med routes, men det er noget jeg må lære mere om senere hen.

Mulighederne for at sætte standard ting op, som kan aktiveres fra dit enkelte view er så smart og lækkert.

Jeg har lavet en banner image slider på forsiden som faktisk er på layout, men under denne er en grå info box som er en hvor man kan skrive noget generelt information omkring selve siden man er på. Fordi denne er noget der generelt kan bruges så er den placeret på layout, og så på det enkelte view definerer du blot indholdet til den og wupti så kommer den pludseligt på. Det er sådan noget man som systemudvikler elsker for det er smart og nemt, uden at skulle lave en masse avanceret.
Det samme kommer så til at gælde for fx topmenu og sidemenu.
Så hvert view vil definere deres egen sidemenu, som kan deles på tværs af sider.

Igen her skal udvides med nogle smarte objekter der kan laves i controlleren som kastes med, så man altid får samme sidemenu, og man ikke skal lave noget specifikt på hver side men kun selve indholdet specifikt til denne side.


Jeg er en C# udvikler, og elsker at arbejde med C# (csharp), og jo mere jeg lærer omkring ASP.NET MVC jo mere glad bliver jeg for at arbejde med det. Det er jo fantastisk at man har så mange muligheder, som oftest ikke sætter mange begrænsninger eller grimme hack løsninger. Derfor er jeg så glad for ASP.NET MVC er det som udvikler kan lave vores grundejerforenings side i, for det fungerer bare så godt!

Uanset hvad jeg har skulle lave indtil videre har der været lidt indlæring, men har løst det på en pæn måde.
Imageslider var der lidt bøvl med, men blev løst og var en smuk løsning. Topmenu blev dynamisk og smuk opsat med nem administration. Info box (grå) var lavet i løbet af sekunder og det fungerede bedre end forventet. Det er jo GENIALT!

mandag den 7. juli 2014

VB.NET kan ikke finde ud af Attributes

Som systemudvikler oplever man mange sjove ting.
Da vi desværre nuværende arbejder i webforms, er json kald nødvendige at lave som webmethods.
En webmethod bliver lavet som static / shared (i vb.net) fordi du så ikke skal have en instans af siden for at kalde den.
Det betyder så også at du ikke har adgang til de data på din klasse/objekt etc. som du er vant til.
Man kan dog dele sin session med sin webmethod, men her skal man være en opmærksom udvikler, for i vb.net har man sin egen syntaks.

Desværre for C# udvikleren oplevede jeg at den ikke ville udføre det korrekt, undtagen når jeg debuggede.
Vi har et user objekt i sessionen, og den har et menu-objekt til at holde styr på en masse.
Hvis jeg bare kørte siden, kunne den ikke få fat på dette menu-objekt, men så snart jeg debuggede så virkede det og den fandt værdierne.
Så snart jeg slukkede for debugging så kunne den ikke læse værdierne igen.

Det viste sig at være forskel i attributes fordi det er vb.net der har sin egen syntaks.
Jeg startede med denne syntaks:
<System.Web.Services.WebMethod(True)> _
        <ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _
        <
        Public Shared Function GetPermissions(ByVal textID As String, ByVal rootPath As String, ByVal ParentTextID As String, ByVal DotNet_Type As String, ByVal DisplayColumn As String) As PermissionsInfo

Ovenstående fungerede ikke!

Denne syntaks endte med at fungere.
<WebMethod(Description:="Per session Hit Counter", _
       EnableSession:=True)> _
    <ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _

Ovenstående FUNGERER KORREKT!

Den fungerede og nu kunne min side pludseligt altid få fat i de data fra menu-objektet.

Forskellen er hvordan du definerer EnableSession-værdien, og det var denne der gjorde om det virkede permanent eller ej.
Derfor man nogle gange kan blive en træt systemudvikler for det fungerer ikke altid som det burde.

fredag den 4. juli 2014

Arkitektur er rigtigt vigtigt for en udvikler!


Vores projekt er baseret på at stort set alt er bygget op i kontroller, og hver af disse kontroller skal bede om data kun til sig selv.
Optimeringsmæssigt har vi som systemudvikler sørget for at alle disse kald slås sammen til et så man ikke har 100 kald per side til databasen.

DOG var vi lidt uenige om hvad strukturen skulle være. Jeg mente det skulle være en central del som hver kontrol skulle sende et request til denne enhed, som satte data og leverede dem tilbage til kontrollen.
Desværre blev vi ikke enige om det, og det endte med en anden model som ligner den men er meget mere bundet op til en side skal være en speciel type side, og en masse andet sættes op korrekt.

Udover det så er jeg nu halvvejs inde i projektet kommet til en situation hvor jeg har brug for at dele data fra en kontrol til en anden. Det kan man desværre ikke så nemt på samme måde her, for alt hardwires ind i kontrollen i stedet for at have en property med et response objekt hvor man kan sende data til andre.
Derudover ønskede jeg at vores menu blev loadet ind i en statisk klasse som skulle holde styr på en masse, og dette skulle ske en gang og man kunne så lave forespørgsler til dette objekt.
Det var der ikke enighed om var smart, så nu sidder vi med en låst struktur og der hvor jeg nu har brug for tat tilgå data fra den kontrol over mig, så skal jeg selv bede om samme data igen og lave "hacks" fordi strukturen er for fastlagt.

Det rammer mit udvikler hjerte når man bliver nødt til at lave sådan noget gris, for man er som C# udvikler trods alt stolt af sit erhverv.

VB.NET på et website arver ikke altid korrekt (Kontroller)


Hvis du som udvikler arbejder med kontroller, i VB.NET på et website, så kan man lave properties til en KontrolBase som du kan sætte på kontrollen.
Desværre betyder det så bare at den property du har sat ikke er på begge typer objekter - eller værdien er forskellig efter typen.

Hvis du har base-klassen KontrolBase, som har propertien RenderAtHover som kan sættes til en boolean værdi.
Hvis du så har en kontrol der nedarver fra den og sætter den på kontrollen Controls_ContentControls_SectionsImage (som nedarver fra KontrolBase), så hvis du har et andet sted hvor du skal finde den kontrol og typecaste den så er der to scenarier:


  1. Typecaste den til den egentlige type (Controls_ContentControls_SectionsImage)
  2. Typecaste den til base-typen (KontrolBase)
Normalt ville jeg mene at uanset hvilken du satte den til, skulle din property RenderAtHover have samme værdi. Her er VB.NET lidt underlig, for fordi du har sat den på den specialiserede type (Controls_ContentControls_SectionsImage) så skal du typecaste den til denne type for at få værdien.
Hvis du ikke gør det, så er propertien ikke sat.

Dette betyder at når du har nedarvning skal du dermed prøve at lave dit objekt om til de nedarvninger du har for at se hvilke properties der er sat fra hvilke "lag" (nedarvninger). For fx dem som der er sat standard til en default værdi i et tidligere nedarvet lag får du ikke med i det specialiserede når du typecaster med ctype.

Så hvis du på masterpage.master kalder FindControl(SectionsImageID) og får et object tilbage, og typecaster den til KontrolBase så får du ikke værdien sat på den side hvor du bruger kontrollen.

Fx:
AppCode\KontrolBase.vb
Her sætter du Name = "Default name"

Controls\ContentControls\SectionsImage.vb (nedarver fra KontrolBase)
Du sætter Name = "Another name"

Hvis du så på din master har FindControl(SectionsImageID) får du object tilbage.
Derfor må du typecaste.
Hvis du så typecaster den til base-typen mister den sin specialiserede værdi.
dim foundControlObj as object = FindControl(SectionsImageID)
dim specialisedControlBase as KontrolBase = ctype(foundControlObj, KontrolBase)
dim theName as string = specialisedControlBase.Name

theName vil være "Default name", i stedet for "Another name" som den burde være.
Hvis du derimod laver en klasse der hedder SectionsImageBase som du ligger i app_code og nedarver fra denne (som nedarver fra base), så selvom det virker som det samme så bliver det åbenbart ikke fordi du ikke sætter værdien til noget.
Dvs:
AppCode\KontrolBase.vb
Her sætter du Name = "Default name"

AppCode\SectionsImageBase.vb (nedarver fra KontrolBase)
Her sætter du ikke Name til noget default

Controls\ContentControls\SectionsImage.vb (nedarver fra SectionsImageBase)
Her sætter du Name = "Another name"

Dette gør at du kan typecaste din kontrol til en "mere" specialiseret form hvor den ikke default sætter din property til noget. Derfor bliver din property nu "Another name" som den skal.

Ved ikke hvorfor, og kan ikke forklare det. Måske det er fordi den tager scopet af KontrolBase og sætter Name til default name, og fordi "specialiseringen" SectionsImageBase ikke sætter denne property til noget så kan den nu tage den værdi fra den der arver fra den.
Burde ikke være nødvendigt, og er ret sikker på den slags ikke forekommer i C#, men igen som systemudvikler bliver man nogle gange overrasket. Det blev denne C# udvikler i hvert fald!