Como incluir cambios de línea en los Tooltips

Hoy como es huelga general en España, un truco rapidito para que no nos tachen de esquiroles 😛


Los Tooltips son esas etiquetas flotantes que aparecen cuando dejas el cursor del ratón unos instantes parado encima de algún control de tu aplicación, y que normalmente te dan información contextual interesante sobre el mismo:


TooltipMultiLinea


Son muy útiles en las aplicaciones Windows Forms, pero ¿Cómo podemos hacer para que un Tooltip se muestre como el de la figura anterior, es decir, en varias líneas?


Lo primero que cabría pensar es que podríamos poner un “n” como se hace en las constantes de cadena de C#, así:



NotifyIcon1.Text = “DOTNET4nInternet access”;


Pero no funciona y veríamos realmente ese “n” en el texto.


La solución es concatenarle en cada cambio de línea la constante: Environment.NewLine con lo que quedaría algo así:



NotifyIcon1.Text = “DOTNET4” + Environment.NewLine + “Internet access”;


¡Listo!


Con esto conseguirás Tooltips como los de la figura superior, mucho más cómodos de leer.


¡Espero que te sea útil!


ACTUALIZACIÓN (media hora después):


Me dicen Vicenç y Jonsu por separado (uno en JASoft.org y el otro en Geeks.ms) que funciona si le pones r como caracter de escape. funciona perfectamente gracias. La verdad es que no se me ocurrió (a veces se me ocurre lo más complicado siempre).


Si ya digo yo que no es bueno postear en día de huelga y además fuera de lo mío que es ASP.NET… Pero como estoy haciendo una app Windows para variar y surgió este tema… 🙂


Gracias a los dos!

La mejor forma de aprender a programar

No nos andemos con rodeos: la mejor forma de aprender a programar es programando. Es más, yo diría que es la única forma de aprender de verdad a hacerlo.


Esto puede parecer una perogrullada, algo obvio. Sin embargo no lo es tanto si examinamos detenidamente de qué manera aprende programación un porcentaje muy elevado de personas.


Muchos aspirantes a aprender un lenguaje de programación, tecnología o entorno nuevos lo que hacen es recibir clase en un aula.


Que quede claro que estoy hablando todo el tiempo de gente con poca o nula experiencia real en la tecnología concreta que está intentando aprender.


Ir a un centro a formarnos -o que los docentes vengan a nuestra empresa- tiene la principal ventaja de ser muy cómodo para el que se forma. En un tiempo reducido se reciben de manera condensada muchos conocimientos. Esto puede estar bien y ser lo más adecuado si ya tenemos mucha experiencia y queremos aprender rápidamente los fundamentos de una tecnología “para saber por dónde pisamos”. También si el objeto del estudio es sumamente concreto y lo que aprendemos es de aplicación directa a nuestro trabajo diario o a un proyecto.


Pero cuando estamos en un aula  lo que estamos haciendo es atender a un profesor, tratar de hacer rápidamente las prácticas que nos indique, e intercambiar preguntas -en el momento- con el docente. Éste tiene que repartir su atención además entre otras 10 o 12 personas que siguen el mismo curso (por regla general no es económicamente rentable hacer grupos de menor tamaño de 10 personas).


Además tenemos un tiempo limitado. Si el curso es de 30 horas docentes a realizar en una semana, tendremos 6 horas de clase cada día (con sus correspondientes descansos e ineficiencias de grupo), y ¿después qué? ¿Qué pasa al terminar?: pues generalmente que a partir de ese momento estaremos “solos ante el peligro”. Durante los días que dura el curso se nos somete a un bombardeo de información que no tendremos forma de asimilar y madurar en tan poco tiempo. Además es muy probable que no tengamos tampoco tiempo de practicar lo aprendido en solitario, más allá de los ejemplos guiados del aula.


¿Alguien cree seriamente que, sin ser un programador experimentado, uno se puede preparar para ser programador profesional en cualquier tecnología con 30 horas de clase? ¿Y presentarse y aprobar una certificación oficial?


Yo digo que difícilmente.


El cono de Dale


Edgar Dale fue un pedagogo estadounidense conocido por su famoso cono de la experiencia. Estudió las diversas formas de aprendizaje para analizar la profundidad de retención que se conseguía con cada una. Reflejó los resultados de su estudio en un Cono o Pirámide del aprendizaje que revela claramente la efectividad de cada método.


Esta es mi interpretación (con PowerPoint, no doy para más) del famoso Cono de Dale:


 Cono_de_Dale
Pulsa para aumentar


Cada franja del cono representa una forma de aprender. Las etiquetas de la izquierda muestran acciones que se realizan habitualmente cuando estamos aprendiendo programación (leer un libro, asistir a clase…) y  las de la derecha reflejan el porcentaje de efectividad de cada una de estas acciones.


Como vemos lo más efectivo es, claro está, el hacer uno mismo lo que está intentando aprender. Para ello, primero, necesitamos adquirir unas nociones previas mediante lectura, visionado de demostraciones prácticas, etc…


La mejor metodología de aprendizaje


Según lo anterior, creo firmemente que la mejor forma de aprender es la que he representado en el diagrama de flujo siguiente:


 SecuenciaAprendizajeTIC
Pulsa para aumentar


En una formación normal de aula disponemos de las partes superiores de la pirámide del aprendizaje, es decir, leer, oír, ver y oír + ver. Pero es mucho más difícil que tengamos las partes correspondientes a la base, que son las realmente efectivas.


Estas actividades de la base de la pirámide, bien hechas, serían las que están dentro del recuadro grande en el diagrama, y son inherentemente cíclicas: es un bucle del que no deberíamos salir hasta haber practicado lo suficiente.


Y esta es nuestra responsabilidad, no la del profesor. Sin mucho trabajo propio es imposible aprender bien, por muy bueno que sea el docente. El profesor en esta fase debe ser un apoyo para ayudarnos con las dudas que nos tienen que surgir necesariamente al practicar. Sin dudas no hay aprendizaje.


El problema para ejecutar la parte del bucle en un aula es el tiempo. Ni más ni menos. Por eso un curso técnico impartido en un aula es difícil que nos llegue a calar lo suficiente como para decir que estamos preparados.


e-Learning


Consideremos ahora el mismo curso que, en lugar de ser en un aula, lo recibimos on-line, a través de contenidos en una plataforma de e-Learning y con el apoyo de un tutor para resolver dudas y poder plantearle discusiones.


En la plataforma tendrías un material formativo teórico constituido por texto+imágenes, así como vídeos o demostraciones demostrando lo anterior en la práctica. Podremos volver sobre ellos tantas veces como queramos, sin tener que perdernos ningún detalle. Es importante que este material separe el grano de la paja, ofreciendo información relevante y ordenada que te sirva como guía durante el aprendizaje. Internet está lleno de material que podemos usar para aprender, pero es muy difícil encontrarle un hilo, una coherencia, por eso esta parte reviste una especial importancia.


Por otro lado no estamos supeditados a unas horas concretas para aprender, practicar o preguntar. Tenemos mucho tiempo para repetir el ciclo del aprendizaje práctico del diagrama anterior y fijar los conceptos.


Surgirán dudas. Estas dudas las tendremos que preguntar formulándolas de una manera bastante precisa, pues no es lo mismo que decirlas a la cara de palabra, y esto es otra forma más de aprendizaje, pues nos obligará a reflexionar y concretar los detalles de la tecnología.


El tutor contestará las dudas al mismo tiempo que seguimos practicando y/o estudiando en paralelo. No interrumpes el estudio (el tuyo y el de los demás) como en un aula donde las dudas son síncronas, ya que on-line la comunicación suele ser asíncrona (mensajería, foros). La excepción son casos muy particulares que puedan requerir de un diálogo en directo para una duda concreta difícil de resolver (chat, videoconferencia).


Este ciclo de aprendizaje práctico y auto-estudio guiado es el que considero que es más efectivo para aprender cualquier disciplina técnica.


Una vez que tienes las bases claras usando esta metodología, te han proporcionado en realidad los fundamentos para que puedas volar por tu cuenta, nutriéndote de los vastos repositorios de información que existen en Internet.


¿Y tú qué vas a decir, si te dedicas a eso?


Alguno a estas alturas estará pensando que, dado que mi empresa se dedica en gran parte a la formación on-line de programadores ¿qué voy a decir yo?


Sin embargo la cuestión es justo al revés: mi empresa se dedica con especial hincapié a la formación on-line para programadores precisamente porque creemos en que es la mejor manera de aprender este tipo de disciplinas. Por supuesto también impartimos formación presencial, pero en menor cuantía, y verdaderamente considero que en algunas materias o con determinado tipo de gente -ya experimentada- puede ser más rápida, y muy efectiva también.




Por supuesto, la formación on-line no será efectiva si no hay un compromiso y un interés por parte del alumno, e insistimos mucho sobre ello en los papeles de metodología que le enviamos a los alumnos al empezar un curso. Pero es que es la única manera.


Me consta que hay muchísima gente por ahí que han tenido malas experiencias con la formación on-line. Es más, a nosotros nos vienen bastantes “rebotados” de otros proveedores, lo cual es una suerte puesto que lo normal sería que no quisieran volver a saber nada de formación on-line, dada la mala experiencia previa.


El hecho de que la formación on-line no sea todavía la principal vía de formación de los programadores en particular y los técnicos en general no deja de llamarme la atención, puesto que, por todo lo expuesto, el e-learning tutelado de calidad es sin duda el método más efectivo y rentable de aprender.


Y tú ¿Qué opinas de todo esto? ¿qué experiencia has tenido con la formación on-line?


Me interesará mucho saberlo.

OrderedDictionary vs Dictionary

Hoy, en el curso de preparación del examen 70-536, ha surgido la siguiente duda:

¿OrderedDictionary sólo se diferencia respecto a Dictionary, en qué se puede tener acceso además de por clave también por índice, o existe alguna otra diferencia mayor?

La verdad es que OrderedDictionary es un mal nombre para los programadores de habla hispana, porque hay la tendencia a pensar que ordena los elementos, cuando en realidad se refiere a que los guarda por el orden en que se han introducido con el método Add.  Un diccionario que ordene sus elementos es un SortedDictionary de tipo genérico.

Así, si escribimos un código similar a este:

using System;
using System.Collections;
using System.Collections.Specialized;

public class Prueba
{
	public static void Main()
	{
		OrderedDictionary od = new OrderedDictionary();
	    od.Add("05", "Cinco");
		od.Add("02", "Dos");
		od.Add("03", "Tres");
		od.Add("04", "Cuatro");
		od.Add("01", "Uno");
		
		Console.WriteLine("Iterar como si fuera una matriz");
	    for (int i = 0; i < od.Count; i++)
        {
          string s = (string) od[i];
          Console.WriteLine(s);
      }

	  Console.WriteLine("Iterar como si fuera un Diccionario");
      foreach(DictionaryEntry de in od)
      {
        Console.WriteLine(de.Value);
      }
		Console.ReadLine();
	}
}

En realidad lo que obtenemos por pantalla es la lista de elementos en el orden en el que fueron introducidos, no una lista ordenada por la clave o el valor, como podríamos pensar.

Aunque se apellida “Dictionary” no es igual que un diccionario puesto que, de hecho, almacena los datos de dos formas distintas, como un HashTable (para parecerse a un diccionario) y como un ArrayList para parecerse a una matriz. También mantiene dos formas de enumerar (una como pares de clave/valor y la otra como un enumerador normal para matrices, por posición).

Si usamos .NET Reflector para examinar su implementación se ve muy claramente.

En esta captura vemos destacados el HashTable y el ArrayList, los enumeradores, y la implementación del método Add que añade el elemento a ambas colecciones:

OrderedDictionary
Pulsa para agrandar

 

¡Espero que te resulte útil!

Videojuegos 3D renderizados en la nube

Hace alrededor de año y medio escribía en este mismo blog acerca de “una idea loca” sobre la que había leído. Se trataba de la posibilidad de crear super-computadores gráficos albergados en la nube de forma que sirvieran gráficos 3D renderizados en tiempo real (y ahí está lo impresionante) a dispositivos que no tienen la capacidad suficiente. Un ejemplo: teléfonos móviles o aparatos semi-tontos enchufados a una televisión normal.


La idea es que el terminal simplemente envía a los servidores las pulsaciones de teclado o pantalla, los servidores gráficos renderizan en tiempo real los gráficos resultantes de esas interacciones, y el terminal se limita a visualizar dichas imágenes. El resto del tiempo se repite este bucle. A mi personalmente me parece increíble conseguir esto con la tecnología actual, y sobre todo con las redes actuales (y por lo que parece peor aún con las futuras), ya que estamos hablando de imágenes de alta calidad y movimientos a 30 o 50 frames por segundo. En el post reseñado antes lo comentaba con más detalle.


El caso es que año y medio después me tengo que tragar mis palabras y hablar del servicio OnLive. Es más, el servicio se hizo público más o menos en la misma época que escribí aquel post, pero no lo he conocido hasta ahora 🙁


OnLive


Se trata exactamente de lo mismo que describo en los párrafos anteriores. Un servicio que renderiza los juegos en un servidor y tu software cliente se limita a enviar pulsaciones y mostrar imágenes. Incluso van a lanzar en breve una micro-consola para conectar a la televisión que es ese terminal tonto que describía antes. Los juegos que ofrecen no tienen nada que envidiar a los de una consola como XBox 360 o Playstation 3.


El modelo de negocio está muy claro. De hecho mucho más claro que el de cualquier otra empresa on-line de las que pululan por ahí: vender suscripciones y acceso a juegos.



· Te cobran una cantidad pequeña todos los meses por el derecho a acceder al servicio, lo cual es fantástico a mi entender ya que la tendencia actual sería que no te cobraran por eso. Pro ya se sabe, la gente paga por las cosas serias y jugar se ve que lo son 😉
· Además cobran por acceder a cada juego. Hay pases para jugar durante 3 o 5 días, o para tener acceso para siempre al juego en cuestión. La mayoría sólo admiten el acceso ilimitado (más caro). Los precios en este caso van desde 9.99$ hasta los 39.99$.


Otra cuestión importante es que, aunque los requerimientos de hardware son mínimos porque el render e hace en remoto, los requerimientos de la conexión a Internet no son bajos tampoco. Se requieren al menos 3Mbps de ancho de banda garantizados para poder jugar, pero se recomiendan por lo menos 5Mbps, ya que todos los juegos son HD. La velocidad de subida no importa demasiado porque se envían datos mínimos a los servidores. Este ancho de banda no es un problema con la mayor parte de los ADSL o cable, pero como quieras hacer más cosas a la vez la cosa ya empieza a complicarse, y desde luego en el rural no cuentes con acceder pues lo único que suele haber son conexiones de 1 Mbps (de velocidad máxima). De todos modos en las ciudades no debería ser un gran problema.


Un problema para la empresa es que, como ellos mismos dicen jocosamente, no han logrado encontrar la forma de superar la velocidad de la luz, y por lo tanto la distancia a la que pueden estar los usuarios de los Data Center que sirven los gráficos es de un máximo de unas mil millas (unos 1600 kilómetros). De esta forma necesitan 3 Data Center diferentes para cubrir la mayor parte de los EEUU, ya que de otro modo el retraso sería demasiado grande como para que los gráficos fueran fluidos.


ol_coverage


Así que olvídate de jugar desde Europa u otros lugares. Como mucho si estás en México.


La propia empresa dice que ha estado haciendo pruebas en Europa y que las conexiones aquí van mejor todavía, así que probablemente los veremos asomar la cabeza pronto por estos lares…


¿Es sostenible el modelo de negocio?


La inversión de esta empresa debe ser enorme sólo para poder arrancar. Y no creo que puedan usar servicios en la nube normales, estilo Amazon EC2, Google AppEngine o Microsoft Windows Azure, ya que su especialización requerirá sin duda dispositivos hardware adecuados (tarjetas gráficas). pero la inversión no es sólo en hardware ya que en este caso se trata de crear aplicaciones software (supongo que basadas en CUDA) que son más caras de desarrollar que cualquier otra cosa más convencional que vemos por ahí. Seguramente el dinero para esta inversión inicial no ha sido un problema, teniendo en cuenta que tienen detrás nada menos que a Steve Perlman (creador de WebTV comprada por Microsoft, y Quicktime, perteneciente ahora a Apple) y su empresa Rearden Companies, que tiene otras filiales como Mova que hace efectos especiales para todo el mundo del cine.


Lo que me parece más complicado es que la gente pague por un servicio como este. La cuota mensual es muy baja, sí, pero con el precio que tiene una consola PS2 actualmente la amortizas en un año de cuotas seguramente. Además, los juegos tienen un precio similar o incluso más caro al de esos mismos juegos en una tienda. Por ejemplo Assasins Creed II cuesta 39.99$ en OnLive, y entre 29.95$ (versión PC) y 38.99$ (versión XBox 360) en Amazon.


Entonces ¿qué te lleva a comprar esos juegos en lugar de invertir en una consola propia?. Pues imagino que lo de la inmediatez y el no tener que pagar por adelantado el dinero que te cuesta una consola alta de gama.


Aún así, teniendo en cuenta las limitaciones de distancia, ¿Habrá gamers suficientes en esas áreas que se puedan pagar una conexión de banda ancha pero que, al mismo tiempo, no estén dispuestos a invertir los 199.99$ a 299.99$ que cuesta una XBox 360?


Esto no es un Twitter que varios años más tarde aún no tienen claro cómo van a ganar dinero. Estoy seguro de que lo han calculado bien y los números salen. Además no soy aficionado al mundo de los juegos – de toda la vida soy un verdadero negado para los juegos- así que quizá me equivoque con la apreciación sobre la gente ya que no sé qué les mueve.


Pero el negocio, tanto por lo osado de su tecnología como por el modelo en sí, tan tradicional, me han llamado mucho la atención y  me gustaría recibir comentarios al respecto


Y tú ¡qué opinas?

Usando foreach con un diccionario genérico

Lo habitual cuando tenemos una colección o un enumerable de cualquier tipo es recorrer sus elementos usando un bucle de tipo foreach.


Sin embargo, cuando usamos una colección genérica de tipo System.Collections.Generic.IDictionary, como por ejemplo Dictionary<TKey,TValue> o SortedList<TKey,TValue>, (que son super-útiles en muchos casos) nos encontraremos con dificultades.


Si intentamos hacer algo como esto:

Dictionary dict = new Dictionary();
dict.Add(«Uno», 1);
dict.Add(«Dos», 2);
dict.Add(«Tres», 3);

foreach(int numero in dict)
{
Console.WriteLine(numero);
}


Descubriremos que obtenemos un error como este otro:



Cannot convert type ‘System.Collections.Generic.KeyValuePair<string,int>’ to ‘int’


En el ejemplo anterior definimos un diccionario genérico que va a llevar laves de tipo texto y que usaremos para almacenar números enteros.


El problema es que esta no es la forma correcta de iterar por colecciones genéricas que tengan pares de clave/valor.


La forma correcta de hacerlo es la siguiente:

foreach(KeyValuePair par in dict)
{
Console.WriteLine(«Clave: {0}», par.Key);
Console.WriteLine(«Valor: {0}», par.value);
}

De esta forma tendremos acceso para enumerar tanto la lista de claves como la de valores asociados a éstas.


El motivo es que el enumerador de los IDictionary devuelve tipos KeyValuePar particularizados para el tipo de diccionario que hayamos creado, por lo que para enumerarlo no nos queda más remedio que usar esta técnica.


¡Espero que te resulte útil!


Aprende .NET, Cursos on-line tutelados: 
·
Visual studio 2010 desde cero
· Preparación examen 70–536: Fundamentos de desarrollo con la plataforma .NET
· Fundamentos de la plataforma .NET 3.5 y Visual Studio 2005/2008

Archivos temporales de compilación de ASP.NET

Esta pregunta ha surgido hoy en uno de mis cursos de desarrollo Web y me ha parecido interesante para comentarla aquí.

Como es sabido ASP.NET Web Forms hace uso de una serie de archivos de código auto-generados para “mezclar” su código con las clases “code-beside” que contienen los eventos y el código que escribimos para los formularios Web, por medio del uso de clases parciales y herencia.

Nota: Por ejemplo, en la página Default.aspx, su archivo “code-beside” sería Default.aspx.cs o Default.aspx.vb en función de si programamos en C# o VB

Este código se genera dinámicamente al compilar el sitio Web y, en teoría, se almacena para hacer caché en la carpeta:

C:WindowsMicrosoft.NETFrameworkvx.y.zzzzTemporary ASP.NET Files

siendo x.y.zzzz la versión de la plataforma que tengamos instalada, que en caso de .NET 4.0 es “v4.0.30319” y en las demás versiones anteriores (2.0, 3.0 y 3.5) es “v2.0.50727” (ya he dicho muchas veces que las versiones 2.0, 3.0 y 3.5 son lo mismo a efectos de ASP.NET).

Los archivos tienen nombres aleatorios por lo que hay que andar mirando qué tiene cada uno dentro, pero en aplicaciones pequeñas es muy fácil localizar partes concretas y formularios específicos y ver qué se hace por debajo:

CodigoAutogeneradoASPNETArchivos 
Pulsa para aumentar

El caso es que si ejecutamos una aplicación Web desde Visual Studio resulta muy interesante echarle un vistazo a estos archivos para ver cómo funciona todo esto por debajo:

CodigoAutogeneradoASPNET
Pulsa para aumentar

Realmente lo que vemos ahí es el funcionamiento interno de los Web Forms. Se puede aprender mucho y recomiendo a mis alumnos que le echen un vistazo para ver cómo es.

¿Por qué mi carpeta “Temporary ASP.NET Files” está vacía?

El problema es que en Windows Vista y Windows 7 esto parece no funcionar y si vas a esta carpeta probablemente la encontrarás vacía. En Windows XP no hay problema en general.

El motivo es que esta carpeta se usa como caché de la compilación pero no es necesaria. Si no se puede acceder a ella por lo que sea la aplicación se compila en memoria de cada vez y punto.

En Windows Vista/7 aunque hayas accedido a tu equipo usando una cuenta de administrador, en realidad ejecutas los procesos con permisos recortados, por seguridad. Por eso cuando intentas hacer algo que requiere elevación de privilegios obtienes una preciosa ventanita modal de sistema que te pide autorización.

La carpeta de archivos temporales de ASP.NET necesita elevación de privilegios para poder escribir en ella. Si entras como administrador en la máquina y ejecutas Visual Studio simplemente pulsando en su acceso directo, en realidad lo estás ejecutando como un usuario sin privilegios administrativos. Por eso al compilar no te aparecen los archivos temporales en la carpeta, pues no tienes permisos.

Sin embargo, si ejecutas Visual Studio como administrador:

VS2010Administrador

Es decir, pulsas con el botón derecho en su acceso directo y eliges la opción de la figura.

En este caso tendrás acceso a la carpeta y verás como se guardan en ella los archivos temporales.

Échales un vistazo. Aprenderás un montón sobre el funcionamiento interno de ASP.NET.

Cambiar la carpeta temporal de ubicación

Si quieres puedes cambiar la ubicación de esta carpeta temporal a cualquier otra en tu disco duro, con otros permisos y por lo tanto accesible desde un usuario sin privilegios.

Para ello sólo tienes que usar el atributo tempDirectory del elemento compilation dentro de Web.config, por ejemplo:

<configuration>
   <system.web>
      <compilation tempDirectory=»C:TempASPNET»>
     </compilation>
   </system.web>
</configuration>

Con esto podrás tener más a mano los archivos a efectos de investigar y aprender. No lo recomiendo para aplicaciones de producción.

¡Espero que te sea útil!

Resolver el error “No se puede encontrar el tipo” al cargar un formulario con un control propio

Yo no programo demasiado para Windows Forms, ya sabéis que lo mío es más la Web. Pero últimamente estoy trabajando a los ratos en un proyecto que tienen una parte de visualización para escritorio hecha con esta tecnología. Como soy partidario de reutilizar al máximo, siempre encapsulo la funcionalidad todo lo que puedo, incluyendo funcionalidad de la interfaz de usuario. Por eso en este trabajo, tengo varios controles de usuario listos para arrastrar y soltar en cualquier formulario que los requiera.


El caso es que tras haber trasteado bastante con la interfaz, de repente algunos formularios me empezaron a fallar, mostrándome un error como el de la figura (yo trabajo con todo en inglés, incluidos los nombres de clases  y variables):


ErrorCargaControl1 
(la parte difusa lleva el nombre del control que no se carga y su espacio de nombres)


A pesar de que en el código del diseñador del formulario todo parecía estar bien y se reconoce el tipo del control y a pesar de que si ejecutas la aplicación los controles se muestran y funcionan perfectamente no hay manera de hacer que el formulario los muestre correctamente en tiempo de diseño…


La solución viene del lado más insospechado y es en las propiedades de compilación del proyecto. Aunque mi sistema es de 64 bits, Visual Studio 2010 (y por lo tanto sus diseñadores) sigue siendo una aplicación de 32 bits. En las propiedades del proyecto había cambiado la plataforma de destino para que fuera x64. Esto está bien para el modo “release”, es decir, para la versión final de la aplicación. Pero en modo depuración que es como trabajas normalmente con Visual Studio, si quieres que el entorno pueda sacar partido a todas sus funcionalidades debes compilar para 32 bits, es decir para x86.


Así que basta con ir a las propiedades del proyecto Windows Forms y en la pestaña “Build” asegurarte de que para depuración tienes x86 elegido:


ErrorCargaControl2


A partir de ese momento todos los controles volverán a funcionar en tiempo de diseño y los formularios volverán a cargar.


¡Espero que resulte útil!