sábado, 15 de noviembre de 2014

Buscar un valor en una Data Table con el operador Select

Cuando necesitemos buscar por la existencia o no-existencia de un valor en una Data Table podemos usar LINQ de la siguiente manera:

Si deseamos buscar si en una columna llamada proceso tenemos un valor 'X':

DataTable dt = GetDataTable();
var rowsWithX = dt.Select("proceso = 'X'");
if(rowsWithX.Lenght != 0)
{
      //Hacer algo si se encuentra la X en la columna proceso

}


Si deseamos hacer algo cuando en la columna exista cualquier valor diferente de 'X':

DataTable dt = GetDataTable();
var rowsWithoutX = dt.Select("proceso <> 'X'");
if(rowsWithoutX.Lenght != 0)
{
      //Hacer algo si no se encuentra la X en la columna proceso

}



También es posible usar el operador like para ver si se encuentra una cadena de caracteres dentro de un campo de char o varchar:

DataTable dt = GetDataTable();
var rowsWithoutX = dt.Select("proceso like '%X'%");
if(rowsWithoutX.Lenght != 0)
{
      //Hacer algo si no se encuentra la X en la columna proceso

}

jueves, 13 de noviembre de 2014

Implementar una caja de texto y un calendario en una página web

Para implementar la funcionalidad de una caja de texto y la selección de la fecha con un control de calendario se puede hacer de lo siguiente:


  • Crear la caja de texto y el control de calendario en la forma y asignarles el atributo ClientInstanceName para poder nombrarlos con javascript en el lado del cliente.
  • Agregar el atributo ClientVisible al control de calendario y ponerlo en false para que no esté visible en el cliente.
  • Agregar el evento GotFocus a la caja de texto .
  • Agregar el evento OnSelectionChanged para el control de calendario.
El markup de estos controles debe quedar así:


<dx:ASPxTextBox ID="txtRequiredDate" runat="server" Width="170px" ClientInstanceName="txtRequiredDate">
     <ClientSideEvents GotFocus="OnGotFocus" />
</dx:ASPxTextBox>

<dx:ASPxCalendar ID="calRequiredDate" runat="server" ClientInstanceName="calRequiredDate" ClientVisible="false">
     <ClientSideEvents SelectionChanged="OnSelectionChanged" />
</dx:ASPxCalendar>


  • Luego hay que agregar el código javascript necesario para mostrar el calendario, para obtener la fecha y ponerla en la caja de texto y para volver a esconderlo. Esto debe quedar de la siguiente manera:

<script language="javascript" type="text/javascript">
    function OnGotFocus(s, e) {
        calRequiredDate.SetVisible(true);
    }
    function OnClick(s, e) {
        calRequiredDate.SetVisible(false);
    }
    function OnSelectionChanged() {
        var date = calRequiredDate.GetSelectedDate();
        txtRequiredDate.SetText(date.toDateString());
        calRequiredDate.SetVisible(false);
    }
</script>

lunes, 3 de noviembre de 2014

Implementar la funcionalidad de contar los caracteres restantes en un control


Para implementar la funcionalidad de contar los caracteres y limitarlos en un control de Devexpress se puede crear un archivo js para agregar las siguientes funciones:

function RecalculateCharsRemaining(editor) {
    var maxLength = parseInt(editor.maxLength ? editor.maxLength : editor.GetInputElement().maxLength);
    var editValue = editor.GetValue();
    var valueLength = editValue != null ? editValue.toString().length : 0;
    var charsRemaining = maxLength - valueLength;
    SetCharsRemainingValue(editor, charsRemaining >= 0 ? charsRemaining : 0);
}
function SetCharsRemainingValue(textEditor, charsRemaining) {
    var associatedLabel = ASPxClientControl.GetControlCollection().Get(textEditor.name + "_cr");
    var color = GetLabelColor(charsRemaining).toString();
    associatedLabel.SetText("<span style='color: " + color + ";'>" + charsRemaining.toString() + "</span>");
}
function GetLabelColor(charsRemaining) {
    if (charsRemaining < 5) return "red";
    if (charsRemaining < 12) return "#F3A250";
    return "green";
}

// ASPxMemo - MaxLength emulation
function InitMemoMaxLength(memo, maxLength) {
    memo.maxLength = maxLength;
}
function EnableMaxLengthMemoTimer(memo) {
    memo.maxLengthTimerID = window.setInterval(function () {
        var text = memo.GetText();
        if (text.length > memo.maxLength) {
            memo.SetText(text.substr(0, memo.maxLength));
            RecalculateCharsRemaining(memo);
        }
    }, 50);
}
function DisableMaxLengthMemoTimer(memo) {
    if (memo.maxLengthTimerID) {
        window.clearInterval(memo.maxLengthTimerID);
        delete memo.maxLengthTimerID;
    }
}

Agregar la referencia a nuestro archivo js:

 <script src="../Content/functions.js" type="text/javascript"></script>


Luego en el markup, agregar lo siguiente a los eventos del cliente del control:

<ClientSideEvents Init="function(s, e) { InitMemoMaxLength(s, 128); RecalculateCharsRemaining(s); }"                                    GotFocus="EnableMaxLengthMemoTimer" LostFocus="DisableMaxLengthMemoTimer"
KeyDown="RecalculateCharsRemaining" KeyUp="RecalculateCharsRemaining" />

El segundo parámetro en la función InitMemoMaxLength es el máximo de caracteres que  aceptará el control.

Luego podemos agregar  un span con una etiqueta que mostrará el número de caracteres restantes de la siguiente manera:
 <span class="chrm">Characters remaining: <dx:ASPxLabel ID="txtEmail_cr" runat="server" EnableClientSideAPI="True" />     </span>

El ID de la etiqueta que mostrará los caracteres restantes debera tener el mismo nombre que el control a validar mas el sufijo _cr.


Mover mensajes seleccionados a un personal folder en Oulook 2016

Este es un ejemplo de como mover los mensajes seleccionados a un personal folder (pst) en Outlook 2016 usando VBA. Sub MoveInbox()     Mov...