technical notes

Tháng Ba 31, 2008

Late-init MaskEditExtender or CalendarExtender for speed up loading page.

Chuyên mục: webform — ngduy @ 7:33 chiều

When we uses MaskEditExtender or CalendarExtender in a GridView, List or Repeater. Loading time will be very slow, specially after the page loaded, IE (or FF) will be stop responding in a long time. The reason is AjaxControlToolkit init many MaskEditExtenders.

To improve loading speed of GridView which contains MaskEditExtenders or CalendarExtenders, Mask and Calendar control will be init only when user focus on control. Follow example as below:

1. Step 1: Create pre-render Mask or Calendar control.

2. Step 2: Create javascript control to create Mask or Calendar.

3. Step 3: Put into control.

Tháng Ba 9, 2008

Fix wrong position of CalendarExtender

Chuyên mục: NET, webform — ngduy @ 5:59 chiều

Khi thêm CalendarExtender vào một số DataBound controls, thì xảy ra hiện tượng calendar hiển thị không đúng, tức là không hiển thị ngay phía dưới của Textbox. Sau đây là cách fix lỗi này:

Trang aspx:

<asp:TextBox ID="txtStartDate" runat="server"></asp:TextBox>
<asp:ImageButton ID="imgStartDate" ImageUrl="../images/calendar.gif" runat="server" CausesValidation="False" />
<ajaxToolkit:CalendarExtender id="CalendarExtender1" runat="server" TargetControlID="txtStartDate"
PopupButtonID="imgStartDate" CssClass="datePicker"></ajaxToolkit:CalendarExtender> 

Sau đó định nghĩa css này trong file stylesheet:

.datePicker

{
    position:relative;
    left:5px;
}

.datePicker .ajax__calendar_container
{
background-color:White!important;
border:1px solid blue!important;
z-index:50000;
}
.datePicker .ajax__calendar_hover .ajax__calendar_day
{background-color:#edf9ff;border-color:#daf2fc;color:#0066cc!important;}
.datePicker .ajax__calendar_hover .ajax__calendar_month
{background-color:#edf9ff;border-color:#daf2fc;color:#0066cc!important;}
.datePicker .ajax__calendar_hover .ajax__calendar_year
{background-color:#edf9ff;border-color:#daf2fc;color:#0066cc!important;}
.datePicker .ajax__calendar_hover .ajax__calendar_title
{color:#0066cc!important;}
.datePicker .ajax__calendar_hover .ajax__calendar_today
{color:#0066cc!important;}

Các style ở phía dưới có thể không có cũng được. Chủ yếu cho đẹp.

Tháng Chín 23, 2007

ASP.NET AJAX progress indicator

Chuyên mục: webform — ngduy @ 9:10 sáng

Dưới đây là cách làm progress indicator trong asp.net với Atlas (MS Ajax). Khi ấn vào sẽ có 1 cái hình xoay xoay và con trỏ chuột trở thành waiting. Trông cũng hay phết. Bài này là bài sưu tầm. Ghi qua đây để tiện lấy ra khi cần.

Source trang aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="UpdatePanelAnimation" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
  <title>Update Panel with Animation</title>
  <link href="UpdatePanelAnimation.css" rel="stylesheet" type="text/css" />
</head>
<body>
  <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <div id="Container" class="Normal">
      <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
          <asp:Label ID="Label1" runat="server" Text="Update Me" /><br /><br />
          <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        </ContentTemplate>
      </asp:UpdatePanel>
    </div>
  </form>
</body>
</html></asp>

Souce code behind c#

public partial class UpdatePanelAnimation : System.Web.UI.Page
{
  protected void Button1_Click(object sender, EventArgs e)
  {
    Thread.Sleep(5000);

    Label1.Text = DateTime.Now.ToString();
  }
}

Souce css

.Normal
{
  border: dashed 1px #000000;
  background-color: #FFFFFF;
  cursor: auto;
  padding: 10px;
  width: 200px;
  text-align: center;
}

.Progress
{
  border: dashed 1px #000000;
  background-color: #EEEEEE;
  background-image: url(spinner.gif);
  background-position: center center;
  background-repeat: no-repeat;
  cursor: wait;
  padding: 10px;
  width: 200px;
  text-align: center;
}

Cuối cùng là source javascript để handle event

<script language="javascript">
  // Get a reference to the PageRequestManager.
  var prm = Sys.WebForms.PageRequestManager.getInstance();

  // Using that prm reference, hook _initializeRequest
  // and _endRequest, to run our code at the begin and end
  // of any async postbacks that occur.
  prm.add_initializeRequest(InitializeRequest);
  prm.add_endRequest(EndRequest);

  // Executed anytime an async postback occurs.
  function InitializeRequest(sender, args)
  {
    // Change the Container div's CSS class to .Progress.
    $get('Container').className = 'Progress';

    // Get a reference to the element that raised the postback,
    //   and disables it.
    $get(args._postBackElement.id).disabled = true;
  }

  // Executed when the async postback completes.
  function EndRequest(sender, args)
  {
    // Change the Container div's class back to .Normal.
    $get('Container').className = 'Normal';

    // Get a reference to the element that raised the postback
    //   which is completing, and enable it.
    $get(sender._postBackSettings.sourceElement.id).disabled = false;
  }
</script>

Tháng Chín 18, 2007

Freeze column in GridView

Chuyên mục: webform — ngduy @ 4:50 sáng

Add these styles into CSS

.Freezing
{
    position: relative;
    top: expression(this.offsetParent.scrollTop);
    z-index: 10;
}
.FreezingCol_Header
{
    position: relative;
    left: expression(document.getElementById("freezingDiv").scrollLeft);
    z-index: 1;
    border-top-width: 0px;
    border-left-width: 0px;
    border-right-width: 0px;
    border-bottom-width: 0px;
}
.FreezingCol_No
{
    position: relative;
    left: expression(document.getElementById("freezingDiv").scrollLeft);
    z-index: 1;
    border-top-width: 1px;
    border-left-width: 1px;
    border-right-width: 1px;
    border-bottom-width: 0px;
}
.FreezingCol_Item
{
    position: relative;
    left: expression(document.getElementById("freezingDiv").scrollLeft);
    z-index: 1;
    border-top-width: 1px;
    border-left-width: 0px;
    border-right-width: 1px;
    border-bottom-width: 0px;
}

How to uses?

Add GridView into div with specified ID freezingDiv

  • div id=”freezingDiv” style=”OVERFLOW-Y: visible; OVERFLOW: scroll; WIDTH: 300px; HEIGHT: 414px”

Using style for Header & Item

  • HeaderStyle CssClass=”FreezingCol_Header”
  • ItemStyle CssClass=”FreezingCol_Item” HorizontalAlign=”Center” BackColor=”White” BorderColor=”#666666″

* IE will response slowly when using this CSS. The best way is create another grid for static columns.

Restricting User Input using JavaScript and Reg Expressions

Chuyên mục: webform — ngduy @ 4:43 sáng
function keypress(cntrl)
{
   var cntrl1 = document.getElementById("Hidden1");
   cntrl1.value = cntrl.value;
}

function propertychanged(cntrl)
{
   //var reg = /^\\\\d+\\\\.?\\\\d{0,4}$/;
   var reg = /^[-]{1}$^[-]?([1-9]{1}[0-9]{0,11}(\\\\.[0-9]{0,4})?0(\\\\.[0-9]{0,4})?\\\\.[1-9]{1,4})$/;
   var val = cntrl.value;
   var cntrl1 = document.getElementById("Hidden1");
   var val1 = cntrl1.value;
   if (val.length > 0)
   {
      if (!reg.test(val))
      {
         cntrl.value = val1;
      }
   }
   else
   {
      cntrl1.value = "";
   }
}

Insert hidden field into aspx file and add attributes to TextBox

<asp:TextBox ID=”TextBox1″ runat=”server”
onkeypress=”keypress(this);” onpropertychange=”propertychanged(this);” ></asp:TextBox>
<input id=”Hidden1″ type=”hidden”>

We have 1 problem with Japanese (I’m not check with another), IE will crash when user input Hiragana or Full-size character into textbox. The simplest way is disable IME using CSS.
style=”text-align:right;ime-mode:disabled;”

Tháng Chín 17, 2007

Validate page before run a javascript code

Chuyên mục: webform — ngduy @ 11:09 sáng

By default, after we add an attributes for asp.net controls. javascript registered will be execute before validation. So. If we want to do something after validation., we should call Page_ClientValidate() to execute page validation.
Below is demo code:

        function confirmGoto(message)
        {
            if (Page_ClientValidate())
            {
                if (edited)
                {
                    var ok = confirm(message);
                    if(ok)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
        }

Blog at WordPress.com.