AutoCompleteExtender con múltiples columnas en BD

Hola a todos, Retomando el blog, ya que lo tenia descuidado. :).

Definitivamente hay cosas que parecen sencillas, pero que a la hora de la verdad es todo lo contrario o no parecían simples. Este es el caso de usar el control AutoCompleteExtender de la librería ASP.NET AJAX Control Toolkit enlazado a una base de datos, pero que muestre mas de una columna y al momento de seleccionar solo quede el campo que queremos.

Bueno ya todos saben donde descargar la librería, como hacer la referencia al ensamblado. sin embargo en la url a continuación es un lugar para empezar.

http://www.codeplex.com/Wiki/View.aspx?ProjectName=AjaxControlToolkit

  1. Servicio web, con el cual consultamos la bd y hacemos la búsqueda.

Nota: hay varias formas de hacerlo y la tecnología lo permite.

   1: [WebMethod]
   2:     public string[] GetProducts(string prefixText, int count)
   3:     {
   4:         List<string> items = new List<string>(count);
   5:         DataSet ds = new DataSet();
   6:  
   7:  
   8:         string connectionString = "Data Source=localhost;Persist Security Info=True;Integrated Security=SSPI;Initial Catalog=AdventureWorksLT;";
   9:         using (SqlConnection connection = new SqlConnection(connectionString))
  10:         {
  11:             string sql = "SELECT * FROM SalesLT.Product WHERE Color LIKE '" + prefixText + "%'";
  12:             SqlDataAdapter adapter = new SqlDataAdapter();
  13:             adapter.SelectCommand = new SqlCommand(sql, connection);
  14:             adapter.Fill(ds);
  15:         }
  16:  
  17:         foreach (DataRow dr in ds.Tables[0].Rows)
  18:         {
  19:             items.Add(dr["Name"].ToString() + "|" + dr["Color"].ToString() + "|");
  20:             //items.SetValue(dr["TAR_Codigo"].ToString() + "t" + dr["TAR_Tipo"].ToString());
  21:  
  22:         }
  23:  
  24:         return items.ToArray();
  25:     }

2. Ahora la .aspx

   1: <asp:TextBox ID="txtProducts" runat="server" Height="21px" Width="334px"></asp:TextBox>
   2:     
   3:     <cc1:AutoCompleteExtender runat="server" 
   4:     BehaviorID="AutoCompleteEx" 
   5:     ID="e_Products" TargetControlID="txtProducts" ServicePath="AutoCompleteRows.asmx" OnClientPopulated="selectItem"     
   6:     ServiceMethod="GetProducts" MinimumPrefixLength="2" CompletionInterval="1000" 
   7:     EnableCaching="true" CompletionSetCount="8" 
   8:     CompletionListCssClass="autocomplete_completionListElement" 
   9:     CompletionListItemCssClass="autocomplete_listItem" 
  10:     CompletionListHighlightedItemCssClass="autocomplete_highlightedListItem"> 
  11:     <Animations>
  12:                     <OnShow>
  13:                         <Sequence>
  14:                             <%
   1: -- Make the completion list transparent and then show it --

%>

  15:                             <OpacityAction Opacity="0" />
  16:                             <HideAction Visible="true" />
  17:                             
  18:                             <%
   1: --Cache the original size of the completion list the first time
   2:                                 the animation is played and then set it to zero --

%>

  19:                             
  20:                             <ScriptAction Script=" />
  21:                                 // Cache the size and setup the initial size
  22:                                 var behavior = $find('AutoCompleteEx');
  23:                                 if (!behavior._height) {
  24:                                     var target = behavior.get_completionList();
  25:                                     behavior._height = target.offsetHeight - 2;
  26:                                     target.style.height = '0px';
  27:                                 }"
  28:                             
  29:                             <%
   1: -- Expand from 0px to the appropriate size while fading in --

%>

  30:                             
  31:                             <Parallel Duration=".4">
  32:                                 <FadeIn />
  33:                                 <Length PropertyKey="height" StartValue="0" EndValueScript="$find('AutoCompleteEx')._height" />
  34:                             </Parallel>
  35:                         </Sequence>
  36:                     </OnShow>
  37:                     <OnHide>
  38:                         <%
   1: -- Collapse down to 0px and fade out --

%>

  39:                         
  40:                         <Parallel Duration=".4">
  41:                             <FadeOut />
  42:                             <Length PropertyKey="height" StartValueScript="$find('AutoCompleteEx')._height" EndValue="0" />
  43:                         </Parallel>
  44:                     </OnHide>
  45:                 </Animations>
  46:     </cc1:AutoCompleteExtender>

 

3. Un poco de javascript para que solo seleccione el campo que queremos.

   1: <script type="text/javascript">
   2:     function selectItem() {
   3:         var comletionList = $find("AutoCompleteEx").get_completionList();
   4:         for (i = 0; i < comletionList.childNodes.length; i++) {
   5:             var _value = comletionList.childNodes[i]._value;
   6:             comletionList.childNodes[i]._value = _value.substring(_value.lastIndexOf('|') + 1); 
   7:             _value = _value.substring(0, _value.lastIndexOf('|'));
   8:             comletionList.childNodes[i].innerHTML = _value.replace('|', '<br/>');
   9:         }
  10:     }

4. Algunas imagenes

1

2

Nota: La función java script es sacada de un foro, y mejorada para mis necesidades. :).

Espero sea de su agrado.

Romny

Qex – Symbolic SQL Query Exploration

Navegando por channel9 me encontré con este nuevo termino que va a dar de mucho que hablar, como suele ser de Microsoft no para en su tarea de emprender nuevos proyectos y darnos algo mas que aprender :).

Copy Paste de lo que es Qex:

“The purpose of the project is to investigate automatic data generation methods for parameterized SQL queries. Data generation involves both parameter data, as well as, concrete table data generation. The data generation is driven by test conditions that represent various coverage criteria.”

Interesante no creen.

Links de información:

Romny

C# and VB.NET Co-Evolution: Video Channel9

Hola a todos. Ya casi terminando mis vacaciones, me eh dado un tiempito para leer y actualizarme un poco de lo nuevo que hay.

Ojeado el blog de Oscar y mas enfocado a su articulo Hacia donde va VB?, me acorde de un video que también hablan de ese tema, pero mas enfocado a los dos lenguajes fuertes de .NET (VB.NET y C#).

Disfruten el video.

Romny

Historia del Grande “Microsoft” aun no te la sabes?

Buen día.

Toda persona que tenga que ver indirectamente o directamente con el grande de la industria con los es Microsoft, en algún momento de su vida tendrá que investigar sobre el tema; y que mejor forma que hacerlo que vía channel9, pues para las personas interesadas se están publicando episodios sobre lo que ah echo el grande año a año.

Por el momento están los siguiente episodios.

Referencia: http://channel9.msdn.com/shows/History/

Salud@s.

Romny

Recomendaciones al configurar sitios web desde “0” en servidores recién instalados.

Buenas. Resulta que esta experiencia me paso hace poco. “A todo el mundo le toca por mas desarrollador que sea”

Una cosa es trabajar para una empresa donde ya están los servidores listos para poner a funcionar nuestras aplicaciones web, pero otra cosa es tener que hacerlo todo. (Parte de IT y Desarrollo). Me encomendaron la tarea de realizar una aplicación y montar el servidor para una empresa diferente en la cual laboro. Gracias a esto aprendí cosillas interesantes las cuales coloco a continuación.

“Una cosa es desarrollar en tu portátil personal y otra muy distinta es pasarlo a un entorno real de producción”

  1. Primera recomendación.

Supongamos que ya esta instalado el servidor, con su respectivo IIS y con .NET Framework v1.1(Esto debido a que tienen aplicaciones funcionando con NET Framework v1.1).

Después de instalar el NET Framework v2.0 (nuestra aplicación la usa) intentamos configurar nuestro web site con su respectivo Framework, pero valla, saca un error nuestro error conocido de 403.

Lo primero que debemos hacer es habilitar las extensiones de ASP.NET 2.0 en IIS en esta permitido.

  • Añadir la extensión de servicio web ASP.NET v1.1.4322 apuntando al archivo C:WINDOWSMicrosoft.NETFrameworkv1.1.4322aspnet_isapi.dll
  • Añadir la extensión de servicio web ASP.NET v2.0.050727 apuntando al archivo C:WINDOWSMicrosoft.NETFrameworkv2.0.50727aspnet_isapi.dll

2. Segunda recomendación.

serverunable

Debido a que todo lo que esta en el Default Web Site del IIS, se ejecutar con el Pool predeterminado y si este esta configurado con la versión de ASP.NET 1.1, se mostrara este error.

Lo primero es ver si podemos directamente cambiar que el Default Web Site se ejecute con la versión de ASP.NET 2.0 o si no creamos otro pool que se ejecute con esta versión y se lo asignamos a nuestro site.

  • su solo cambiamos que el Default Web Site del IIS corra con ASP.NET 2.0 todos los directorios virtuales que se ejecuten dependientes de Default Web Site corre mediante solo un w3wp.exe.
  • Si creamos un nuevo pool para las versiones de ASP.NET 2.0 se creara otra instancia del proceso w3wp.exe consumiendo recursos de la RAM entre 20 a 40 MG.

“Ustedes escogen cual les resulta mas apropiado”.

3. Links de interés.

 

s@ludos.

Nota: Se me escapan otros tips, los publicare después.

Romny D

Usabilidad no es Funcionalidad

Hola a todos.

hoy hablare sobre usabilidad y funcionalidad, temas que por si son endemoniados en empresas cambiantes de personal (muy a menudo) que por si últimamente nadie se salva.

Tenemos definiciones de todos los sabores en la red sobre ambos temas que de por si, nos tiende a equivocarnos. Pero me guiare por http://es.wikipedia.org/wiki/Usabilidad referente a la usabilidad. Según la ISO/IEC 9126:

“La usabilidad se refiere a la capacidad de un software de ser comprendido, aprendido, usado y ser atractivo para el usuario, en condiciones específicas de uso”

Y bueno la funcionalidad se refiere a que el software haga lo que tiene que hacer, para lo cual fue diseñado.

Conceptos muy puntuales que se tienden a confundir y a omitir cuando se esta modificando módulos de la aplicación. Entre personas del campo de la informática es muy común esto, cuando se pregunta a los usuarios sobre aspectos de las modificaciones futuras sobre los módulos a implementar, pero lo cierto es que no se puede corresponder a todas las peticiones de los usuarios.

En todos los casos en lo que eh participado, se a tomado la decisión de hacer listas de las posibles modificaciones y hacer el comparativo entre la usabilidad y la funcionalidad, que no se pierda este enfoque, ya que están muy ligados el uno del otro, y que por dar mas apoyo a la parte de la usabilidad, se le quiten valor de negocio a la aplicación.

Algo corto el post, pero quería compartirlo ya que en cualquier momento se nos presentara esta situación.

Saludos.

Romny

Utilidad para habilitar proxy de I.E

Hola a todos, Regresando a laborar y a las actividades propias.

Problema

En ciertos casos algunos usuarios se les olvida habilitar el proxy de su I.E cuando hacen cambio de redes, y el común decir de estos usuarios es que no tengo internet. Esta situación a mi parecer se vuelve algo tediosa con el tiempo, así que decidí desarrollar una utilidad algo sencilla para los usuarios habiliten el proxy o lo deshabiliten de una manera sencilla.

Solución (Algo sencilla)

Para habilitar y deshabilitar el proxy decidí modificar una llave de registro del I.E que de llama ProxyEnable y que se encuentra en [HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet Settings].

Realmente es algo sencillo el programa, lo único que hace es modificar esta llave, colocar el valor de 1 para habilitar el proxy o colocar 0 para deshabilitar el proxy.

Código importante.

   1: string subKey = "Software\Microsoft\Windows\CurrentVersion\Internet Settings";
   2:  
   3:         private void Habilitar()
   4:         {
   5:             RegistryKey intSettings = Registry.CurrentUser.OpenSubKey(subKey, true);
   6:  
   7:             intSettings.SetValue("ProxyEnable", 1);
   8:             
   9:         }
  10:         private void Deshabilitar()
  11:         {
  12:             RegistryKey intSettings = Registry.CurrentUser.OpenSubKey(subKey, true);
  13:  
  14:             intSettings.SetValue("ProxyEnable", 0);
  15:             
  16:         }

Algo importante también, es que el usuario pueda ver y pueda modificar esa llave del registro

   1: using System.Security.Permissions;
   2: using Microsoft.Win32;
   3:  
   4: [assembly: RegistryPermissionAttribute(SecurityAction.RequestMinimum,
   5:     ViewAndModify = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings")]

Ahora las capturas.

Proxy

Proxy1

Proxy2

Para mas información en http://msdn.microsoft.com/es-es/library/microsoft.win32.registrykey(VS.80).aspx

Como dije es algo sencillo, si conocen otra forma pueden comentar.

Saludos.

Romny Duarte

Enriqueciendo ASP.NET Dynamic Data con Ajax Control Toolkit

Hola a todos.

Bueno siguiendo con este tema de ASP.NET Dynamic Data quisiera mostrarles como enriquecer un poco el site con Ajax Control Toolkit.

Para esto vamos a usar dos controles de Ajax Control Toolkit, los cuales son Calendar Extender y Validator Callout Extender.

  • Lo primero es crear el Web Site de ASP.NET Dynamic Data.
  • Para obtener datos usaremos a la ya conocida Northwind.
  • Añadimos un LINQ to SQL classes vinculándola con Northwind; para nuestro ejemplo solo usaremos la tabla Employees.
  • En el Global.asax habilitamos la siguiente línea.
  •    1: model.RegisterContext(typeof(NWDataContext), 
       2: new ContextConfiguration() { ScaffoldAllTables = true });
  • Para nuestro ejemplo vamos a editar la fecha y queremos que se use el control Calendar Extender y Validator Callout Extender, los que conocen esta BD sabes que la fecha de nacimiento permite valores nulos, pero para el ejemplo vamos a hacer que valide que sea requerido el campo.
  • Vamos a la carpeta DynamicDataFieldTemplatesDateTime_Edit.ascx y vamos a colocar los siguientes líneas o así debería quedar.
  •    1: <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" 
       2: TagPrefix="cc1" %>
       3:  
       4: <asp:TextBox ID="TextBox1" runat="server" CssClass="droplist" 
       5:     Text='<%# FieldValueEditString %>' Columns="20"></asp:TextBox>
       6: <cc1:CalendarExtender ID="CEDate" runat="server" TargetControlID="TextBox1">
       7: </cc1:CalendarExtender>
       8: <cc1:ValidatorCalloutExtender ID="VCEDate" runat="server" 
       9:     TargetControlID="RequiredFieldValidator1" 
      10:     HighlightCssClass="validatorCalloutHighlight">
      11: </cc1:ValidatorCalloutExtender>
      12: <asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator1" 
      13:     CssClass="droplist" ControlToValidate="TextBox1" Display="None" 
      14:     ErrorMessage="Fecha de nacimiento requerida." />
      15: <asp:RegularExpressionValidator runat="server" ID="RegularExpressionValidator1" 
      16:     CssClass="droplist" ControlToValidate="TextBox1" 
      17:     Display="Dynamic" Enabled="false" />
      18: <asp:DynamicValidator runat="server" ID="DynamicValidator1" 
      19: CssClass="droplist" ControlToValidate="TextBox1" Display="Dynamic" />
  • Como podrán ver solo lo que eh echo es colocar mis controles de Ajax Control Toolkit y habilitar el control RequiredFieldValidator que por defecto viene deshabilitado.
  • Ahora veamos unas imágenes viendo los controles en funcionamiento.

DinamicData DinamicData1

Bueno espero que les ayude este post a enriquecer sus app.

Romny