venerdì 29 gennaio 2010

hover su input button (mozilla compatible).

Si sono tonico in quest'inizio 2010...

Partiamo dalle cose semplici IE supporta l'hover sui button ? no. Mozilla supporta gli hover sui button ? ancora no.

C'e' tuttavia una comoda tips per poterci riuscire e per aver un bell'effetto.

Create un div e popolatelo di bottoni..
poi applicate questi stili...

.MainDiv input
{
border :0;
}
.MainDiv input[type="button"]:hover
{
border :0;
color :white;
height :30px;
width :215px;
display :block;
text-align :left;
font-size :15px;
}
.MainDiv input[type="button"]
{
border :0;
color :#6A6A6A;
height :30px;
width :215px;
display :block;
text-align :left;
font-size :15px;
}
MainDiv è chiaramente il DIV ...
input è la radice dei button..
input[type="button"] ( chiamiamola estensione del tipo ... ) è il bottone.

Funziona abbastanza bene, è possibile applicare anche un background e shiftarlo

[Serializable] quando il problema si pone.

Come risolvere un problema che apparentemente non esiste??
Nel creare un web custom control può accadere che per puro caso vi imbattiate nel dover realizzare un
div che contiene una serie di bottoni, popolati "per comodo" o "per mera complicazione" tramite una lista
tipizzata.

public class Item
{
private string _itemName;
private string _itemValue;

public string itemName {get ; set ;}
public string itemValue {get ; set ;}
}

public class ItemDataProvider
{
private List _items = new List();

public List Items {get; set;}

public ItemDataProvider()
{
// tutto il codice necessario per eseguire il fill di _items
}
}

Per finire...
[DefaultProperty("Text")]
[ToolboxData("<{0}:ItemViewer runat=server>")]
public class ItemViewer : WebControl
{
[Category("Data")]
public List Items {get; set;}
}

Create la pagina.. aggiungete il controllo, un po sale un po di pepe...
E puf vi beccate una bella Eccezzione !!!

Del tipo che Item non è contrassegnata come serializable....


Bhe che dire se cercate qua e la qualcuno vi dirà che manca l'attributo alla proprieta del controllo web
qualcuno che manca l'attributo alla lista..
io vi levo ogni dubbio..

MANCA ALLA CLASSE ENTITY...

[Serializable]
public class Item
{
private string _itemName;
private string _itemValue;

public string itemName {get ; set ;}
public string itemValue {get ; set ;}
}

e fatto .. !!!

venerdì 22 gennaio 2010

SelectedIndexChanged doppio ...

Ma brava mamma microsoft... AJAXTOOLKIT di stoca... !! Questa volta mi avete fatto arrabbiare e tanto... si perchè il potenziale danno sarebbe stato bello grosso.

La stituazione è semplice
a) In una web application aggiungete la reference al AjaxToolKit, bene bravi...
b) aggiungete un web form ( bravissimi )
c) ora aggiungete un update panel
d) aggiungete quindi al upPanle una grid ( fatto? )
e) aggiungete una commandField ( tipo un select command )
f) ed ora gestite sia l'evento di SelectedIndexChanged o il RowCommand o entrambi.
g) e per concludere mettete due simpatici break nel primo e/o nel secondo evento ...

Che cosa ottenete ???
che entrambi gli eventi si scatenano due volte....

Supponete che RowCommand si debba gestire un insert... che cosa potrebbe succedere ??
che al posto di una insert te ne infila due...

BENE .. e tutto questo è documentato ?? PARE di si .. ma non nel toolkit e non sul sito di MS,
che per altro conferma il problema.. ma non suggerisce una vera soluzione... arg..

E quindi ci pensiamo ancora una volta noi .. rassegnati e con le palle a terra..

if (Session[this.ID + "_justDone"] == null)
{
.... codice di gestione dell 'evento a vostra scelta...
Session[this.ID + "_justDone"] = 1;
}
else
{
Session[this.ID + "_justDone"] = null;
}

bello ne'?? mmmm un capo lavoro ... e meno male che sono in test... e meno male che me ne
sono accorto !!

Per altro pare che fra noi developers italiani questo "successone" ancora non si sia verficato...
cmq io lo documento e preparatvi a gestirlo !!

dimenticavo è possibile che tutti gli oggetti che generano postback siano soggetti al double Fire... !!


ambhe'

giovedì 21 gennaio 2010

Domain Driven o MVC

Due mondi apparentemente differenti, due mondi quasi completamente distinti.
Eppure il Domain Driven, trae le sue radici proprio dal MVC, lo estende e parecchio, anche se in un certo senso lo circoscrive.

Il concetto basilare del MVC, è creare un forte disaccopiamento fra dati, la logica e chi li presenterà, questo non è del tutto perso nel D.D.D. anzi l'estensione nasce proprio nel concetto di Anti Corruption, dove un proxy di derivazione Design pattern, non fa altro che "switchare" da un "Provider" ad un Altro ma che fa le stesse cose.
Verosimilmente un cluster termine già più conosciuto.

Appaiono concetti Nuovi come l'Aggregazione o Coesione, questo perchè in D.P. un entity è solo un entity, mentre in D.D.D, un entity può essere vista come un utente, che deve accedere ad un certo numero di funzionalità ( Nb si parla di Facade... o qualcosa di non troppo distante).

Appare il concetto di Confine, un qualcosa di sottile che delimita lo spazio del dominio, conecetto che in mvc non era proprio presente... e forse non era nemmeno necessario. Però per soluzioni in D.D.D. è necessario imporre o impostare un limite.
Per questo concetto però potrebbe essere necessario almeno un esmpio.

In Mvc la soluzione può essere costituita da più progetti come un sito web e varie dll, o una windows application e varie dll, in D.D.D una soluzione può essere l'insieme di applicazioni presenti in un azienda che hanno come punto d'ingresso l'utente di LDAP...

Ora non è difficile comprendere perchè serve un confine...

A tale proposto si parla di Domain Layer ( simile business Logic ) ma è il punto in cui il software vive.

Si parla di immutabilità, oggetti che possono essere osservati che possono avere iterazione con altri oggetti, ma che non cambiano il loro stato.

Tuttavia si parla di Ubiquty Languages ... già perchè in programmazione ( da sempre ) si cerca di dare a tutti una regola nella definizione delle "cose". In D.D.D il concetto è forte e persistente dato che la vastità di una soluzione può essere considerevole...
E' di estrema importanza che tutti si parli "nella stessa lingua e degli stessi argomenti chiamandoli sempre con il loro nome". E va da se che anche nella stesura del codice si debba sempre mantenere chiaro il contesto.

E i test su architetture simili ??

Già in D.D.D si parla tanto anche di Test Driven, una metodologia che consente di scrivere codice
in base anche ai test che dovranno essere fattti.

Certo Mvc è "fondatore" della buona programmazione "D.D.D." estente quanto di meglio c'era e in parte lo migliora

Tag Form dimensionabile...

Tristemente mi sono accorto di qualche nuovo limite ... alla facciazza di Yoda "tentare no fare e riuscire si"... caro Yoda
tentare ha il suo bel perchè CREDIMI.

Nella maggior parte dei casi quando si realizza un sito, è buona norma studiare il layout su una pagina di test, per vedere
se va. Se non lo fate, credetemi è giunto il momento di farlo...

Seguite questo banale esempio

a)create una pagina html semplice semplic che abbia un lay out simle al seguente



Per fare cio vi servono

questi stili
.main {width:100%; height:100%;background:white;}
rappresenta tutta l'area

.header{width:100%;height:100px ;background:red;}
rappresenta la zona rossa

.left {width:200px; height:100%;background:yellow;float:Left;}
rappresenta la zona gialla

.right{height:100%; background:green;}
rappresenta la zona verde


html
head
style quanto sopra /style
/head
body
div class="main"
div class="header" /div
div class="left" /div
div class="right" /div
/div
/body
/html

E puf .. ecco che abbiamo la nostra pagina... fatta e perfetta.

b) Ora torniamo sulla pagina di visual studio...

E nella migliore delle ipotesi otteniamo questo ... Tutto condensato in malo modo...

Da che cosa dipende ?? nella maggior parte dei casi i limiti sono imposti dal validatore, che implica delle costrizioni
a livello di interpretazione. Ossia i brws quando incappano in una pagina con validatore applicano delle regole precise
statiche a come dovrà essere interpretato il file. Quindi chiusure di tag stili e tanto tanto altro.

MA ... non è il nostro caso...

il nostro nemico è il Tag Form.. che tutti snobbiamo ... perchè apparentemente sappiamo che è un qualcosa di
emblematicamente inesitente, ma non è così. Anzi occupa spazio ed è pericolosamente invasivo.

provate ad aggiungere alla vostra paginetta di test il succccitato tag..


html
head
style quanto sopra /style
/head
body
form
div class="main"
div class="header" /div
div class="left" /div
div class="right" /div
/div
/form
/body
/html


e otterrete l'immagine sopra (quella schiacciata... )
Per visual studio (vb/c#) la soluzione è molto semplice.. ma "rischiosa" se come nella maggior parte dei casi il
form E' TUTTA LA PAGINA, allora vi troverete bene, se non benissimo a compiere il breve gesto di
aggiungre

form{width:100%; height:100%;}

al vostro foglio di stile.... e se avete risolto... bhe fatevi i complimenti perchè avete scoperto qualcosa di nuovo.

( ma come czz si fa a indentare il codice in sto chiodo di blog??? ) saluti !!

mercoledì 20 gennaio 2010

isNumeric c#....

Ho letto qua e la nel web di gente disperata che non sa come ottenere la buona e vecchia isNumeric...
Si quella funzione che restituiva true o false...

bhe fatecciamoci tutti un vero favore, ammettiamo la scomparsa di questa utility e mettiamoci il cuore in pace.

Ormai è un anno che ho risolto quest'annoso problema, realizzandomi una classe statica, che mi porto sempre
con me .. ha dentro un sacco di cose perfettamente "OLD STYLE" ma non muoino mai e tornano sempre comode

public static bool IsNumeric (string dataValue)
{
try
{
int test = Convert.ToInt32(dataValue);
return true;
}
catch
{
return false;
}
}



Certo è vero avrei dovuto chiamarla isInt32... è vero... ma con tre righe di codice .. quante te ne risolvi ??
Più easy di così ... !!

WMI... WI FI

Puo tornare comodo sapere come è messa la vostra connessione wi fi ... molti avranno da aggiungere che se l'icona sulla notify ha già il suo bel valore. O che posso accertarmi che la lucina sul portatile (led ;- ) blue si accesa...
Certo sono entrambi metodi validi, ma al fine tecnico come fa un applicativo a scoprirlo ???

Eccoci qui con un sorgente bello comodo comodo è già tagliato per essere infilato in un timer.

try
{
ObjectQuery query = new ObjectQuery("SELECT * FROM MSNdis_80211_ReceivedSignalStrength Where active = true");
ManagementScope scope = new ManagementScope("root\\wmi");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
string result = "";
foreach (ManagementObject obj in searcher.Get())
{
if ((bool)obj["Active"] == true)
{
result = (string)obj["Ndis80211ReceivedSignalStrength"].ToString();
return result;
}
}

}
catch (Exception ex)
{
return string.Empty;
}

Certo con wmi si possono ottenere molte informazioni importanti, il più è come gestirle ed essere sicuri di avere
l'adattatore connesso.

tr onmouseover

Mamma mia quanto sembra facile ... ma qunato a volte non lo è ...
So che tempo fa avevo pubblicato un po simile, sull'evento onItemDatabound, ma ho trovato un sistema un po più semplice.
Probabilmente non è efficissimo o non è velcissimo ma su grid paginate ha il suo bel ritorno.

Punto 1: il foglio di sitle.
Sembra una cosa da poco ma non lo è, ma se seguite questo esempietto vi ritroverete.

.Normal {font-family:Arial, Tahoma; font-size:10px; border:1px solid #acacaa;}
.Normal td { text-align:Center; border:1px solid #acacaa;}
.Normal th { text-align:Center; background:#dededa; border:1px solid #acacaa}
.trHL {background:Lime;}
.trN {background:transparent;}

Normal è assegnato alla grid,
trHL no (non per il momento)
trN no (non per il momento)

Tuttavia è necessario comprendere che tutto quello che vi serve nelle celle (td) deve essere dato alla GRIGLIA e
non allo stile Td.

Punto 2: il codice js.
Il tutto funziona e ha senso se e solo se nel tr aggiungete questi due attributi..
onmouseover="this.className='trHL'"
onmouseout="this.className='trN'"

Il this non tralasicatelo perchè il mouse over e il mouse out sono eventi della Griglia, (this) a cui andreanno cambiati
gli attributi. Chiaro è che se li si rumuovno ci si ritova un risultato inatteso.. non VA.

Punto 3: il codice c#
is ponga che :

dataPresentation >> è una grid view
DataSource();>> è un metodo che associa una DataTable al dataSource della dataPresentation...
questo frammento debba essere inserito o nella load della pagina che contine la grid

dataPresentation.AutoGenerateColumns = false;
DataSource();

for (int i = 0; i < dataPresentation.Rows.Count; i++)
{
dataPresentation.Rows[i].Attributes.Add("onmouseover","this.className='trHL'" );
dataPresentation.Rows[i].Attributes.Add("onmouseout", "this.className='trN'");
}

Assicuratevi inoltre che la grid abbia un numero di elementi per pagina più o meno basso...

Chiaro che un for da 1 a 25 .. o 120 o 200 è sempre un for... ma è inutile lasciare un utente in attesa
per una gigioneria.