Thứ Sáu, 31 tháng 8, 2012

Tắt chức năng postback của button control ASP.NET

Set OnClientClick="return false;". Nếu có hàm cần làm việc trên client thì đặt return false ngay sau các hàm trên client. Ví dụ set OnClientClick="hamCuaBan();return false;". Khi click vào button sẽ thực thi hàm hamCuaBan() và sau đó  gặp đoạn return false; nó sẽ không postback lên server nữa.
  1. <asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="return false;" />  
Để hiểu rõ quá trình làm việc của button control ta set UseSubmitBehavior="false" và đăng ký sự kiện onclick="Button1_Click":
  1. <asp:Button ID="Button1" UseSubmitBehavior="false" runat="server" Text="Button" OnClientClick="return false;" onclick="Button1_Click" />  
Khi control render, view page source sẽ thấy:
  1. <input type="button" id="Button1" onclick="return false;__doPostBack('Button1','')" value="Button" name="Button1">  
  2.       
UseSubmitBehavior="false" thì type="button" thay vì type="submit". Khi type="button" thì khi click vào nó sẽ không tự động postback mà phải viết hàm cho nó để có thể postback lên server.

Để ý đoạn
  1. onclick="return false;__doPostBack('Button1','')"    
.ASP.NET nó tự thêm hàm để postback lên server đặt sau các hàm xử lý bên client.
__doPostBack('Button1','') chính là hàm để postback lên xử lý để xử lý các sự kiện trên server . Trường hợp này nó sẽ thực thi sự kiện onclick="Button1_Click". Nếu không đăng ký sự kiện trên server cho button nó sẽ không phải làm gì cả tuy nhiên nó vẫn postback lên server.

Quá trình xử lý khi click vào button:  nó sẽ thực hiện các hàm bên phía client trước sau đó sẽ thực hiện tiếp các hàm postback. Nếu ta chèn thêm 1 đoạn return false vào sự kiện ở client thì tất cả các hàm phía sau nó sẽ không thực hiện nữa, do đó sẽ không postback lên server nữa. Vì các hàm postback bị đặt sau các hàm bên client nếu có.

Để chứng mình điều này ta làm thử 1 ví dụ:

Set lại hàm:
  1. OnClientClick="alert('trước return');return false;alert('sau return')"    
Khi render sẽ thấy:
  1. onclick="alert('trước return');return false;alert('sau return');__doPostBack('Button1','')"     
Click vào button sẽ chỉ hiện thị alert box "trước return" và không làm gì phía sau return false nữa cả. Nếu bỏ đoạn return false; đi nó sẽ hiển thị lần lượt 2 alert box và trang sẽ bị load lại do postback.

Thứ Hai, 20 tháng 8, 2012

Con trỏ hàm trong C#

Khái niệm con trỏ hàm mình không giải thích ở đây. Ai sử dụng delegate để viết các sự kiện cho các control thì chắc đã rành về cái này.

Đi thẳng vào ví dụ luôn:

Giả sử ta có các hàm làm phép tính như sau:
  1. public static int Cong(int n1, int n2)  
  2. {  
  3.     return n1 + n2;  
  4. }  
  5.   
  6. public static int Tru(int n1, int n2)  
  7. {  
  8.     return n1 - n2;  
  9. }  
  10.   
  11. public static int Nhan(int n1, int n2)  
  12. {  
  13.     return n1 * n2;  
  14. }  
  15.   
  16. public static int Chia(int n1, int n2)  
  17. {  
  18.     return n1 / n2;  
  19. }  
Bây giờ ta viết 1 hàm làm phép tính bất kỳ cho người dùng. Hàm này sẽ không làm gì cả mà nó sẽ ủy quyền (delegate) cho hàm tương ứng mà người dùng muốn sử dụng:
  1. public static int Tinh(int n1, Func<intintint> tenHamTinh, int n2)  
  2. {  
  3.     return tenHamTinh(n1, n2);  
  4. }  
Chú ý tham số tenHamTinh là ta truyền hàm muốn tính vào: Func<intintint> tenHamTinh. Trong <intintint> thì int cuối cùng là kiểu dữ liệu trả về của hàm, các int phía trước lần lượt là các kiểu dữ liệu của các tham số của hàm truyền vào. Khi ta truyền hàm muốn tính vào thì hàm muốn tính phải thỏa các điều kiện đó ( ở đây hàm truyền vào phải có 2 tham số  kiểu int và kết quả trả về là kiểu int).

Để sử dụng thì làm như sau:
  1. int tong = Tinh(10, Cong, 20);  
  2.   
  3. int hieu = Tinh(10, Tru, 30);  
Demo:
  1. Console.WriteLine("10 + 20 =" + Tinh(10, Cong, 20));  
  2. Console.WriteLine("10 - 20 =" + Tinh(10, Tru, 20));  

Thứ Tư, 15 tháng 8, 2012

Timeout khi thay đổi cấu trúc của table trong SQL

Khi chỉnh sửa các column trong table hoặc thêm column mới vào giữa table. SQL sẽ lưu dữ liệu hiện tại của table qua 1 bảng tạm, sau đó xóa table cũ và đổi tên table tạm lại thành table cũ ...

Quá trình này nếu thực hiện trên table có dữ liệu lớn sẽ mất khá nhiều thời gian. Nếu save ở chế độ Design sẽ bị tình trạng timeout.

Cách giải quyết là generate script và thực thi script này.

Nhìn vào script được generate ra cũng sẽ giúp hiểu được quá trình làm việc của SQL khi sửa table.

Thứ Hai, 13 tháng 8, 2012

Cancel các tiến trình khi làm việc đa tiến trình sử dụng ParallelOptions

Khai báo 1 CancellationTokenSource, set CancellationTokenSource.Token cho CancellationToken của ParallelOptions.

Ví dụ: 
  1. CancellationTokenSource cts = new CancellationTokenSource();   
  2. ParallelOptions options = new ParallelOptions { MaxDegreeOfParallelism = 10, CancellationToken = cts.Token };   
Khi muốn hủy quá trình làm việc thì gọi:
  1. cts.Cancel();   

Thứ Sáu, 10 tháng 8, 2012

Xem địa chỉ IP của client kết nối tới MS SQL Server

Xem danh sách các địa chỉ IP kết nối tới SQL Server là việc cần thiết, nó cho ta biết các địa chỉ IP nào đang kết nối tới SQL Server.

Ứng dụng của bạn chỉ chạy từ 1 địa chỉ IP và bạn chỉ đăng nhập vào SQL Server từ 1 địa chỉ IP duy nhất. Tuy nhiên bạn phát hiện ra trong danh sách có nhiều IP lạ đang đăng nhập vào SQL Server, các địa chỉ IP này không nằm trong danh sách IP bạn đã sử dụng. Lúc này bạn cần phải kiểm tra gấp lại mật khẩu rồi đấy.

Để xem thông tin chi tiết các connections đang kết nối tới SQL Server:
  1. select * from sys.dm_exec_connections     
Lấy địa chỉ IP:
  1. select client_net_address from sys.dm_exec_connections
Có thể viết 1 ứng dụng nhỏ sử dụng thông tin trên để thường xuyên kiểm tra nếu phát hiện IP lạ thì sẽ báo động cho người quản trị server.

Thứ Năm, 9 tháng 8, 2012

Xem số lượng connections đang kết nối tới MS SQL Server

Group theo từng database:
  1. SELECT   
  2.     DB_NAME(dbid) as DBName,   
  3.     COUNT(dbid) as NumberOfConnections,  
  4.     loginame as LoginName  
  5. FROM  
  6.     sys.sysprocesses  
  7. WHERE   
  8.     dbid > 0  
  9. GROUP BY   
  10.     dbid, loginame  
  11.       
Lấy tổng số:
  1. SELECT   
  2.     COUNT(dbid) as TotalConnections  
  3. FROM  
  4.     sys.sysprocesses  
  5. WHERE   
  6.     dbid > 0  
  7.       
Xem chi tiết:
  1. sp_who2 'Active'  
  2.       
Nguồn: http://stackoverflow.com

Thứ Tư, 8 tháng 8, 2012

Cách sử dụng ( đọc, thêm, sửa, xóa ) appSettings trong file web.config C# ASP.NET

Các thao tác đọc, thêm, sửa, xóa appSettings tương tự như các thao tác với app.config. Tuy nhiên có sự khác nhau về cách đọc file config.

Xem thao tác với app.config C#

Ví dụ hàm sửa appSettings:
  1. public static void EditAppSetting(string key, string value)  
  2. {  
  3.     System.Configuration.Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/");  
  4.     config.AppSettings.Settings[key].Value = value;  
  5.     config.Save(ConfigurationSaveMode.Modified);  
  6.     ConfigurationManager.RefreshSection("appSettings");  
  7. }  
Tham số truyền vào hàm OpenWebConfiguration là đường dẫn thư mục file web.config cần load. Nếu bằng null thì mặc định là file web.config ở thư mục cao nhất.

Note: Nếu gặp lỗi Failed to map the path thì xem Khắc phục lỗi 'Failed to map the path' khi load file web.config

Thứ Tư, 1 tháng 8, 2012

Ngắt khoảng cách cho số bằng cách sử dụng phương thức ToString(string format)

Một cách nhanh để ngắt khoảng cách cho các chuỗi số là ta convert chúng về số sau đó sử dụng phương thức .ToString(string format)
  1. int number = int.MaxValue;  
  2. string format = number.ToString("###,###");