Mudanza

Bueno, este tiempo sin publicar se ha debido a que estaba de mudanza. Me ha costado un poco de tiempo preparar el nuevo dominio (propio), el nuevo wordpress (propio), backup, restore, etc…..

Espero que no les cause mucha molestia cambiar favoritos y feeds. En este nuevo sitio espero poder ofrecer más servicios.

La nueva web la podéis encontrar en NetCódigo

Por cierto, FELIZ NAVIDAD a todos

Anuncios

Liberado SP1 de Visual Studio 2005

Hoy estamos de liberaciones. Microsoft ha liberado el primer service pack para las distintas versiones de Visual Studio 2005. A saber:

Con este service pack ya se soporta Windows Vista …
El documento (release notes) lo puedes encontrar aquí.

Creo que es todo.

ASP.NET AJAX 1.0 RC disponible

Microsoft ha liberado la primera release candidate de Ajax (la versión definitiva cada vez más cerca).
Entre las nuevas características que podemos encontrar se encuentra:

  • Soporte de globalización
  • Invocación dinámica de proxies para servicios web
  • Cambios en el namespace y assemblies para asegurar la compatibilidad entre Ajax 1.0 y el futuro Ajax 1.0 incluido en el futuro Orcas.

Se supone que la versión definitiva saldrá en enero e incluirá instalación sencilla para sistemas no windows.
Tambien se ha liberado ASP.NET AJAX Control Toolkit Released for ASP.NET AJAX RC (importante)

Aquí dejo los links de todo.

Bien esto parace que esto de las betas ha llegado a su final y llega el momento de la release definitiva.

Usar el UI (User Interface) de Office 2007

A partir de ahora Microsoft obliga a aquellos desarrolladores o empresas que vayan a utilizar el mismo UI que se usa en Office 2007, también conocido como RIBONX UI, a licenciarlo.

office-2007.jpg

Por lo que he leído, Microsoft ha pensado que si ha invertido tanto dinero en el desarrollo de esta interface, aquellos que quieran usarla deben seguir algunas pautas.
El licenciamiento es gratuito y perpetuo, salvo en aquellas aplicaciones que hagan competencia directa a la suite de Office 2007, a estas no se les otorgará la licencia. Además, se deberá seguir de manera estricta la guia de estilo de la interfaz de usuario de Office 2007 que Microsoft pone a nuestra disposición.

La verdad, no sé si Microsoft obra de la manera correcta. Hasta la fecha, siempre ha invertido mucho dinero en sus UI y nunca ha requirido licenciarlo, claro, hasta ahora nos podían denunciar por plagio o por lo que fuera. Si nos licencia, ya no podrá hacerlo (siempre que sigamos la guía).

Para más información visitar el sitio de Microsoft de Office UI Licensing.

WMI. Fuente inagotable de información

La definición de Microsoft de WMI es la que sigue. Instrumental de administración de Windows (WMI) es un componente del sistema operativo Windows que permite obtener acceso mediante programación a información de administración en un entorno empresarial. WMI en .NET Framework se basa en la tecnología WMI original y permite el mismo desarrollo de aplicaciones y proveedores, además de las ventajas que ofrece la programación en .NET Framework.
En mi opinión, WMI es espectacular. Cualquier información que queráis obtener de cualquier sistema windows, WMI la proporciona, desde el nombre del sistema operativo de una máquina, pasando por la memoria ram que tiene, las tarjetas de red, configuración de cualquier cosa del sistema, performance, servicios, tareas, services packs instalados, software instalado, etc. etc. etc….

La arquitectura de WMI consta de los niveles siguientes:

  • Los componentes de software cliente realizan operaciones mediante WMI, como leer detalles de administración, configurar sistemas y realizar suscripciones a eventos.
  • El administrador de objetos es un intermediario entre los proveedores y los clientes que proporciona ciertos servicios esenciales, como la publicación y suscripción estándar de eventos, el filtrado de eventos, motor de consultas y otros servicios.
  • Los componentes de software de proveedor capturan y devuelven datos activos a las aplicaciones cliente, procesan llamadas a métodos procedentes de los clientes y vinculan al cliente con la infraestructura que se está administrando.

A continuación muestro un pequeño ejemplo de cómo recuperar información con WMI y mostrarla en un treeview. Lo único extraño que pueden ver en el código es que no utilizo el TreeView que viene con Visual Studio sino uno de otro fabricante, simplemente lo he utilizado porque el de VS no permite retornos de carros, de resto todo normal. Simplemente recupero alguna información como nombre de máquina, microprocesador, video y discos. Pero ya digo, cualquier información del sistema se puede recuperar.

Código:

Public Class WMI

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
‘ RECOPILACION DE DATOS
Me.InformacionGeneral()
Me.Micro()
Me.Video()
Me.Discos()
Me.UltraTree1.ExpandAll()
End Sub
Private Sub InformacionGeneral()
‘ INFORMACION GENERAL

Try
Dim searcher As New ManagementObjectSearcher( _
“root\CIMV2”, _
“SELECT * FROM Win32_ComputerSystem”)

For Each queryObj As ManagementObject In searcher.Get()
Dim _Node As New Infragistics.Win.UltraWinTree.UltraTreeNode
_Node.Text = “Nombre PC:” & queryObj(“Name”).ToString & ControlChars.CrLf & _
“Fabricante:” & queryObj(“Manufacturer”).ToString & ControlChars.CrLf & _
“Modelo: ” & queryObj(“Model”).ToString & ControlChars.CrLf & _
“Tipo: ” & queryObj(“SystemType”).ToString & ControlChars.CrLf & _
“Memoria: ” & queryObj(“TotalPhysicalMemory”).ToString

Me.UltraTree1.Nodes(0).Nodes.Add(_Node)
Next
Catch err As ManagementException
MessageBox.Show(“Error recuperando información WMI: ” & err.Message)
End Try
End Sub
Private Sub Micro()
‘ MICROPROCESADOR
Try
Dim searcher As New ManagementObjectSearcher( _
“root\CIMV2”, _
“SELECT * FROM Win32_Processor”)

Dim _Cantidad As Byte
Dim _Node As New Infragistics.Win.UltraWinTree.UltraTreeNode

For Each queryObj As ManagementObject In searcher.Get()

_Node.Text = “Modelo:” & queryObj(“Name”).ToString & ControlChars.CrLf & _
“Velocidad:” & queryObj(“CurrentClockSpeed”).ToString & ” Mhz.” & ControlChars.CrLf
_Cantidad = +1
Next

_Node.Text = _Node.Text & “Cantidad: ” & _Cantidad.ToString
Me.UltraTree1.Nodes(1).Nodes.Add(_Node)

Catch err As ManagementException
MessageBox.Show(“Error recuperando información WMI: ” & err.Message)
End Try
End Sub

Private Sub Video()
‘ VIDEO
Try
Dim searcher As New ManagementObjectSearcher( _
“root\CIMV2”, _
“SELECT * FROM Win32_DisplayConfiguration”)

Dim _Node As New Infragistics.Win.UltraWinTree.UltraTreeNode

For Each queryObj As ManagementObject In searcher.Get()

_Node.Text = “Modelo:” & queryObj(“Caption”).ToString & ControlChars.CrLf & _
“Frecuencia:” & queryObj(“DisplayFrequency”).ToString & ControlChars.CrLf

Next

Me.UltraTree1.Nodes(2).Nodes.Add(_Node)

Catch err As ManagementException
MessageBox.Show(“Error recuperando información WMI: ” & err.Message)
End Try
End Sub
Private Sub Discos()
‘ DISCOS
Try
Dim searcher As New ManagementObjectSearcher( _
“root\CIMV2”, _
“SELECT * FROM Win32_DiskDrive”)

Dim _Node As New Infragistics.Win.UltraWinTree.UltraTreeNode

For Each queryObj As ManagementObject In searcher.Get()

_Node.Text = _Node.Text & “Nombre: ” & queryObj(“Caption”).ToString & ControlChars.CrLf & _
“Tipo:” & queryObj(“InterfaceType”).ToString & ControlChars.CrLf & _
“Particiones:” & queryObj(“Partitions”).ToString & ControlChars.CrLf

Next

Me.UltraTree1.Nodes(3).Nodes.Add(_Node)

Catch err As ManagementException
MessageBox.Show(“Error recuperando información WMI: ” & err.Message)
Catch err As Exception
End Try
End Sub
End Class

Si se fijan, lo único que hay que hacer es una query sobre la clase WMI que se quiere consultar. Y ahora se preguntarán, ¿como sabré qué clase es la que debo consultar para lo que yo quiero hacer? No hay problema, aparte de la documentación de MSDN Microsoft nos proporciona una herramienta que pueden bajarse aquí y que incluye todas las clases y objetos de WMI. Y no sólo eso sino además genera código VBScript, VB.Net y C# listo para usar.

Realmente creo que WMI es fantástico, yo, para controlar el hardware y software instalado en mi empresa, he desarrollado un servicio que se instala en las máquinas y que alimenta una base de datos informando de todo aquello que me interesa saber de mi parque informático. Ahora no tengo que ir máquina a máquina para saber que memoria tiene o por ejemplo saber cuan viejo es mi parque partiendo de los micros instalados. Antes lo llevaba en papel y relamente era inoperante.

Espero que les sirva.

WMI. Fuente inagotable de información

La definición de Microsoft de WMI es la que sigue. Instrumental de administración de Windows (WMI) es un componente del sistema operativo Windows que permite obtener acceso mediante programación a información de administración en un entorno empresarial. WMI en .NET Framework se basa en la tecnología WMI original y permite el mismo desarrollo de aplicaciones y proveedores, además de las ventajas que ofrece la programación en .NET Framework.
En mi opinión, WMI es espectacular. Cualquier información que queráis obtener de cualquier sistema windows, WMI la proporciona, desde el nombre del sistema operativo de una máquina, pasando por la memoria ram que tiene, las tarjetas de red, configuración de cualquier cosa del sistema, performance, servicios, tareas, services packs instalados, software instalado, etc. etc. etc….

La arquitectura de WMI consta de los niveles siguientes:

  • Los componentes de software cliente realizan operaciones mediante WMI, como leer detalles de administración, configurar sistemas y realizar suscripciones a eventos.
  • El administrador de objetos es un intermediario entre los proveedores y los clientes que proporciona ciertos servicios esenciales, como la publicación y suscripción estándar de eventos, el filtrado de eventos, motor de consultas y otros servicios.
  • Los componentes de software de proveedor capturan y devuelven datos activos a las aplicaciones cliente, procesan llamadas a métodos procedentes de los clientes y vinculan al cliente con la infraestructura que se está administrando.

A continuación muestro un pequeño ejemplo de cómo recuperar información con WMI y mostrarla en un treeview. Lo único extraño que pueden ver en el código es que no utilizo el TreeView que viene con Visual Studio sino uno de otro fabricante, simplemente lo he utilizado porque el de VS no permite retornos de carros, de resto todo normal. Simplemente recupero alguna información como nombre de máquina, microprocesador, video y discos. Pero ya digo, cualquier información del sistema se puede recuperar.

Código:

Public Class WMI

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
‘ RECOPILACION DE DATOS
Me.InformacionGeneral()
Me.Micro()
Me.Video()
Me.Discos()
Me.UltraTree1.ExpandAll()
End Sub
Private Sub InformacionGeneral()
‘ INFORMACION GENERAL

Try
Dim searcher As New ManagementObjectSearcher( _
“root\CIMV2”, _
“SELECT * FROM Win32_ComputerSystem”)

For Each queryObj As ManagementObject In searcher.Get()
Dim _Node As New Infragistics.Win.UltraWinTree.UltraTreeNode
_Node.Text = “Nombre PC:” & queryObj(“Name”).ToString & ControlChars.CrLf & _
“Fabricante:” & queryObj(“Manufacturer”).ToString & ControlChars.CrLf & _
“Modelo: ” & queryObj(“Model”).ToString & ControlChars.CrLf & _
“Tipo: ” & queryObj(“SystemType”).ToString & ControlChars.CrLf & _
“Memoria: ” & queryObj(“TotalPhysicalMemory”).ToString

Me.UltraTree1.Nodes(0).Nodes.Add(_Node)
Next
Catch err As ManagementException
MessageBox.Show(“Error recuperando información WMI: ” & err.Message)
End Try
End Sub
Private Sub Micro()
‘ MICROPROCESADOR
Try
Dim searcher As New ManagementObjectSearcher( _
“root\CIMV2”, _
“SELECT * FROM Win32_Processor”)

Dim _Cantidad As Byte
Dim _Node As New Infragistics.Win.UltraWinTree.UltraTreeNode

For Each queryObj As ManagementObject In searcher.Get()

_Node.Text = “Modelo:” & queryObj(“Name”).ToString & ControlChars.CrLf & _
“Velocidad:” & queryObj(“CurrentClockSpeed”).ToString & ” Mhz.” & ControlChars.CrLf
_Cantidad = +1
Next

_Node.Text = _Node.Text & “Cantidad: ” & _Cantidad.ToString
Me.UltraTree1.Nodes(1).Nodes.Add(_Node)

Catch err As ManagementException
MessageBox.Show(“Error recuperando información WMI: ” & err.Message)
End Try
End Sub

Private Sub Video()
‘ VIDEO
Try
Dim searcher As New ManagementObjectSearcher( _
“root\CIMV2”, _
“SELECT * FROM Win32_DisplayConfiguration”)

Dim _Node As New Infragistics.Win.UltraWinTree.UltraTreeNode

For Each queryObj As ManagementObject In searcher.Get()

_Node.Text = “Modelo:” & queryObj(“Caption”).ToString & ControlChars.CrLf & _
“Frecuencia:” & queryObj(“DisplayFrequency”).ToString & ControlChars.CrLf

Next

Me.UltraTree1.Nodes(2).Nodes.Add(_Node)

Catch err As ManagementException
MessageBox.Show(“Error recuperando información WMI: ” & err.Message)
End Try
End Sub
Private Sub Discos()
‘ DISCOS
Try
Dim searcher As New ManagementObjectSearcher( _
“root\CIMV2”, _
“SELECT * FROM Win32_DiskDrive”)

Dim _Node As New Infragistics.Win.UltraWinTree.UltraTreeNode

For Each queryObj As ManagementObject In searcher.Get()

_Node.Text = _Node.Text & “Nombre: ” & queryObj(“Caption”).ToString & ControlChars.CrLf & _
“Tipo:” & queryObj(“InterfaceType”).ToString & ControlChars.CrLf & _
“Particiones:” & queryObj(“Partitions”).ToString & ControlChars.CrLf

Next

Me.UltraTree1.Nodes(3).Nodes.Add(_Node)

Catch err As ManagementException
MessageBox.Show(“Error recuperando información WMI: ” & err.Message)
Catch err As Exception
End Try
End Sub
End Class

Si se fijan, lo único que hay que hacer es una query sobre la clase WMI que se quiere consultar. Y ahora se preguntarán, ¿como sabré qué clase es la que debo consultar para lo que yo quiero hacer? No hay problema, aparte de la documentación de MSDN Microsoft nos proporciona una herramienta que pueden bajarse aquí y que incluye todas las clases y objetos de WMI. Y no sólo eso sino además genera código VBScript, VB.Net y C# listo para usar.

Realmente creo que WMI es fantástico, yo, para controlar el hardware y software instalado en mi empresa, he desarrollado un servicio que se instala en las máquinas y que alimenta una base de datos informando de todo aquello que me interesa saber de mi parque informático. Ahora no tengo que ir máquina a máquina para saber que memoria tiene o por ejemplo saber cuan viejo es mi parque partiendo de los micros instalados. Antes lo llevaba en papel y relamente era inoperante.

Espero que les sirva.

Mantener la posición en un Treeview con ASP.Net y ASP.Net Ajax después de un postback

En este post veremos como mantener a la vista la posición actual de un nodo elegido en un treeview después de que este ha sido seleccionado y que por lo tanto se produce un postback.

Lo he traducido en parte y creo que mejorado de un artículo que leí en developer.com

Si no se han dado cuenta, después de elegir un nodo en el treeview y al producirse dicho postback, el treeview vuelve a a posicionarse en el primer nodo superior del mismo, si el elegido no cabe en pantalla, pues ¿que sucedera?, pues que no se verá.

Veremos como solucionarlo tanto con ASP.Net como con ASP.Net Ajax.
Lo lograremos gracias a ejecutar un código javascript cada vez que se realice el postback.

 Veamos primero dos imágenes que muestran lo que sucede sin dicho código javascript.

Después de elegir nodo se reposiciona el treeview en su lado superior.

ASP.Net
El código asp.net es bien sencillo, simplemente ponemos el treeview dentro de un panel y en la sección body cargamos el script en cuestión.

<body onload=”CargarScriptLoad()”>
<form id=”form1″ runat=”server”>
<div>
<asp:Panel ID=”Panel1″ runat=”server”>
<asp:TreeView ID=”TreeView1″ runat=”server”>
</asp:TreeView>
</asp:Panel>
</div>
</form>

Y en el codebehind.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
‘ CARGA TODOS LOS EVENTOS DE INICIO
Me.CargarEventosInicio()

If Me.Page.IsPostBack Then Return

Me.RellenarTreeView()
End Sub

Public Sub CargarEventosInicio()
Me.SriptsLoad()
End Sub
Private Sub RellenarTreeView()
‘ RELLENA TREEVIEW DE EJEMPLO
Me.TreeView1.Nodes.Clear()

Dim _Nodo1 As New TreeNode(“Nodo 1”)
Me.TreeView1.Nodes.Add(_Nodo1)
Dim _Nodo2 As New TreeNode(“Nodo 2”)
Me.TreeView1.Nodes.Add(_Nodo2)
Dim _Nodo3 As New TreeNode(“Nodo 3”)
Me.TreeView1.Nodes.Add(_Nodo3)
Dim _Nodo4 As New TreeNode(“Nodo 4”)
Me.TreeView1.Nodes.Add(_Nodo4)
Dim _Nodo5 As New TreeNode(“Nodo 5”)
Me.TreeView1.Nodes.Add(_Nodo5)

Dim I As Integer
For I = 1 To 70
_Nodo1.ChildNodes.Add(New TreeNode(“Nodo 1/ ” + I.ToString()))
_Nodo2.ChildNodes.Add(New TreeNode(“Nodo 2/” + I.ToString()))
_Nodo3.ChildNodes.Add(New TreeNode(“Nodo 3/” + I.ToString()))
_Nodo4.ChildNodes.Add(New TreeNode(“Nodo 4/” + I.ToString()))
_Nodo5.ChildNodes.Add(New TreeNode(“Nodo 5/” + I.ToString()))
Next

Me.TreeView1.CollapseAll()

End SubPublic Sub SriptsLoad()

Dim _Script As New StringBuilder

‘ SCRIPT PARA POSICIONAR TREEVIEW EN EL SELECCIONADO
_Script.Append(“function CargarScriptLoad()”)
_Script.Append(“{{“)
_Script.Append(“try”)
_Script.Append(“{{“)
_Script.Append(“var elem = document.getElementById(‘{0}_SelectedNode’);”)
_Script.Append(“if(elem != null )”)
_Script.Append(“{{“)
_Script.Append(“var node = document.getElementById(elem.value);”)
_Script.Append(“if(node != null)”)
_Script.Append(“{{“)
_Script.Append(“node.scrollIntoView(true);”)
_Script.Append(“{1}.scrollLeft = 0;”)
_Script.Append(“}}”)
_Script.Append(“}}”)
_Script.Append(“}}”)
_Script.Append(“catch(oException)”)
_Script.Append(“{{}}”)
_Script.Append(“}}”)
_Script.Append(“”)
_Script.Append(“”)

Me.Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), “EventoLoad_1”,String.Format(_Script.ToString, TreeView1.ClientID, Panel1.ClientID), True)
End Sub

Esto es todo, quizás lo más complicado de entender es el javascript, realmente lo único que hace es crear una función, que trabaja con el elemento seleccionado del treeview, y mueve el scroll del panel hasta la posición correcta.

ASP.Net Ajax
En ASP.Net Ajax el codebehind es exactamente igual, lo único que cambia es la adición de un scriptmanager, el updatepanel, el contentpanel y el trigger correspondiente.

<body onload=”CargarScriptLoad()”>
<form id=”form1″ runat=”server”>
<asp:ScriptManager ID=”ScriptManager1″ runat=”server” />

<div>
<asp:UpdatePanel ID=”UpdatePanel1″ runat=”server”>
<ContentTemplate>
<asp:Panel ID=”Panel1″ runat=”server”>
<asp:TreeView ID=”TreeView1″ runat=”server”>
</asp:TreeView>
</asp:Panel>
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID=”TreeView1″ />
</Triggers>
</asp:UpdatePanel>
</div>

</form>
</body>

Resultado final.

Bueno, espero haberme explicado.