Windows Forms. TextBox con sugerencias (I) - Creando el control
En el anterior artículo vimos cómo crear un control TextBox que emulaba la generación de sugerencias estándar de este control.
En este artículo crearé un proyecto de prueba que nos sirva tanto para probar tanto la funcionalidad actual del control, como la que tratamos de conseguir: un control TextBox que nos permita personalizar el método de generación de sugerencias.
Voy a añadir un nuevo proyecto TestForm a la solución utilizando la plantilla para Aplicaciones de Windows Forms.
Al proyecto debemos añadirle una referencia al proyecto SuggestionTextBox para poder hacer uso del nuevo control.
Lo primero que vamos a necesitar es un origen de datos con el que realizar las pruebas. Para simplificar al máximo el ejemplo lo que he hecho es serializar un DataTable con la información de los campos ProductID, Name, ProductNumber y Color de la tabla Production.Product de la base de datos de ejemplo AdventureWorks.
He serializado el DataTable en un fichero Products.xml y lo he añadido al proyecto de prueba dentro de una nueva carpeta Datos.
<?xml version="1.0" standalone="yes"?> <NewDataSet> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Products" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Products"> <xs:complexType> <xs:sequence> <xs:element name="ProductID" type="xs:int" minOccurs="0" /> <xs:element name="Name" type="xs:string" minOccurs="0" /> <xs:element name="ProductNumber" type="xs:string" minOccurs="0" /> <xs:element name="Color" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <Products> <ProductID>1</ProductID> <Name>Adjustable Race</Name> <ProductNumber>AR-5381</ProductNumber> </Products> <Products> <ProductID>2</ProductID> <Name>Bearing Ball</Name> <ProductNumber>BA-8327</ProductNumber> </Products> <Products> <ProductID>3</ProductID> <Name>BB Ball Bearing</Name> <ProductNumber>BE-2349</ProductNumber> </Products> <Products> <ProductID>4</ProductID> <Name>Headset Ball Bearings</Name> <ProductNumber>BE-2908</ProductNumber> </Products> ...
Para que el archivo de datos esté disponible en tiempo de ejecución necesitamos que el archivo se copie al directorio de salida al compilar la aplicación. Hacemos click con el botón derecho sobre el archivo Products.xml, seleccionamos la opción Propiedades y establecemos el valor de la propiedad Copiar en el directorio de salida como Copiar siempre.
Para probar el control voy a incluir un control TextSuggestion en el formulario Form1 que habrá creado Visual Studio automáticamente en nuestro proyecto de prueba. El control debería aparecernos en el Cuadro de herramientas dentro de un apartado Componentes SuggestionTextBox.
Si el control no aparece posiblemente deba compilar la solución para que se muestre en el Cuadro de herramientas.
Ya sólo quedaría asociar el origen de datos al control. Así que lo que voy a hacer es asociar al control como origen de datos los textos del campo Name de la tabla Products. Para ello he introducido el siguiente código en el evento Load del formulario.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace TestForm { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { DataTable dtProductos = new DataTable("Products"); dtProductos.ReadXml(Path.Combine(Application.StartupPath, @"Datos\Products.xml")); IEnumerable<string> data = dtProductos.Rows.Cast<DataRow>() .Select(r => (string)r["Name"]); textSuggestion1.SuggestDataSource = data.ToList(); } } }
Imports System.IO Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim dtProductos As DataTable = New DataTable("Products") dtProductos.ReadXml(Path.Combine(Application.StartupPath, "Datos\Products.xml")) Dim data As IEnumerable(Of String) = _ dtProductos.Rows.Cast(Of DataRow)() _ .Select(Function(r) CType(r("Name"), String)) TextSuggestion1.SuggestDataSource = data.ToList() End Sub End Class
Hacemos click con el botón derecho sobre el proyecto TestForm y marcamos la opción Establecer como proyecto de inicio para que sea éste el proyecto que se arranque cada vez que queramos depurar la aplicación.
Ya podemos arrancar la aplicación y probar nuestro control.
Ya tenemos nuestro control funcionando, aunque por ahora no hemos conseguido gran cosa: esta funcionalidad ya la provee el control estándar del Framework. En el siguiente artículo mostraré cómo podemos modificar el control para permitir al desarrollador personalizar el método de selección de textos sugeridos:
Windows Forms. TextBox con sugerencias (III) - Personalizar las sugerencias
El código completo, tanto en C# como en Visual Basic, está disponible en:
TextBox con sugerencias tipo Google. Ejemplos MSDN.
No hay comentarios:
Publicar un comentario