technical notes

Tháng Mười 6, 2009

test

Chuyên mục: NET — ngduy @ 5:51 chiều

test

Tháng Bảy 22, 2009

Test

Chuyên mục: NET — ngduy @ 6:07 sáng

Test

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

.NET 2.0 Cast operator vs. As operator

Chuyên mục: NET — ngduy @ 6:23 chiều

Khi chuyển từ untyped data values từ SQL database vào 1 biến, sẽ có tình huống xảy ra, khi cast từ DBNull sang một kiểu nào đó, ta sẽ bị InvalidCastException. Tuy nhiên, có một cách để gán thoải mái mà không lo lắng gì. Bắt đầu xem ví dụ dưới đây:

object objstr = DBNull.Value;
string str1 = objstr; //Cast throws an Exception
string str2 = objstr as string //No exception thrown and str2 == null

Có thể dùng as để viết code cho gọn như vd dưới:

if ( objstr == DBNull.Value )
{
    strResult = "Default";
}
else
{
    strResult = (string)objstr;
}
//Is equivalent to
strResult = objstr as string ?? "Default";

Như vậy, as operator giống như cast operator, nhưng khi gặp null value, as sẽ chuyển giá trị thành null chứ không thrown exception như là cast.

Tham khảo MSDN C# Programmer’s Reference tại http://msdn2.microsoft.com/en-us/library/cscsdfbt(vs.71).aspx thì được giải thích như sau:

expression <span class="kwrd">as</span> type</pre>
<pre><span class="rem">//is equivalent to</span></pre>
<pre>expression <span class="kwrd">is</span> type ? (type)expression : (type)null

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 Mười 15, 2007

Huỷ biến trong .NET

Chuyên mục: NET — ngduy @ 9:46 sáng

Trong .NET environment, khi một object sẽ bị huỷ, bộ nhớ và resources nó dùng sẽ được thu hồi khi không còn tham chiếu nào đến object đó.

Khi dùng một object, biến sẽ giữ một tham chiếu hay con trỏ đến object đó.

Ví dụ

Dim myPerson As New Person()

Nghĩa là biến myPerson chỉ tham chiếu đến object vừa tạo. Nếu có đoạn code sau:

Dim anotherPerson As Person
anotherPerson = myPerson

Nghĩa là biến anotherPerson cũng tham chiếu đến cùng một object. Điều này có nghĩa là object Person thì được tham chiếu bởi 2 biến: myPerson và anotherPerson.

Khi không còn biến nào tham chiếu đến object, nó sẽ được .NET framework terminated. Cụ thể, nó sẽ được terminated và thu hồi bởi một cơ chế gọi là garbage collection.

Không giống COM (vd VB6), .NET framework không dùng cách đếm số tham chiếu để quyết định việc có huỷ object đó hay không. Thay vào đó, nó dùng một cơ chế khác để quyết định việc huỷ object đó.

Điều đó có nghĩa là, trong Visual Basic (hay .NET), ta không cần quyết định việc huỷ object đó, bởi vì không thể quyết định chính xác khi nào object sẽ được huỷ.

Để chấm dứt tham chiếu đến một object. Ta có thể gỡ tham chiếu một cách cụ thể bằng cách gán Nothing vào biến đó bằng đoạn code sau:

myPerson = Nothing

Ta cũng có thể gỡ bỏ tham chiếu tới một object bằng cách thay đổi tham chiếu của biến tới một object khác. Vì một biến chỉ có thể tham chiếu tới một object tại một thời điểm. Ta có thể code như sau:

myPerson = New Person()

Biến sẽ tham chiếu tới một object mới, vì thế, sẽ release tham chiếu tới object trước đó.

Đây là ví dụ về explicit dereferencing, VB còn cung cấp một phương pháp thuận tiện hơn để gỡ bỏ tham chiếu đến một object gọi là implicit dereferencing khi biến đó out of scope.

Ví dụ, nếu ta có một biến được mô tả trong một method, khi method hoàn tất, biến đó sẽ được tự động huỷ, như vậy cũng sẽ huỷ tham chiếu đến những object đã được tham chiếu.

Tóm lại, Bất cứ lúc nào biến tham chiếu đến một object out of scope, tham chiếu đến object đó sẽ tự động được huỷ. Ví dụ:

Private Sub DoSomething()
Dim myPerson As Person
myPerson = New Person()
End Sub

Cho dù ta không gán giá trị của myPerson là Nothing một cách cụ thể, ta biết rằng biến myPerson sẽ bị huỷ khi method kết thúc, sau khi nó out of scope. Tham chiếu đến Person object được tạo trong hàm sẽ hoàn toàn được gỡ bỏ.

Dĩ nhiên, sẽ có một kịch bản khác trong đó object sẽ bị huỷ khi ứng dụng hoàn toàn kết thúc. Vào lúc này, tất cả các biến sẽ bị huỷ, và tất cả tham chiếu đến object sẽ hoàn toàn kết thúc.

(Tham khảo: Wrox.Professional.VB.2005.Nov.2005.pdf – Chương 4, Trang 115)

Tháng Chín 27, 2007

Visual Studio 2005 Product comparisons

Chuyên mục: Reference — ngduy @ 3:01 sáng

Xem so sánh các bản VS 2005 tại đây

http://msdn2.microsoft.com/en-us/vstudio/aa700921.aspx

Tháng Chín 24, 2007

Javascript tutorial & examples

Chuyên mục: Reference — ngduy @ 4:28 sáng

Tham khảo javascript toàn tập. Có kèm trình soạn thảo online.

http://www.w3schools.com/js/js_examples_3.asp

Deploy to server using CLickOnce

Chuyên mục: NET — ngduy @ 4:16 sáng

Để deploy application lên server dùng ClickOnce. Server cần có

  • IIS
  • FrontPage 2002 Server Extensions.

Tuy nhiên, khi publish lên server, sẽ gặp những vấn đề sau:

Error 7 Failed to connect to ‘http://server IP/Projects/’ with the following error: Unable to create the Web ‘http://server IP/projects/’. Server error: Error 5 opening registry key “SOFTWARE\Classes”
=>
Do FrontPage server extensions không có quyền access vào key HKEY_LOCAL_MACHINE\SOFTWARE\Classes.
=>
  1. Vào regedit
  2. Nhấn phím phải lên HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Chọn permissions
  3. Add user Everyone (Hiện tại chỉ biết add thế, cụ thể chỉ cần add user nào sẽ tìm hiểu sau)
  4. Check vào allow FullControl cho user Everyone
Error 7 Failed to connect to ‘http://server IP/Projects/’ with the following error: Unable to create the Web ‘http://server IP/projects/’. Server error: Error 5 opening registry key “SOFTWARE\Classes\.hlp”
=>
Nguyên nhân và cách khắc phục tương tự như trên.

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>
Bài viết cũ hơn »

Blog at WordPress.com.