You can put treeView control in a Modal Window changing few lines of code:
dimecres, 21 de setembre del 2011
diumenge, 18 de setembre del 2011
Lightswitch TreeView Custom Control
Deprecated: GO TO http://beutil.blogspot.com.es/2012/04/lightswitch-custom-control-tree-loojup.html
------------------------------------------
I have wrote 2 kinds of trees; lookup tree and screen tree.
First one is intended to replace combo lookup and the second to manage a large data tree.
You can download source code.
Thanks to Karol Zadora
Screen shots:
Lookup tree:
Screen Tree
------------------------------------------
I have wrote 2 kinds of trees; lookup tree and screen tree.
First one is intended to replace combo lookup and the second to manage a large data tree.
You can download source code.
Thanks to Karol Zadora
Screen shots:
Lookup tree:
dimarts, 26 de juliol del 2011
Si els cotxes els dissenyessim els informàtics
Una empresa d'automòbils vol dotar als seus vehicles d'un sistema automàtic d'encesa de llums quan les circumstàncies ambientals així ho requereixin.
L'informàtic aplica la enginyeria informàtica que ha aprés. Decideix fer la fase d'anàlisi. Aquí no hi ha usuari així que passem directament a la normativa legal vigent:
ARTÍCULO 100. Alumbrado de largo alcance o carretera
1. Todo vehículo equipado con luz de largo alcance o carretera que circule a más de 40 kilómetros por hora, entre el ocaso y la salida del sol, fuera de poblado, por vías insuficientemente iluminadas ....
... 3. Se entiende por vía insuficientemente iluminada aquella en la que, con vista normal, en algún punto de su calzada, no pueda leerse la placa de matricula a 10 metros o no se distinga un vehículo pintado de oscuro a 50 metros de distancia.
Ja està clar:
While clauEnContacte() {
bool noLlegeixPlaca = comprovaPlacaCotxeDavant( 10 );
bool noVeigVehicleFosc = ! hiHaVehicleFosc( 50 );
cotxe.llumsEncessos = noLlegeixPlaca || noVeigVehicleFoscA50metres;
}
L'informàtic aplicant la seva lògica informàtica, decideix prescindir de la segona condició, per què? Si ets informàtic ja ho sabràs i si no ho ets t'ho explico: perquè no pot discernir entre que el vehicle no hi sigui o no el vegi (i per tant a de portar els llums encesos a no ser que hi hagi un vehicle fosc a menys de 50 metres). Com veieu també ha decidit parametritzar els metres (10 i 50) per si canvia la normativa.
While clauEnContacte() {
bool noLlegeixPlaca = comprovaPlacaCotxeDavant(10);
cotxe.llumsEncessos = noLlegeixPlaca;
}
Llavors decideix que s'ha d'esforçar més en la primera condició: ha ce comprovar si realment aconsegueix llegir [ al menys una matrícula | totes les matricules ] dels cotxes a menys de 10 metres:
bool comprovaPlacaCotxeDavant( int metres, bool comprovaTotsElsCotxes )
L'informàtic anota la necessitats mínimes de programari i maquinari:
* Linux
* Pentium IV amb 2 gigas de RAM
* Motion (per fer la foto de les matrícules)
* gcc (Compilador de C)
* OpenCV
La idea és la següent:
El motion captura una imatge d'alguna cosa que es mogui, un procés escrit amb C aïlla els cotxes i les matrícules gràcies a la llibreria OpenCV (http://blog.damiles.com/2008/11/basic-ocr-in-opencv/). Amb aquesta mateixa llibreria podem saber la distància del cotxe per la mida de les lletres de la matrícula.
Motion ---> Imatge ---> OpenCV ---> matricula.txt
L'informàtic se n'adona que el procés triga una mica així que decideix fer-lo asíncron:
//Prototipus
void callbackMatricula( bool noLlegeixPlaca );
...
while clauEnContacte() {
comprovaPlacaCotxeDavant( callbackMatricula );
}
void callbackMatricula( bool noLlegeixPlaca ) {
cotxe.llumsEncessos = noLlegeixPlaca;
}
Per últim l'informàtic se n'adona que està sempre donant per bona la lectura de l'OCR. Llavors amplia les especificacions de maquinari i programari:
* Modem i targeta 3g.
* Oracle 11g.
Crea un servi de captchas on són els propis usuaris Internet qui validen les matrícules dels cotxes. Per tant, a cada lectura li posa un Id i quan rep la lectura de l'OCR la compara amb la lectura del Captcha.
L'informàtic crea els serveis Web necessaris per pujar matrícula i comprovar matrícula.
L'informàtic amplia l'algorisme:
void comprovaPlacaCotxeDavant( void *callbackMatricula ) {
foto = recull_foto_motion();
GUID id = system.GUID.newGuid();
strMatricula = openCV_matricula( foto );
oracle( "insert into matricules( id, resultatCatcha, resultatOCR) values ('%1',Null,'%2')", id, strMatricula );
pujaMatriculaCatcha( id, matricula, callbackMatriculaCatcha );
}
void callbackMatriculaCatcha( int id, strMatricula ) {
recorset = Oracle( "Select * from matricules where id='%1' and resultatOCR='%2'", id, strMatricula);
callbackMatricula( recorset == Nil );
}Conclusió: No falleu els catches o provocareu un accident per enlluernament.
L'informàtic aplica la enginyeria informàtica que ha aprés. Decideix fer la fase d'anàlisi. Aquí no hi ha usuari així que passem directament a la normativa legal vigent:
ARTÍCULO 100. Alumbrado de largo alcance o carretera
1. Todo vehículo equipado con luz de largo alcance o carretera que circule a más de 40 kilómetros por hora, entre el ocaso y la salida del sol, fuera de poblado, por vías insuficientemente iluminadas ....
... 3. Se entiende por vía insuficientemente iluminada aquella en la que, con vista normal, en algún punto de su calzada, no pueda leerse la placa de matricula a 10 metros o no se distinga un vehículo pintado de oscuro a 50 metros de distancia.
Ja està clar:
While clauEnContacte() {
bool noLlegeixPlaca = comprovaPlacaCotxeDavant( 10 );
bool noVeigVehicleFosc = ! hiHaVehicleFosc( 50 );
cotxe.llumsEncessos = noLlegeixPlaca || noVeigVehicleFoscA50metres;
}
L'informàtic aplicant la seva lògica informàtica, decideix prescindir de la segona condició, per què? Si ets informàtic ja ho sabràs i si no ho ets t'ho explico: perquè no pot discernir entre que el vehicle no hi sigui o no el vegi (i per tant a de portar els llums encesos a no ser que hi hagi un vehicle fosc a menys de 50 metres). Com veieu també ha decidit parametritzar els metres (10 i 50) per si canvia la normativa.
While clauEnContacte() {
bool noLlegeixPlaca = comprovaPlacaCotxeDavant(10);
cotxe.llumsEncessos = noLlegeixPlaca;
}
Llavors decideix que s'ha d'esforçar més en la primera condició: ha ce comprovar si realment aconsegueix llegir [ al menys una matrícula | totes les matricules ] dels cotxes a menys de 10 metres:
bool comprovaPlacaCotxeDavant( int metres, bool comprovaTotsElsCotxes )
L'informàtic anota la necessitats mínimes de programari i maquinari:
* Linux
* Pentium IV amb 2 gigas de RAM
* Motion (per fer la foto de les matrícules)
* gcc (Compilador de C)
* OpenCV
La idea és la següent:
El motion captura una imatge d'alguna cosa que es mogui, un procés escrit amb C aïlla els cotxes i les matrícules gràcies a la llibreria OpenCV (http://blog.damiles.com/2008/11/basic-ocr-in-opencv/). Amb aquesta mateixa llibreria podem saber la distància del cotxe per la mida de les lletres de la matrícula.
Motion ---> Imatge ---> OpenCV ---> matricula.txt
L'informàtic se n'adona que el procés triga una mica així que decideix fer-lo asíncron:
//Prototipus
void callbackMatricula( bool noLlegeixPlaca );
...
while clauEnContacte() {
comprovaPlacaCotxeDavant( callbackMatricula );
}
void callbackMatricula( bool noLlegeixPlaca ) {
cotxe.llumsEncessos = noLlegeixPlaca;
}
Per últim l'informàtic se n'adona que està sempre donant per bona la lectura de l'OCR. Llavors amplia les especificacions de maquinari i programari:
* Modem i targeta 3g.
* Oracle 11g.
Crea un servi de captchas on són els propis usuaris Internet qui validen les matrícules dels cotxes. Per tant, a cada lectura li posa un Id i quan rep la lectura de l'OCR la compara amb la lectura del Captcha.
L'informàtic crea els serveis Web necessaris per pujar matrícula i comprovar matrícula.
L'informàtic amplia l'algorisme:
void comprovaPlacaCotxeDavant( void *callbackMatricula ) {
foto = recull_foto_motion();
GUID id = system.GUID.newGuid();
strMatricula = openCV_matricula( foto );
oracle( "insert into matricules( id, resultatCatcha, resultatOCR) values ('%1',Null,'%2')", id, strMatricula );
pujaMatriculaCatcha( id, matricula, callbackMatriculaCatcha );
}
void callbackMatriculaCatcha( int id, strMatricula ) {
recorset = Oracle( "Select * from matricules where id='%1' and resultatOCR='%2'", id, strMatricula);
callbackMatricula( recorset == Nil );
}
dissabte, 23 de juliol del 2011
Silverlight Application Navigation "Menú"
Al fer una nova solució Silverlight Application Navigation l'IDE ens prepara un projecte amb un petit menú amb dues Opcions: Home i About.
Si la nostra aplicació no té gaires 'pages' en podem tenir prou, però si en té moltes llavors necessitem un menú.
Una manera fàcil de fer un menú és amb un TabControl:
Per fer-ho cal:
A la MainPage.xaml posar els HiperLinkButtons dins un TabControl:
Modificar el codi MainPage.xalm.vb per tal que busqui els HyperLinkButtons dins el TabControl:
Private Sub ContentFrame_Navigated(ByVal sender As Object, ByVal e As NavigationEventArgs) Handles ContentFrame.Navigated
Dim i = TabItemTaulesMestre.Content
'Poso tots els links en una única llista
Dim uiList As New List(Of UIElement)
For Each tabItem In TabControlMenu.Items
Dim tab = DirectCast(tabItem, TabItem)
Dim GridItem = DirectCast(tab.Content, System.Windows.Controls.Grid)
Dim linkStackPanelItem = DirectCast(GridItem.Children.Item(0), System.Windows.Controls.StackPanel)
For Each child As UIElement In linkStackPanelItem.Children
uiList.Add(child)
Next
Next
For Each child As UIElement In uiList
Dim hb As HyperlinkButton = TryCast(child, HyperlinkButton)
If hb IsNot Nothing AndAlso hb.NavigateUri IsNot Nothing Then
If hb.NavigateUri = e.Uri Then
VisualStateManager.GoToState(hb, "ActiveLink", True)
Else
VisualStateManager.GoToState(hb, "InactiveLink", True)
End If
End If
Next
End Sub
Algú coneix una alternativa millor?
Penseu que aquestes estructures clàssiques de menús han de ser substituïdes per un altre tipus de navegació?
Si la nostra aplicació no té gaires 'pages' en podem tenir prou, però si en té moltes llavors necessitem un menú.
Una manera fàcil de fer un menú és amb un TabControl:
Per fer-ho cal:
A la MainPage.xaml posar els HiperLinkButtons dins un TabControl:
Modificar el codi MainPage.xalm.vb per tal que busqui els HyperLinkButtons dins el TabControl:
Private Sub ContentFrame_Navigated(ByVal sender As Object, ByVal e As NavigationEventArgs) Handles ContentFrame.Navigated
Dim i = TabItemTaulesMestre.Content
'Poso tots els links en una única llista
Dim uiList As New List(Of UIElement)
For Each tabItem In TabControlMenu.Items
Dim tab = DirectCast(tabItem, TabItem)
Dim GridItem = DirectCast(tab.Content, System.Windows.Controls.Grid)
Dim linkStackPanelItem = DirectCast(GridItem.Children.Item(0), System.Windows.Controls.StackPanel)
For Each child As UIElement In linkStackPanelItem.Children
uiList.Add(child)
Next
Next
For Each child As UIElement In uiList
Dim hb As HyperlinkButton = TryCast(child, HyperlinkButton)
If hb IsNot Nothing AndAlso hb.NavigateUri IsNot Nothing Then
If hb.NavigateUri = e.Uri Then
VisualStateManager.GoToState(hb, "ActiveLink", True)
Else
VisualStateManager.GoToState(hb, "InactiveLink", True)
End If
End If
Next
End Sub
Algú coneix una alternativa millor?
Penseu que aquestes estructures clàssiques de menús han de ser substituïdes per un altre tipus de navegació?
divendres, 22 de juliol del 2011
Gran concurs: Troba les 8 diferències
Silverlight 4: "The remote server returned an error: NotFound."
Quan hi ha un problema de comunicació de les WCF, el client ens informa amb aquest error:
"The remote server returned an error: NotFound."
Es tracta d'un error genèric, no és que haguem escrit malament el nom del servei al que ens volem connectar ni res d'això.
Per trobar l'error real cal posar configurar el tracing, això es fa tocant el 'web.config'.
Al meu cas m'he trobat amb aquest error:
"The InnerException message was 'Maximum number of items that can be serialized or deserialized in an object graph is '65536'."
El cas és que passava sense contemplacions del servidor al client tota la taula de la base de dades, que sembla ser grossa. Per passar-la cal serialitzar-la abans i això provocava l'error.
Com que el que jo estic carregant en realitat és un arbre el que he fet ha estat tocar el domain service i crear dos serveis nous - Jo això ho volia evitar perquè a cada moment estic posant noves taules dins l'EF i per tant haig de regenerar els fitxers (cosa que fins ara feia borrant-los i creant-los de nou i ara ja no serà tant directe). El primer dels dos serveis que he creat és per carregar els nodes arrel:
Public Function GetVEconomia_unitatsDArrel() As IQueryable(Of VEconomia_unitatsD)
Dim r = From x In ObjectContext.VEconomia_unitatsD.Include("unitatChildren")
Where (x.IdPare = 0)
Select x
Return r
End Function
I el segon per carregar els fills d'un node:
És important recordar que si volem passar els objectes de negoci associats a un objecte de negoci hem de decorar el metadata amb l'anotació include:
<Include()>
Public Property unitatChildren As EntityCollection(Of VEconomia_unitatsD)
Després d'això l'únic que he hagut de fer és carregar les dades de manera recursiva. Primer he carregat els nodes arrel i a partir d'allà la resta de l'arbre:
Partial Public Class vwParUnitats2CentresDeCost
Inherits Page
Dim CActx As New CADomainContext()
Dim unitatsTree As New List(Of VEconomia_unitatsD)
Dim loadOperationUnitats As LoadOperation(Of VEconomia_unitatsD)
Public Sub New()
InitializeComponent()
Dim q3 = CActx.GetVEconomia_unitatsDArrelQuery()
loadOperationUnitats = CActx.Load(Of VEconomia_unitatsD)(q3)
AddHandler loadOperationUnitats.Completed, AddressOf loadOperationUnitats_Completed
End Sub
Private Sub loadOperationUnitats_Completed(ByVal sender As Object, ByVal e As EventArgs)
Dim llista = directcast(sender, loadoperation(of VEconomia_unitatsD) ).Entities.ToList
If llista.Any AndAlso llista.First.IdPare = 0 Then
unitatsTree = llista
TreeViewUnitats.DataContext = unitatsTree
End If
For Each item In llista
For Each fill In item.unitatChildren
Dim q2 = CActx.GetVEconomia_unitatsDChildQuery(fill.IdUnitat)
loadOperationUnitats = CActx.Load(Of VEconomia_unitatsD)(q2)
AddHandler loadOperationUnitats.Completed, AddressOf loadOperationUnitats_Completed
Next
Next
End Sub
I aquest és el nostre bricoconsejo per avui. No us deixeu la rebobinada.
Una darrera reflexió: algú podria pensar que fora més interessant anar carregant els nodes amb lazy load a mesura que els expandim. Segurament té raó, però no per aquest cas, perquè necessito tot l'arbre carregat perquè la lògica de negoci em fa que hagi de mostrar la situació de diferents nodes de l'arbre a mesura que em pregunten per diferents objectes de negoci. Ah! Per fer el IsSelected hauré de fer servir la funció ContainerFromItem.
També pots augmentar la mida del maxItemsInObjectGraph:
http://social.msdn.microsoft.com/Forums/en-NZ/wcf/thread/f408be56-6983-4c1c-8275-aae9c73ab2d6
"The remote server returned an error: NotFound."
Es tracta d'un error genèric, no és que haguem escrit malament el nom del servei al que ens volem connectar ni res d'això.
Per trobar l'error real cal posar configurar el tracing, això es fa tocant el 'web.config'.
Al meu cas m'he trobat amb aquest error:
"The InnerException message was 'Maximum number of items that can be serialized or deserialized in an object graph is '65536'."
El cas és que passava sense contemplacions del servidor al client tota la taula de la base de dades, que sembla ser grossa. Per passar-la cal serialitzar-la abans i això provocava l'error.
Com que el que jo estic carregant en realitat és un arbre el que he fet ha estat tocar el domain service i crear dos serveis nous - Jo això ho volia evitar perquè a cada moment estic posant noves taules dins l'EF i per tant haig de regenerar els fitxers (cosa que fins ara feia borrant-los i creant-los de nou i ara ja no serà tant directe). El primer dels dos serveis que he creat és per carregar els nodes arrel:
Public Function GetVEconomia_unitatsDArrel() As IQueryable(Of VEconomia_unitatsD)
Dim r = From x In ObjectContext.VEconomia_unitatsD.Include("unitatChildren")
Where (x.IdPare = 0)
Select x
Return r
End Function
I el segon per carregar els fills d'un node:
Public Function GetVEconomia_unitatsDChild(ByVal id As Integer) As IQueryable(Of VEconomia_unitatsD)
Dim r = From x In ObjectContext.VEconomia_unitatsD.Include("unitatChildren")
Where (x.IdPare = id)
Select x
Return r
End Function
És important recordar que si volem passar els objectes de negoci associats a un objecte de negoci hem de decorar el metadata amb l'anotació include:
<Include()>
Public Property unitatChildren As EntityCollection(Of VEconomia_unitatsD)
Després d'això l'únic que he hagut de fer és carregar les dades de manera recursiva. Primer he carregat els nodes arrel i a partir d'allà la resta de l'arbre:
Partial Public Class vwParUnitats2CentresDeCost
Inherits Page
Dim CActx As New CADomainContext()
Dim unitatsTree As New List(Of VEconomia_unitatsD)
Dim loadOperationUnitats As LoadOperation(Of VEconomia_unitatsD)
Public Sub New()
InitializeComponent()
Dim q3 = CActx.GetVEconomia_unitatsDArrelQuery()
loadOperationUnitats = CActx.Load(Of VEconomia_unitatsD)(q3)
AddHandler loadOperationUnitats.Completed, AddressOf loadOperationUnitats_Completed
End Sub
Private Sub loadOperationUnitats_Completed(ByVal sender As Object, ByVal e As EventArgs)
Dim llista = directcast(sender, loadoperation(of VEconomia_unitatsD) ).Entities.ToList
If llista.Any AndAlso llista.First.IdPare = 0 Then
unitatsTree = llista
TreeViewUnitats.DataContext = unitatsTree
End If
For Each item In llista
For Each fill In item.unitatChildren
Dim q2 = CActx.GetVEconomia_unitatsDChildQuery(fill.IdUnitat)
loadOperationUnitats = CActx.Load(Of VEconomia_unitatsD)(q2)
AddHandler loadOperationUnitats.Completed, AddressOf loadOperationUnitats_Completed
Next
Next
End Sub
I aquest és el nostre bricoconsejo per avui. No us deixeu la rebobinada.
Una darrera reflexió: algú podria pensar que fora més interessant anar carregant els nodes amb lazy load a mesura que els expandim. Segurament té raó, però no per aquest cas, perquè necessito tot l'arbre carregat perquè la lògica de negoci em fa que hagi de mostrar la situació de diferents nodes de l'arbre a mesura que em pregunten per diferents objectes de negoci. Ah! Per fer el IsSelected hauré de fer servir la funció ContainerFromItem.
També pots augmentar la mida del maxItemsInObjectGraph:
http://social.msdn.microsoft.com/Forums/en-NZ/wcf/thread/f408be56-6983-4c1c-8275-aae9c73ab2d6
dimecres, 20 de juliol del 2011
Llenguatge Informàtic
Fa uns mesos un col·lega em feia la següent consulta:
"magradaria veure les pelis que tinc al portàtil per la tele, ho puc fer?".
Li vaig dir que sí, però que m'ensenyés el portàtil i em descrigués la tv primer. Vaig veure que pel seu cas la solució més senzilla era amb un cable d-sub 15 com a la imatge:
Jo mateix li vaig aconseguir el cable d'un monitor vell.
A l'endemà em vaig trobar el col·lega, de seguida li vaig detectar la mirada de 'alguna cosa no va anar bé'. Així que vaig tenir temps de pensar que podia haver fallat i preparar la resposta.
Efectivament el col·lega em diu: "El cable que em vas passar va perfecte, ja puc veure la peli per la tele, però no se sent res. Saps que pot ser?"
La resposta va ser ràpida:
"Bé, si recordes, em vas dir que volies veure pelis, no que les volguessis escoltar."
Naturalment després li vaig dir que necessitava el segon cable:
De vegades els informàtics apliquem la solució directa al problema que ens proposa l'usuari sense qüestionar-nos quin és realment el problema que hem de solucionar.
"magradaria veure les pelis que tinc al portàtil per la tele, ho puc fer?".
Li vaig dir que sí, però que m'ensenyés el portàtil i em descrigués la tv primer. Vaig veure que pel seu cas la solució més senzilla era amb un cable d-sub 15 com a la imatge:
Jo mateix li vaig aconseguir el cable d'un monitor vell.
A l'endemà em vaig trobar el col·lega, de seguida li vaig detectar la mirada de 'alguna cosa no va anar bé'. Així que vaig tenir temps de pensar que podia haver fallat i preparar la resposta.
Efectivament el col·lega em diu: "El cable que em vas passar va perfecte, ja puc veure la peli per la tele, però no se sent res. Saps que pot ser?"
La resposta va ser ràpida:
"Bé, si recordes, em vas dir que volies veure pelis, no que les volguessis escoltar."
Naturalment després li vaig dir que necessitava el segon cable:
De vegades els informàtics apliquem la solució directa al problema que ens proposa l'usuari sense qüestionar-nos quin és realment el problema que hem de solucionar.
"ContainerFromItem returns null" (or Nothing)
"ContainerFromItem returns null" (or Nothing) v.s. "Puedo quedarme embarazada con la regla":
Molts amics quan em troben pel carrer m'aturen i em dieun:
Quan treballo amb un treeView (o un listView) de silverlight i vull obtenir el container d'un node m'apareix l'error: "ContainerFromItem returns null"
Potser penseu que estic fent broma, però fixeu-vos que realment és un error molt habitual:
60Mil resultats que podem comparar-los amb altres cerques:
Anem a solucionar-ho, jo només m'hi he passat 3 hores per trobar quin és el motiu.
I no és un motiu, són dos:
1) En primer lloc, quan des d'un objecte X invoquem el mètode ContainerFromItem només busca els Items fills de l'objecte X.
Solució: Doncs cal invocar ContainerFromItem a l'objecte contenidor pare de l'objecte de negoci del qual volem el contenidor (ContenidorPare.ItemContainerGenerator) . Però, com obting el contenidor del pare? Doncs invocant el mètode ContainerFromItem al seu contenidor pare .... i així fins al node arrel on coneixem el contenidor pare que és conegut: TreeViewX.ItemContainerGenerator. LLavors cal usar recursió:
Solució:
Primer: Expandir el pare:
Dim ccP = ContainerFromItem(objecteDeNegoci.parent)
ccP.IsExpanded = True
ccP.Visibility = Windows.Visibility.Visible
Segon: Forçar que es repinti. (Hi ha solucions alternatives amb events i tal)
ccP.UpdateLayout()
Ara ja estem en condicions de demanar el contenidor del fill:
Dim ccO = ContainerFromItem(objecteDeNegoci)
ccO.IsSelected = True
Si teniu dubtes de que als nodes pares no tinguin contenidor llavors heu de modificar el nostre mètode ContainerFromItem per tal que vagi expandir i fent UpdateLayout dels nodes intermitjos:
Bé, espero que ja no us trobeu més amb aquest problema (ni amb l'altre). Si és així, please, deixa un comentari.
Molts amics quan em troben pel carrer m'aturen i em dieun:
Quan treballo amb un treeView (o un listView) de silverlight i vull obtenir el container d'un node m'apareix l'error: "ContainerFromItem returns null"
Potser penseu que estic fent broma, però fixeu-vos que realment és un error molt habitual:
Anem a solucionar-ho, jo només m'hi he passat 3 hores per trobar quin és el motiu.
I no és un motiu, són dos:
1) En primer lloc, quan des d'un objecte X invoquem el mètode ContainerFromItem només busca els Items fills de l'objecte X.
Solució: Doncs cal invocar ContainerFromItem a l'objecte contenidor pare de l'objecte de negoci del qual volem el contenidor (ContenidorPare.ItemContainerGenerator) . Però, com obting el contenidor del pare? Doncs invocant el mètode ContainerFromItem al seu contenidor pare .... i així fins al node arrel on coneixem el contenidor pare que és conegut: TreeViewX.ItemContainerGenerator. LLavors cal usar recursió:
Public Function ContainerFromItem(ByVal item As objecteDeNegoci) As TreeViewItem
Dim containerThatMightContainItem As TreeViewItem
If IsNothing( item.parent ) Then
containerThatMightContainItem = DirectCast(TreeViewX.ItemContainerGenerator.ContainerFromItem(item), TreeViewItem)
Else
Dim containerItemPare = ContainerFromItem(item.parent)
containerThatMightContainItem = DirectCast(containerItemPare.ItemContainerGenerator.ContainerFromItem(item), TreeViewItem)
End If
Return containerThatMightContainItem
End Function
2) Tot i que ja sabem baixar pels contenidors fins al nostre objecte de negoci, pot ser que encara el seu contenidor sigui Null, a que és degut? Doncs a que FINS QUE NO ES PINTA UN NODE NO SE LI CREA CONTENIDOR. Aleshores cal que estiguis segur que el node s'ha pintat:Solució:
Primer: Expandir el pare:
Dim ccP = ContainerFromItem(objecteDeNegoci.parent)
ccP.IsExpanded = True
ccP.Visibility = Windows.Visibility.Visible
Segon: Forçar que es repinti. (Hi ha solucions alternatives amb events i tal)
ccP.UpdateLayout()
Ara ja estem en condicions de demanar el contenidor del fill:
Dim ccO = ContainerFromItem(objecteDeNegoci)
ccO.IsSelected = True
Si teniu dubtes de que als nodes pares no tinguin contenidor llavors heu de modificar el nostre mètode ContainerFromItem per tal que vagi expandir i fent UpdateLayout dels nodes intermitjos:
Public Function ContainerFromItem(ByVal item As objecteDeNegoci) As TreeViewItem
Dim containerThatMightContainItem As TreeViewItem
If IsNothing( item.parent ) Then
containerThatMightContainItem = DirectCast(TreeViewX.ItemContainerGenerator.ContainerFromItem(item), TreeViewItem)containerThatMightContainItem.IsExpanded = True containerThatMightContainItem.UpdateLayout()
Else
Dim containerItemPare = ContainerFromItem(item.parent)
containerThatMightContainItem = DirectCast(containerItemPare.ItemContainerGenerator.ContainerFromItem(item), TreeViewItem)
End If
Return containerThatMightContainItem
End FunctionBé, espero que ja no us trobeu més amb aquest problema (ni amb l'altre). Si és així, please, deixa un comentari.
dimecres, 23 de març del 2011
LOE i LOGSE a la FP: anar lent per complir amb l'horari.
Fa uns dies llegir a la Vanguardia una carta al director, un usuari es queixava que el bus anava molt lent. Un cap de mobilitat argumentava el motiu: el bus va lent perquè ha de complir amb l'horari. Això és el que m'està passant amb la LOE. Vaig lent perquè estic compromès a un calendari, com que al cicle el temps és constant, haig de rebaixar l'espai. No deixa de ser una paradoxa.
Un Cicle Formatiu és una inversió: 2 anys d'estudis a canvi de capacitacions per a realitzar una feina.
Penso que amb el currículum LOE els alumnes no obtindran tant de rendiment a la seva inversió. Per què? Per la compartició de coneixements en Unitats Formatives (UF).
Les UF són com minicursets. Una unitat formativa pot durar entre 30 i 100 hores. La mitjana serien unes 40 hores. Un cop superada la UF el reconeixement és de per vida, no cal superar tot el MP (MP és un mòdul professional que seria una assignatura).
Com aprenen base de dades els alumnes de ASIX (Administració de Sistemes Informàtics i Xarxes)? Doncs el temari de BDD éstà dividit en dos MP (Mòduls Professionals) i cada MP està dividit en varies UF (Disseny, DML, DCL, ... són UF).
Origen del problema: cal que el professor determini a l'inici de curs quin dia i hora comença i acaba cada UF. Això provoca 'fragmentació interna' de coneixements.
Aquest curs ha estat el primer que he impartit formació segons la LOE. Tot això que he explicat ho veia avenir, però no m'ho volia creure, m'he estavellat amb la realitat. Em resisteixo a baixar el nivell, tant pels alumnes que ja tenen el títol (que seran comparats amb els nous) com pels que no el tenen (que s'hauran perdut matèria que potser un dia hauran de menester). Naturalment estic pensant les formules per compensar la retallada (en profunditat) del temari: tenir material que em permeti que els alumnes entenguin el mateix en menys temps, preparar material d'auto-aprenentatge, fomentar el treball en equip a través de forums i pensar cada dia com fer per a què anant més lents aprenguin el mateix o més.
Per últim comentar que el disseny d'aquest aprenentatge no és gratuït. S'ha fet així per tal que els estudiants tinguin més facilitat per entrar i sortir del sistema educatiu. Caldrà valorar si els avantatges superen els inconvenients.
Us deixo amb la carta del bus lent:
"Hay que ver el empeño con el que el servicio de autobuses de Mataró trabaja para que cada mañana el usuario redescubra rincones, revise las palmeras en un trayecto de diez a veinte minutos hacia la Renfe. Agradezco ese amor urbano por mostrar calzadas y demás, pero uno se halla inserto en la película El sol de membrillo, y no por la belleza, sino por la lentitud. El renqueante carromato en forma de autobús que demora el viaje hasta el infarto, ¿no se puede acelerar? Autoridades municipales, suban al autobús, compruébenlo. La cámara lenta en el transporte matutino es demasiado. ¿Será verdad que lo importante es el camino y no la meta?"
MARC BAYÉS, MATARÓ
LA RESPUESTA
Garantir seguretat i horaris
"L´empresa Mataró Bus té establerts uns horaris de pas per garantir la puntualitat. Els conductors tenen definits uns procediments entre els quals hi ha la forma de conducció, que ha de ser el més suau possible, alhora que han de mantenir una velocitat comercial constant per assegurar que arribin puntuals a totes les parades. En aquest sentit, els conductors compleixen tant les normes de circulació com les establertes per l´empresa, amb la finalitat de garantir la seguretat dels usuaris i el compliment dels horaris. Altrament, a l´enquesta sobre la qualitat del servei realitzada al novembre de 2010 els usuaris van valorar molt positivament aquest servei i li van atorgar una puntuació de 7,74 sobre 10."
NÚRIA AGUILAR
Regidora de Mobilitat Ajunt. Mataró
Un Cicle Formatiu és una inversió: 2 anys d'estudis a canvi de capacitacions per a realitzar una feina.
Penso que amb el currículum LOE els alumnes no obtindran tant de rendiment a la seva inversió. Per què? Per la compartició de coneixements en Unitats Formatives (UF).
Les UF són com minicursets. Una unitat formativa pot durar entre 30 i 100 hores. La mitjana serien unes 40 hores. Un cop superada la UF el reconeixement és de per vida, no cal superar tot el MP (MP és un mòdul professional que seria una assignatura).
Com aprenen base de dades els alumnes de ASIX (Administració de Sistemes Informàtics i Xarxes)? Doncs el temari de BDD éstà dividit en dos MP (Mòduls Professionals) i cada MP està dividit en varies UF (Disseny, DML, DCL, ... són UF).
Origen del problema: cal que el professor determini a l'inici de curs quin dia i hora comença i acaba cada UF. Això provoca 'fragmentació interna' de coneixements.
Aquest curs ha estat el primer que he impartit formació segons la LOE. Tot això que he explicat ho veia avenir, però no m'ho volia creure, m'he estavellat amb la realitat. Em resisteixo a baixar el nivell, tant pels alumnes que ja tenen el títol (que seran comparats amb els nous) com pels que no el tenen (que s'hauran perdut matèria que potser un dia hauran de menester). Naturalment estic pensant les formules per compensar la retallada (en profunditat) del temari: tenir material que em permeti que els alumnes entenguin el mateix en menys temps, preparar material d'auto-aprenentatge, fomentar el treball en equip a través de forums i pensar cada dia com fer per a què anant més lents aprenguin el mateix o més.
Per últim comentar que el disseny d'aquest aprenentatge no és gratuït. S'ha fet així per tal que els estudiants tinguin més facilitat per entrar i sortir del sistema educatiu. Caldrà valorar si els avantatges superen els inconvenients.
Us deixo amb la carta del bus lent:
Mataró a cámara lenta
"Hay que ver el empeño con el que el servicio de autobuses de Mataró trabaja para que cada mañana el usuario redescubra rincones, revise las palmeras en un trayecto de diez a veinte minutos hacia la Renfe. Agradezco ese amor urbano por mostrar calzadas y demás, pero uno se halla inserto en la película El sol de membrillo, y no por la belleza, sino por la lentitud. El renqueante carromato en forma de autobús que demora el viaje hasta el infarto, ¿no se puede acelerar? Autoridades municipales, suban al autobús, compruébenlo. La cámara lenta en el transporte matutino es demasiado. ¿Será verdad que lo importante es el camino y no la meta?"
MARC BAYÉS, MATARÓ
LA RESPUESTA
Garantir seguretat i horaris
"L´empresa Mataró Bus té establerts uns horaris de pas per garantir la puntualitat. Els conductors tenen definits uns procediments entre els quals hi ha la forma de conducció, que ha de ser el més suau possible, alhora que han de mantenir una velocitat comercial constant per assegurar que arribin puntuals a totes les parades. En aquest sentit, els conductors compleixen tant les normes de circulació com les establertes per l´empresa, amb la finalitat de garantir la seguretat dels usuaris i el compliment dels horaris. Altrament, a l´enquesta sobre la qualitat del servei realitzada al novembre de 2010 els usuaris van valorar molt positivament aquest servei i li van atorgar una puntuació de 7,74 sobre 10."
NÚRIA AGUILAR
Regidora de Mobilitat Ajunt. Mataró
dimecres, 16 de març del 2011
Comptabilitat Analítica per a universitat.
Aquest és el meu projecte actual: Comptabilitat analítica per a una universitat catalana.
Ara està en fase maqueta. Deixo captura de imputació de costos. Més endavant vindran els indicadors.
La tecnologia que hi ha per sota és SSAS i per sobre Tableau.
Ara està en fase maqueta. Deixo captura de imputació de costos. Més endavant vindran els indicadors.
La tecnologia que hi ha per sota és SSAS i per sobre Tableau.
Subscriure's a:
Missatges (Atom)














