Archivo de la categoría: SomeCode

Un Listado muy chapado a la antigua

Muchos de los que nos acostumbramos al uso de ‘Printer.Print’ en visual Basic 6, padecemos de ciertas dificultades para adaptarnos al nuevo uso de ‘PrintDocument’.

Con la intención de responder a numerosas preguntas sobre el tema y facilitar esas transiciones que finalmente nos aportan un montón de beneficios, me complace compartir con vosotros este pequeño ejemplo de cómo generar un listado usando el ‘moderno’ PrintDocument, dandole un estilo muy chapado a la antigua J.

Espero que os sea útil!

©Pep Lluis

‘Este ejemplo se ha compilado con la versión Beta 1 del compilador FW 4.0, aunque no tendréis dificultad alguna en adaptar el concepto a cualquier versión anterior del framework.

Imports System.Drawing.Printing

Public Class Form1
    ‘Crear el PrintDocument
    Private ListadoDeArticulos As New PrintDocument
    ‘Simulación tabla de Artículos
    Private Articulos As New DataTable(«Articulos»)

    Private Sub Form1_Load() Handles MyBase.Load

        ‘Función de imprimir paginas
        AddHandler ListadoDeArticulos.PrintPage, AddressOf Me.ImprimirListado

       
        ‘ Simular tabla Artículos
       
        Articulos.Columns.Add(«Codigo»)
        Articulos.Columns.Add(«Descripcion»)
        Articulos.Columns.Add(«Precio»)
        Articulos.Rows.Add(«001», «Resistencia 100ohms», «0,15»)
        Articulos.Rows.Add(«002», «Transistor 2n2234», «1,00»)
        Articulos.Rows.Add(«003», «Microprocesador Z80», «5,40»)
        Articulos.Rows.Add(«004», «UART 16C450», «3,45»)
        Articulos.Rows.Add(«005», «Resistencia 200ohms», «0,12»)
        Articulos.Rows.Add(«006», «Transistor 2n2222», «1,22»)
        

       ‘ Lanzar la ejecución del listado
        ListadoDeArticulos.Print()

    End Sub

 

    ‘Seleccionar la fuente para el listado
    Dim Fuente_Pagina As New Font(«Lucida Console», 10)
    ‘Fijar los márgenes Derecho / Izquierdo
    Dim Margen_Izquierdo As Single = 0
    Dim Margen_Superior As Single = 0
    ‘Controlar la posición Vertical/NºPagina
    Dim PosicionLinea As Single = 0
    Dim ContadorLinea As Single = 0
    Dim Numero_Pagina As Single = 1
    ‘Memorizar la posición en curso dentro del Dataset
    Dim Puntero As Single = 0

   
    ‘ Imprimir el Listado de Artículos
   
    Sub ImprimirListado(ByVal sender As Object, ByVal Pagina As PrintPageEventArgs)

        ‘Ajustes para el Control de Pagina
        Dim Lineas_Pagina As Single = Pagina.MarginBounds.Height / Fuente_Pagina.GetHeight(Pagina.Graphics)
        ContadorLinea = 0
        Margen_Izquierdo = Pagina.MarginBounds.Left
        Margen_Superior = Pagina.MarginBounds.Top

        ‘Cabecera del Listado
        ImprimirUnaLinea(Pagina, «Electronica NAVI»)
        ImprimirUnaLinea(Pagina, «Listado de Artículos sin ningún orden ni concierto»)
        ImprimirUnaLinea(Pagina, «Vic (Barcelona) a fecha : « + DateTime.Now + » ,Pagina : « + Numero_Pagina.ToString)
        ImprimirUnaLinea(Pagina, «»)
        ImprimirUnaLinea(Pagina, «Código Descripción                                               Precio»)
        ImprimirUnaLinea(Pagina, «—— ——————————————————— ——–«)
        Dim Articulo As DataRow
        Dim Linea As String = Space(80)
       
        ‘Recorrer la tabla de artículos / imprimir una línea por fila
        For Indice As Single = Puntero To Articulos.Rows.Count – 1
            Articulo = Articulos.Rows(Indice)
            If ContadorLinea < Lineas_Pagina Then
                ‘posicionar la columna según item/articulo
                Mid(Linea, 2) = Articulo.Item(«Codigo»)
                Mid(Linea, 8) = Articulo.Item(«Descripcion»)
                Mid(Linea, 66) = Articulo.Item(«Precio»)
                ‘imprimir la linea
                ImprimirUnaLinea(Pagina, Linea)
            Else
                Exit For
            End If
        Next
        ‘Memorizar la posicion del primer artículo/siguiente Pagina
        Puntero = Articulos.Rows.IndexOf(Articulo)
       
        ‘Comprobar si existen artículos para listar
        If Puntero < Articulos.Rows.Count – 1 Then
            Numero_Pagina += 1          ‘Incrementar numero de página
            Pagina.HasMorePages = True  ‘SI tengo más paginas a imprimir
        Else
            ImprimirUnaLinea(Pagina, «—— ——————————————————— ——–«)
            Numero_Pagina = 1           ‘Numero de pagina a 1 (Para el proximo listado)
            Pagina.HasMorePages = False ‘No Tengo mas paginas para imprimir
        End If
    End Sub
   
    ‘ Imprimir una linea
   

   ‘Lambda para con el cálculo de la posición de la línea
    Dim Pos = Function() As Single
                Return Margen_Superior + ContadorLinea * Fuente_Pagina.GetHeight(Pagina.Graphics)
             
End Function

    Sub ImprimirUnaLinea(ByVal Pagina As PrintPageEventArgs, ByVal Linea As String)
        ‘Imprimir la línea con la fuente seleccionada y en Negro
        Pagina.Graphics.DrawString(Linea, Fuente_Pagina, Brushes.Black, Margen_Izquierdo, Pos())
        ‘Incrementar el contador de líneas
        ContadorLinea += 1
    End Sub

End Class

PD. Me gustara recibir vuestros comentarios, opiniones y aportaciones.

Serial Port – Enumeración & Disponibilidad – Tambien en C#

 

         Saber sobre la disponibilidad de nuestros puertos serie antes de su selección en un combobox.

  How to know about availability of our computer serial ports before select one from a combo box.

A menudo las aplicaciones que requieren seleccionar un dispositivo antes de efectuar algún tipo de comunicacion, no ofrecen ninguna información adicional sobre el estado del dispositivo. Sobre todo si hablamos del puerto serie, normalmente nos ofrecen una simple enumeración de los COM. Esto último es el causante de que la aplicación nos permita seleccionar un puerto que en ocasiones no existe o está siendo usado por otro programa.

Os propongo una idea con la intención de mejorar y facilitar la selección de este tipo de dispositivos en nuestras aplicaciones.

Básicamente se trata de enumerar en un ‘ComboBox’ personalizado los puertos existentes en nuestro equipo, utilizando el mandato :

My.Computer.Ports.SerialPortNames.ToArray

En el momento de la inicialización del ‘combobox’ asignaremos el evento de ‘DrawItem’ a la función que enriquecerá el aspecto, añadiendo al nombre un rectángulo coloreado y el texto correspondiente a la disponibilidad del puerto.

AddHandler ComboBox1.DrawItem, AddressOf cmbo_SerialPorts_Status

No dudéis en contactar conmigo si necesitáis aclarar o necesitáis entender alguna parte del código.

Para poder darle mayor difusión los comentarios del código están en inglés, aunque si os parece oportuno y necesario puedo posteároslo también en español.

Sometimes our communications applications are required to select any type of external device, and normally these applications are not giving any extra information about their availability. This is the case when talk around serial ports, normally when select the port only have a simple enumeration of COM’s, this may be confusing at time leaving at users selecting inexistent ports or ports that simply are already in use.

With this sample, you can improve and make easy these device selections in our applications.

The main think is enumerate serial port inside our customized ‘ComboBox’, using :

My.Computer.Ports.SerialPortNames.ToArray

After when initialize our combo only need assign ‘DrawItem’ event to function with our personalized combo draw,

AddHandler ComboBox1.DrawItem, AddressOf cmbo_SerialPorts_Status

This function are adding red rectangle and “busy” text when no have availability, and green rectangle and “available” text when the port is free.

Please no doubt in contact with me if you need any other explanation or opinion about this.

 

 SerialEnum_Es

SerialEnum_en 

 

public partial class Form1 : Form
    {
        //Enumerate Serial Ports on Machine
        //Get Serial Port availability
        String[] Puertos = System.IO.Ports.SerialPort.GetPortNames();

 

        public Form1()

        {

            InitializeComponent();

        }

 

        private void Form1_Load(object sender, EventArgs e)

        {

            this.comboBox1.DrawMode = DrawMode.OwnerDrawVariable;       //seleccionar mi propio modo de arrastre

            this.comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;  //aspecto al men desplegable

            this.comboBox1.DataSource = Puertos;                        //puertos serie disponibles

            this.comboBox1.TabIndex = 0;                                //seleccione en primer lugar tabIndex

        }

 

       

        private void comboBox1_DrawItem_1(object sender, DrawItemEventArgs CmboItem)

        {

            // Dibuja el fondo del item.

            CmboItem.DrawBackground();

            // Los valores por defecto si el puerto est disponible.

            string status = «Disponible»;

            SolidBrush brush = new SolidBrush(Color.Green);

            System.Drawing.Font font = this.Font;

            Brush fontbrush = Brushes.Black;

            Rectangle rectangle = new Rectangle(2, CmboItem.Bounds.Top + 2, CmboItem.Bounds.Height – 4, CmboItem.Bounds.Height – 4);

            // Comprobar disponibilidad del puerto

            try

            {

                // Si abre y cierra los puertos sin excepcin.

                // dibuja el item con la fuente por defecto y rectngulo verde.

                System.IO.Ports.SerialPort PortTest = new System.IO.Ports.SerialPort();

                PortTest.PortName = Puertos[CmboItem.Index].ToString();

                PortTest.Open();

                PortTest.Close();

            }

            catch (Exception ex)

            {

                // Si el puerto no est disponible

                // dibuja el item con la fuente cursiva y tachado y rectngulo rojo

                brush = new SolidBrush(Color.Red);

                status = «En Uso»;

                font = new Font(FontFamily.GenericSansSerif, this.Font.Size, FontStyle.Italic ^ FontStyle.Strikeout);

                fontbrush = Brushes.DimGray;

            }

            // llenar item combo con rectangulo.

            CmboItem.Graphics.FillRectangle(brush, rectangle);

            // escribir el texto con la condicin actual del puerto de este item.

            CmboItem.Graphics.DrawString(Puertos[CmboItem.Index].ToString() + » – « + status, font, fontbrush, new RectangleF(CmboItem.Bounds.X + rectangle.Width, CmboItem.Bounds.Y, CmboItem.Bounds.Width, CmboItem.Bounds.Height));

            // dibujar foco del rectngulo cuando el ratn est sobre un item.

            CmboItem.DrawFocusRectangle();

        }

    }

 

Cambiar los ‘SerialPort Settings’ en tiempo de ejecución.

Atendiendo a una consulta de los foros de MSDN, me complace compartir con vosotros una solución para asignar los ajustes de apertura del puerto serie al vuelo.

Entendiendo que en algunas situaciones, puede ser ventajoso poder cambiar la velocidad, paridad, bits… etc, ‘On Line’. Aunque para la mayoría de comunicaciones con dispositivos dichos parámetros son ajustados en tiempo de puesta en marcha y no acostumbran a variar en el transcurso del tiempo.

Esperando os sea útil… Saludos,
Pep Lluis,

PD. Si queréis podéis descargaros la solución de ejemplo en ‘attachments’.

using System;

using System.IO.Ports;

using System.Windows.Forms;

 

namespace SerialPortSettings

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void Form1_Load(object sender, EventArgs e)

        {

            // Asignar las Velocidades seleccionables al Combo

            object[] Velocidades = { 19200, 9600, 4800, 2400, 1200 };

            this.comboBox_bits_por_segundo.Items.AddRange(Velocidades);

           

            // Asignar Paridades Seleccionables desde la enumeracion

            foreach (string s in Enum.GetNames(typeof(Parity)))

            {

                this.comboBox_paridad.Items.Add(s);

            }

           

            // Seleccionar los items por defecto

            this.comboBox_bits_por_segundo.SelectedIndex = 0;

            this.comboBox_paridad.SelectedIndex = 0;

            // Abrir el puerto serie con los items por defecto

            SeleccionCambiada(sender,e);

            // Asignar la funcion a ejecutar por disparo de evento al cambio de indice en el combobox

            this.comboBox_bits_por_segundo.SelectedIndexChanged += new System.EventHandler(this.SeleccionCambiada);

            this.comboBox_paridad.SelectedIndexChanged += new System.EventHandler(this.SeleccionCambiada);

        }

 

       

        private void SeleccionCambiada(object sender, EventArgs e)

        {

            // Deberemos añadir un control de excepciones si queremos capturar posibles errores

 

            // Para reasignar valores… primero cerrar el puerto

            this.serialPort1.Close();

            // Asignar los nuevos Settings

            this.serialPort1.BaudRate = Convert.ToInt16(comboBox_bits_por_segundo.Text);

            this.serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), comboBox_paridad.Text);

 

            this.serialPort1.Open();

            // Ver las asignaciones actuales.

            this.Velocidad.Text = this.serialPort1.BaudRate.ToString();

            this.Paridad.Text = this.serialPort1.Parity.ToString();

        }

 

    }

}

 

Single or Parallel, explore new performances for loops

ParallelWon  SingleAndParallel Single

 Una de las novedades más excitantes de Visual Studio 2010 y el Framework, sin duda es la incorporación de las librerías para el uso de la ejecución en paralelo “paralelismo” o TPL (Task Parallel Library), pudiendo por fin sacar provecho a los ya extendidos multiprocesadores y/o múltiples ‘cores’.

Parece sencillo pero… no esta tan claro.

Es evidente que el uso de un simple ‘Parallel.For’ como cualquier otro proceso a través del framework, requiere de un número de recursos para conformar o organizar, planear y finalmente realizar la ejecución, además podemos suponer que este paralelismo se apoya sobre ‘threading’, por lo que debemos entender su aplicación dentro de escenarios donde exista un uso intensivo en la ejecución de tareas especificas y que estas justifiquen el consumo inicial de recursos en términos de rendimiento.

Con dichas conjeturas, está claro que un simple ‘for next’ siempre ganara en velocidad a un ‘parallel.for’,  si su ejecución se limita a la iteración sobre una simple estructura o lista y bien entendiendo en funciones cuya ejecución se realiza en una sola pasada.

Sin embargo la situación sufre un cambio radical cuando nuestro bucle itera en llamadas a funciones que realizan tareas con cierta carga de proceso.

Sin ninguna otra pretensión me complace compartir con vosotros un punto de entrada para evaluar la conveniencia o no de usar el paralelismo en determinadas tareas. También es evidente que no se trata de una herramienta formal, simplemente pretende ser un punto de entrada para experimentar de forma sencilla y asequible la implementación de escenarios muy básicos.

Esperando vuestras valoraciones, espero que llame vuestra atención y os complazca.

Cuidaros Mucho!
Pep Lluis,

Para probar la aplicación, necesitareis tener instalada la versión beta de Visual Studio 2010 y crear un nuevo proyecto ‘Windows Form Application’ deberemos añadir y distribuir en su form1 las siete etiquetas (del Label1 al Label7) correspondientes a la visualización de los datos del proceso, dos ‘NumericUpDown’ para proporcionarle el numero de bucles e iteraciones, un ‘Progressbar’ para comparar tiempos de ejecución y listo … con copiar y pegar el código adjunto, podréis utilizar este “tester” para vuestra primera aplicación en paralelo J

No dudéis en contactar conmigo si necesitáis cualquier aclaración o si necesitáis que os envíe el prototipo para este proyecto.

 With no doubt  one of the most exciting features in Visual Studio 2010 and Framework 4 is parallel computing or TPL (Task Parallel Library), being able finally to take benefit of multiprocessors  and multi core systems. 

This seems clear and simple but… may be need consider some aspects before J

It is evident that the use of simple Parallel.For’ like any other process through framework, requires a minimum number of resources to conform, to organize, to plan and finally to make the execution, in addition we can suppose that this parallelism leans on `threading’, reason why must be applied within scenes where have an intensive use of processes execution or long tasks, at end only this may justify these initial consumption of resources in performance terms.

With these conjectures, it is clear that simple `for next’ always won in speed to `parallel.for’, if their execution are limited to iterate on a simple structure or list, as well understanding this functions inside single flow process and made one to one.

Nevertheless the situation undergoes a radical change when our iteration calls to functions that make tasks with certain load of process.

Without any other pretension it pleases to me to share with you an entry point to evaluate the convenience of using parallelism in certain tasks. Also it is evident that one is not a formal tool, simply tries to be an entry point to start with a reasonable simple form and the implementation of very basic scenes.

Waiting for your evaluation, I hope this short explanation pleases to you.

Take care!
Pep Lluis,

Ps: No doubt in contacting with me if you need any extra explanation or if you need that I sent this prototype to you.

Imports System.Threading

‘ Simple Skeleton to test ‘parallel.for’
‘ Pep Lluis 14.07.2009

‘ Compare/test time execution of single over parallel task’s

‘ To run require Visual Studio 2010 Beta
‘ To catch Illegal Cross threat’s exceptions, correct appropriate code
‘ or set false, Checking cross thread calls.

Public Class SingleOrParallel
    Dim _timer As New System.Timers.Timer
    Private Sub SingleOrParallel_Load() Handles MyBase.Load
        AddHandler _timer.Elapsed, AddressOf Testing    ‘Run Test every elapsed time
        _timer.Interval = 1000                          ‘elapsed time to 1s
        _timer.Enabled = True                           ‘run timer
    End Sub

    Dim Elapsed1, Elapsed2 As Double                    ‘define elapsed memory’s
    Sub Testing()
        _timer.Enabled = False                          ‘Stop timer
        Me.Label5.Text = «Running Test»
        loops = Me.NumericUpDown1.Value                 ‘read number of loops
        SequentialFor()                                 ‘Call Sequential for
        ParallelFor()                                   ‘Call Parallel for
       
        ‘ Show results
        If Elapsed1 > Elapsed2 Then
            Label3.ForeColor = Drawing.Color.Red        ‘Parallel won
            Label4.ForeColor = Drawing.Color.Green
            ‘show execution time & differences between parallel & single
            Me.ProgressBar1.Value = (Elapsed2 * 100 / Elapsed1)
            Label5.Text = «fast « + (100 – Int(Elapsed2 / Elapsed1 * 100)).ToString + «%»
            Label6.Text = Elapsed1.ToString             ‘Single time
            Label7.Text = Elapsed2.ToString             ‘Parallel time
        Else
            Label3.ForeColor = Drawing.Color.Green      ‘Single won
            Label4.ForeColor = Drawing.Color.Red
            Me.ProgressBar1.Value = (Elapsed1 * 100 / Elapsed2)
            Label5.Text = «fast « + (100 – Int(Elapsed1 / Elapsed2 * 100)).ToString + «%»
            Label6.Text = Elapsed2.ToString             ‘Parallel time
            Label7.Text = Elapsed1.ToString             ‘Single time
        End If
        ‘ put result bottom progressbar value
        Label7.Left = (Me.ProgressBar1.Left +
                      ((ProgressBar1.Width / ProgressBar1.Maximum) * ProgressBar1.Value)) –
                      (Label7.Width / 2)
        _timer.Enabled = True                           ‘start timer to next test
    End Sub

 

    Dim loops As Integer
    Dim Chrono As New Stopwatch

    Sub SequentialFor()
        Chrono.Start()              ‘Start watch
        ‘ Conventional for next
        For n = 0 To loops
            SomeTask()
        Next
        ‘ remember Elapsed time
        Elapsed1 = Chrono.Elapsed.TotalMilliseconds
        Chrono.Stop()               ‘Watch stop
        Chrono.Reset()              ‘reset!
    End Sub

    Sub ParallelFor()
        Chrono.Start()              ‘Start wath
        ‘ parallel for
        Parallel.For(0, loops, Sub(n)
                                   SomeTask()
                               End Sub)
        ‘ remember Elapsed time
        Elapsed2 = Chrono.Elapsed.TotalMilliseconds
        Chrono.Stop()               ‘Watch stop
        Chrono.Reset()              ‘reset!
    End Sub

   
    ‘Simulated task
    Sub SomeTask()
        ‘Your task here
        Thread.SpinWait(NumericUpDown2.Value)
    End Sub

End Class 

In this sample readings do not seem respond to the real milliseconds, I recommend use `ElapsedTicks’ instead `Elapsed.TotalMilliseconds”, these correspond directly to ticks of chrono, eliminating any other interpretation.

Regards,

Imprescindibles SP’s de SQL

Links muy útiles para todos los que estamos liados estos días probando RC de WIN 7 y Betas del VS2010… una forma de mantener a ralla los mensajes de aviso en tiempo de instalacion y en torno a la compatibilidad de SQL, aunque probablemente lo obtendremos del ‘Update’ creo que no está demás recomendar o asegurarnos de instalar los SP correspondientes.

SQL Express:

SQL Server 2008 Express SP1
SQL Server 2005 Express Edition SP3
SQL Server 2005 Express Advanced Edition SP3
SQL Server 2005 Express Toolkit Edition SP3

Services Packs:

Descargar SQL Server 2005 SP3
Descargar SQL Server 2008 SP1

Saludos,
Pep Lluis,

Visual Studio 2010 y Framework 4.0, Disponibles en Version beta 1.

A partir de hoy, todos los subscriptores de MSDN tienen la posibilidad de descargar y probar la versión Beta 1 de Visual Studio y Framework 4.0

Los que no dispongan de una subscripción deberán esperar a manaña para poder empezar a descargar J

Aquí os dejo los enlaces :

http://msdn.microsoft.com/es-es/subscriptions/downloads/default.aspx?pv=18:370

http://www.microsoft.com/visualstudio/en-us/products/2010/default.mspx

Que lo disfruteis…

El Futuro de Visual Basic y la “Co-evolución” con C#

En el 2008 en la PDC “Professional Developer Conference”, Paul Vick y Lucian Wischik nos presentaron de forma magistral las futuras direcciones de nuestro querido Visual Basic. Sin duda desde que Visual Basic se despego de sus “runtime “ (hasta la versión 6) y se unió a la plataforma .NET en 2001, se ha recorrido un largo viaje no exento de algún que otro “accidente” pero sin duda un viaje lleno de ilusión y perseverancia para convertirlo en un lenguaje nuevo, capaz de satisfacer por supuesto las exigencias actuales pero con la vista puesta en la proyección del mismo a la evolución de la plataforma.

Creo que un discurso mal entendido entre los programadores de C# y Basic, es intentar buscar esas diferencias que distinguen a los programadores “profesionales” de los “aficionados”. Si bien es cierto que ciertas características de “basic” por su carácter sencillo y plano, permiten a miles de personas iniciarse en estos menesteres de la programación, es necesario puntualizar que la rivalidad (si hablamos de entorno “wINtel”) nace la incesante pugna y comparación con nuestro clásico “C++” claramente orientado al desarrollo de plataforma en relación a los “Basic” orientados en la mayor parte de su historia al desarrollo rápido de aplicaciones y generalmente orientado a escritorio.

Es evidente que sin disponer de más espacio, esta sería una explicación simplista y al alcance de un sector de opiniones, estoy convencido de que no tiene por que coincidir con todas, como también estoy convencido que es bueno que muchos de vosotros discrepéis.[View:http://www.msteched.com/online/view.aspx?tid=1d3d650b-a6b3-4c98-9240-571866969b89]

La idea es que C# y C++ a pesar de empezar con “C” son filosofías distintas, para liarlo un poquito también podríamos hablar de F#… sin embargo centrándonos en C# y Visual Basic deberíamos empezar a focalizarnos en comprender que a pesar de mantener ciertas peculiaridades y diferenciaciones en tanto a su enfoque, son y serán lenguajes que “co-evolucionan” en un entorno común, compartiendo entre otros, librerías base, tipos, CLR’s…y un largo etc. Etc. Por lo tanto debemos evitar de una vez por todas hablar de ellos tono de hermanos mayores o menores si no en tono de “gemelos” J, con características diferenciadoras y caracteres propios, pero gemelos al fin y al cabo.  Como bien apuntan en el equipo de desarrollo: “Al fin y al cabo comparten más coincidencias que divergencias”

Creo no equivocarme si afirmo que es la primera vez que tanto Visual Basic como C# en la versión 2010 se equiparan en cuanto a sus características principales. (Propiedades automáticas, inicializadores de colecciones, expresiones Lambdas, ‘latebinding’, omisión de referencias en llamadas COM, Interop con Lenguajes Dinámicos, Co/contravaciance… entendido esto creo sinceramente que es hora de concentrarnos en aprovechar el gran momento que nos brindan las características de los lenguajes y su evolución, más que continuar discutiéndonos por imponer la convicción de cuál de ellos es el mejor.

Si al empezar hablamos Paul Vick (sin lugar a dudas una de las personas más vinculadas en el desarrollo de Visual Basic) en esta ocasión y recién salido del TechEd norte americano 2009, es para mí un momento muy especial poder compartir con vosotros la visión de un gran maestro; Anders Hejlsberg hablando de los lenguajes, junto con uno de los principales promotores de Visual Basic ; Jonthan Aneja, que muchos tuvimos el placer conocerlo personalmente en el Spanish VS/VB Tour 2008.

[View:http://e.msteched.com/public/us/DTL336.wmv]

 

 

 

 

Visual Studio 2010 – En su version Beta… Llegara Pronto?.

Según me llama la intuición y por las informaciones recibidas de los que han tenido la suerte de asistir al TechEd 2009 que se esta desarrollando en estos momentos en Estados Unidos, en breve dispondremos de la posibilidad de probar la versión beta del Visual Studio 2010 para los subscriptores de MSDN y un poquito más tarde para el público en general… no perdáis la vista a este enlace:

http://www.microsoft.com/visualstudio/en-us/products/2010/default.mspx

Sobre todo donde dice “Coming son”… podria ser mas pronto de lo que muchos ‘esperabais’ 🙂

Saludos,
Pep Lluis,

 

Buscar un texto en una columna y seleccionar los coincidentes en un DGV

<Pregunta>
Que tal .. igual no sé si este comentario sea para es hilo, pero tengo un problema .. tengo un datagridview pero quiero agregar un textbox fuera del datagrid, para cuando empiece a escribir vaya buscando en el datagrid y que se vaya seleccionando, sé que para ese procedimiento se juega un poco con el datatable pero aún estoy perdido … alguién tiene una sugerencia ..

Mil gracias

<Respuesta>
… Se me ocurre algo similar a esto.

    Private Articulo As New DataTable(«Articulos»)

    Private MIDGV As New DataGridView

    Private MITXT As New TextBox

 

    Private Sub Form1_Load() Handles MyBase.Load

       

        ‘ Simular tabla Articulos

       

        Articulo.Columns.Add(«Codigo»)

        Articulo.Columns.Add(«Descripcion»)

        Articulo.Columns.Add(«Precio»)

        Articulo.Rows.Add(«001», «Resistencia 100ohms», «0,15»)

        Articulo.Rows.Add(«002», «Transistor 2n2234», «1,00»)

        Articulo.Rows.Add(«003», «Microprocesador Z80», «5,40»)

        Articulo.Rows.Add(«004», «UART 16C450», «3,45»)

        Articulo.Rows.Add(«005», «Resistencia 200ohms», «0,12»)

        Articulo.Rows.Add(«006», «Transistor 2n2222», «1,22»)

       

        ‘ marco

        Dim marcoDGV = New FlowLayoutPanel

        marcoDGV.BorderStyle = BorderStyle.Fixed3D

        marcoDGV.Width = Me.Width

        marcoDGV.Height = Me.Height

        ‘ Añadir el marco con el DataGridView y textBox

        marcoDGV.Controls.AddRange(New Control() {MIDGV, MITXT})

        Me.Controls.Add(marcoDGV)

        ‘ Seleccionar el textbox

        MITXT.Select()

        ‘ al cambiar el texto

        AddHandler MITXT.TextChanged, AddressOf VerSeleccion

    End Sub

 

    ‘ LINQ (Con VB9 ‘Visual Studio 2008’)

    ‘ Mostrar la seleccion de los registros

    ‘ que contienen la seleccion del texto

    ‘ introducido en el textBox

    Private Sub VerSeleccion()

        MIDGV.DataSource = (From S In Articulo Where S.Item(«Descripcion»).ToString.Contains(MITXT.Text) _

                                 Select Codigo = S.Item(«Codigo»), _

                                        Descripcion = S.Item(«Descripcion») _

                            ).ToList

    End Sub

Saludos,
Pep Lluis,