Nội dung học • Tổng quan về .Net FrameWork • Sử dụng IDE • Giới thiệu NNLT C# • ASP.NET • LINQ: LINQ TO SQL • Xây dựng ứng dụng Web Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 1 CHƯƠNG I Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 2 Giới thiệu • .NET Framework là môi trường tích hợp để đơn giản hóa việc phát triển và thực thi các ứng dụng trên Internet, desktop và các thiết bị di động . • Các mục tiêu chính: • Cung cấp một môi trường hướng đối tượng nhất quán cho nhiều loại ứng dụng • Cung cấp một môi trường giảm tối thiểu sự xung đột phiên bản. • Cung cấp một môi trường linh động, dựa trên các chuẩn đã được chứng nhận để có thể chứa trên bất cứ hệ điều hành nào. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 3 Kiến trúc của .NET Framework Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 4 Kiến trúc của .NET Framework •CLR (Common Language Runtime): Quản lý sự thực thi mã lệnh và tất cả các tác vụ liên quan đến nó: biên dịch, quản lý bộ nhớ, bảo mật, quản lý tuyến đoạn. Mã lệnh thực thi trong CLR chia làm 2 loại: - mã được quản lý - mã không được quản lý là mã lệnh không cài đặt những yêu cầu để thực thi trong CLR – chẳng hạn như COM hoặc các thành phần dựa trên Windows API. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 5 Kiến trúc của .NET Framework •FCL(Framework Class Library ) là thư viện kiểu dữ liệu có thể tái sử dụng (gồm các class, structure, …) dành cho các ứng dụng thực thi trong .NET. •Tất cả các ngôn ngữ hỗ trợ .NET Framework đều sử dụng thư viện lớp dùng chung này. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 6 Các bước thực hiện của Ct truyền thống Source Code Compiler Executable Code Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH R U N T I M E Code Executed 7 Các bước thực hiện của Ct truyền thống • Các ngôn ngữ trước đây có chương trình dịch riêng và có môi trường chạy riêng của nó. • Trong .NET, chương trình dịch dịch mã nguồn vào một "Intermediate Language (IL)“ và runtime được thay thế bởi CLR (Common Language Runtime). Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 8 Các bước thực hiện của các ct .NET .NET Source Code Language Compiler MSIL + Metadata CLR Machine code Code executed 2nd Compliation 1st Compliation Các chương trình .NET được dịch 2 lần: lần đầu chậm, lần thứ 2 tương đối nhanh hơn. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 9 Các bước thực hiện của các ct .NET • Chương trình nguồn trước hết sẽ được biên dịch và đóng gói thành một khối gọi là assembly (là tập hợp các thành phần được đóng gói trong file exe hoặc dll). Khối này sẽ chứa các mã lệnh ngôn ngữ trung gian (IL) và các metadata mô tả thông tin cần thiết cho sự hoạt động của khối. • Mỗi khi có yêu cầu thực thi assembly nói trên, CLR sẽ dùng trình biên dịch JIT (Just-in-Time) của môi trường thực thi để chuyển đối IL chứa trong nó sang dạng mã lệnh cụ thể của máy khi ứng dụng thực sự thực thi. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 10 Các bước thực hiện của các ct .NET Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 11 Các kiểu dữ liệu cơ sở của CTS Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 12 Chương 2 Giới thiệu Visual Studio.NET Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 13 Sử dụng IDE Microsoft Visual Studio 2008 Khởi động Microsoft Visual Studio 2008. File New Project để tạo mới một project Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 14 Chia sẻ IDE • VS.NET cung cấp IDE cho tất cả các ngôn ngữ của nó. • Giúp cho người lập trình xây dựng 1 chương trình nhanh chóng và hiệu quả • Khi VS.NET khởi động, thì trang Start Page được hiển thị. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 15 Chia sẻ IDE [3] Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 16 Design, Split, Source • Design: chế độ thiết kế giao diện • Source: Hiển thị mã HTML tự động phát sinh khi thiết kế Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 17 Solution Explorer •Solution Explorer liệt kê các projects và các file đang hoạt động •Để hiển thị Solution Explorer, nhấn Ctrl+Alt+L (View|Solution Explorer ) Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 18 ToolBox • Bao gồm các điều khiển trên Web form và Win form, ActiveX controls, XML Web services, các thành phần HTML và các đối tượng. • Để hiển thị Toolbox, nhấn Ctrl+Alt+X (View|Toolbox). Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 19 Server Explorer • Server Explorer Lập trình trên CSDL mà không cần sử dụng VS.NET IDE. • Để hiển thị Server Explorer, nhấn Ctrl+Alt+S (View|Server Explorer) Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 20 Class View • Class view hiển thị các lớp, phương thức và thuộc tính đã xây dựng. • Để hiển thị Class View, nhấn Ctrl+Alt+C (View|Class View). Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 21 Properties Window • Properties window để thiết lập các thuộc tính các điều khiển, lớp và projects. • Để hiển thị Properties Window, nhấn F4. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 22 Kỹ thuật IntelliSense • Thông báo cho người lập trình cú pháp đúng và cho phép hoàn thành tự động 1 câu lệnh Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 23 Sự kiện và đáp ứng sự kiện[1] Ta có thể tương tác giữa các đối tượng khác nhau bên trong 1ứng dụng, giữa 1 đối tượng và đối tượng bên ngoài thông qua sự kiện và đáp ứng sự kiện. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 24 Sự kiện và đáp ứng sự kiện[2] • Để hiển thị tất các các sự kiện của điều khiển: – Chọn điều khiển – Kích vào button Event trên cửa sổ Properties Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 25 Ví dụ xử lý sự kiện Người dùng chọn nút Design: hiển thị bố cục của trang Source: Hiển thị mã tự động phát sinh khi tạo trang Web. Sự kiện Đáp ứng sự kiện Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 26 Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 27 Nội dung • Giới thiệu • Biến và các kiểu dữ liệu • Các cấu trúc điều khiển: if, switch • Các cấu trúc lặp; for, while, do while, foreach • LIST, File văn bản. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 28 GIỚI THIỆU VỀ C# • Là NNLT đơn giản, hiện đại, an toàn và hướng đối tượng • Là ngôn ngữ mạnh nhất trong .NET • Thay thế cho C++ • Có cú pháp giống C++, Java • Sử dụng con trỏ dễ dàng hơn trong C++ Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 29 GIỚI THIỆU VỀ C# - “bài toán” cần giải quyết là một Solution. - Một solution bao gồm một hoặc nhiều project. - Một solution, nếu có nhiều project thì nên được tạo ra trong một thư mục riêng để có thể chứa các project trong nó. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 30 Cú pháp đơn giản của 1 Project •Using các Namespace [Namespace Ten] { - Tập hợp các lớp } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 31 Biến • Khai báo theo cú pháp: Mức truy cập Kiểu Tên biến public int protected string private ... Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 32 Các kiểu số nguyên Tên Kiểu trong CTS Mô tả Vùng biểu diễn (min:max) sbyte System.SByte Số nguyên có dấu 8-bit -27:27-1 short System.Int16 Số nguyên có dấu 16-bit -215:215-1 int System.Int32 Số nguyên có dấu 32-bit -231:231-1 long System.Int64 Số nguyên có dấu 64-bit -263:263-1 byte System.Byte Số nguyên không dấu 8-bit 0:28-1 ushort System.UInt16 Số nguyên không dấu 16-bit 0:216-1 uint System.UInt32 Số nguyên không dấu 32-bit 0:232-1 ulong System.UInt64 Số nguyên không dấu 64-bit 0:264-1 Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 33 Kiểu số thực, Boolean, ký tự • Kiểu số thực: float, double • Kiểu Boolean: bool: true|false • Kiểu ký tự: char – Biểu diễn 1 ký tự 16-bit (Unicode) Các hằng kiểu ký tự được gán bằng cách đóng trong cặp dấu nháy đơn, ví dụ 'A'. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 34 Kiễu dữ liệu tham chiếu được định nghĩa sẵn Tên Kiểu CTS Mô tả object System.Object Kiểu dữ liệu gốc, mọi kiểu dữ liệu khác trong CTS đều kế thừa từ đây (kể cả các kiểu dữ liệu giá trị) string System.String Chuỗi ký tự Unicode Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 35 Ví dụ protected void Page_Load(object sender, EventArgs e) { object t; t = (object) 5; string[] st = new string[2] { "ab","cd" }; object[] t1; t1 = st; Response.Write(t1[1].ToString()); } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 36 Các phương thức trên chuỗi protected void Page_Load(object sender, EventArgs e) { string st1 = " Nguyen Anh Trung "; string st2 = "le Tien Tang"; st1 = st1.Trim(); Response.Write(string.Format("Chieu dai chuoi la {0}:\n", st1.Length)); Response.Write(string.Format("Ky tu tai chi so thu 3 la {0}", st1[3]) string ten1 = st1.Substring(st1.LastIndexOf(' ') + 1); string ten2 = st2.Substring(st2.LastIndexOf(" ") + 1, st2.Length - st2.LastIndexOf(" ") - 1); Response.Write (string.Format("Ten2=ten1:{0}", ten2.Equals(ten1))); Response.Write(string.Format("so sanh ten1 voi ten 2: {0}", ten1.CompareTo(ten2))); } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 37 Các phương thức trên chuỗi protected void Page_Load(object sender, EventArgs e) { string st1 = "Nguyen Anh Trung "; Response.Write(string.Format( "Tim chuoi con {0}", st1.Contains("yen"))); st1 = st1.Replace("Nguyen", "Le"); Response.Write(st1); st1 = st1.Remove(0, 3); Response.Write(st1); st1 = "Le nam|tink26|dhkh"; string[] ds = st1.Split('|'); Response.Write(string.Format("ten:{0},lop:{1},truong{2}", ds[0], ds[1], ds[2])); Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 38 Các toán tử Loại toán tử Ký hiệu Số học +-*/% Logic && || ! Cộng chuỗi + Tăng và giảm ++ -- Dịch bit << >> So sánh == != < > <= >= Phép gán = += -= *= /= %= &= |= ^= <<= >>= Truy xuất thành phần . Indexing (cho array và các indexers) [] Ép kiểu () Điều kiện ?: Tạo đối tượng new Thông tin về kiểu Sizeof(Kiểu) Điều khiển Overflow exception checked unchecked Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 39 Luồng điều khiển của chương trình • Các câu lệnh rẻ nhánh – if – switch • Các câu lệnh lặp – for – while – do – foreach Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 40 Câu lệnh if int i = 10; if (i<10) { Response.Write("less than 10"); } else { Response.Write("greater or equal to 10"); } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 41 Câu lệnh Switch ... int i = 2; switch (i) { case 1: Response.Write("one"); break; case 2: Response.Write("two"); break; default: Response.Write("another value"); break; } ... Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 42 Câu lệnh For int s = 0; for (int i=1; i<=10; i++) { s+=i; } Response.Write(s); Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH int s = 0; for (int i=1; i<=10; i++) { s+=i; } Response.Write(i); //Error statement Response.Write(s); } 43 Câu lệnh while int i = 1; int s = 0; while (i<=10) { s += i; i++; } Response.Write(s); Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH int i = 1; int s = 0; do { s += i; i++; } while (i<=10); Response.Write(s); 44 Câu lệnh Foreach int[] a = new int[3]; a[0] = 10; a[1] = 20; a[2] = 30; foreach (var b in a) { Response.Write(b); } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 45 ArrayList, LIST • Là mảng động, mỗi phần tử là một object • Namespace: System.Collections.Generic • Khai báo: ArrayList <tenmang> = new ArrayList(); List <Tenmang>=new List() List<Kiểu> <Tenmang>=new List<Kiểu> () Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 46 Các phương thức trên ArrayList, List • Add(object): Chèn thêm 1 phần tử vào cuối mảng • Clear(): Xoá tất cả các phần tử • Contains(object): Tìm object trong mảng • IndexOf(object): Tìm chỉ số của object trong mảng (-1) • RemoveAt(index): Xoá phần tử thứ index • Thuộc tính: count: cho biết số phần tử trong mảng • … Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 47 Thao tác trên File • Namespace: System.IO; • Các đối tượng thao tác trên File: Stream, StreamReader, StreamWriter, FileStream. • Thao tác trên file văn bản: StreamReader, StreamWriter. • Mở file văn bản để đọc: StreamReader <tênbiến> = new StreamReader(“dd"[,Encoding]); • Mở file văn bản để ghi: StreamWriter <tênbiến> append][,Encoding]) = new Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH StreamWriter (“dd“[, bool 48 Các phương thức trên StreamReader • • • • • • • Close(): đóng file Peek(): Trả về ký tự tiếp theo, -1;:EOF Read(): Đọc ký tự tiếp theo ReadBlock(…): Đọc dãy các byte ReadLine(): Đọc 1 dòng ReadToEnd(): Đọc hết file … Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 49 Các phương thức trên StreamWriter • Close(): đóng file • Write • WriteLine: ghi file Ví dụ: StreamWriter f = new StreamWriter("d:\\tt.txt",true,Encoding.Unicode); f.WriteLine("cộng"); f.Write("abc"); f.Close(); Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 50 Ví dụ StreamReader using System; using System.IO; … StreamReader f = new StreamReader("d:\\tt.txt"); string ht; while(f.Peek()>=0) { ht = f.ReadLine(); Response.Write(ht); } f.Close(); Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 51 DataTable - Name space: using System.Data; -Tạo bảng: DataTable bien = new DataTable("tenbang"); Tạo cột: bien.Columns.Add(“tencot"); - Tạo thêm dòng: DataRow dong=bien.NewRow(); Dong[“tencot”]=gia tri dt.Rows.Add(dr); dt.AcceptChanges(); - Bien.Rows: trả về tập hợp các dòng - Bien.Coumns: Trả về tập các cột Ví dụ về DataTable protected void Page_Load(object sender, EventArgs e) { DataTable dt = new DataTable("Sach"); // tạo ra 2 cột (field) của bảng Sach dt.Columns.Add("Masach"); // Tạo ra cột MaSach dt.Columns.Add("Tensach"); // Tạo ra cột TenSach DataRow dr = dt.NewRow();//Tạo thêm 1 dòng mới dr["Masach"] = "s1"; //Nhập dữ liệu cho cột mã sách dr["TenSach"] = "tin"; dt.Rows.Add(dr); //Thêm dòng vào dt dr = dt.NewRow(); //Tạo thêm 1 dòng mới dr["Masach"] = "s2"; dr["TenSach"] = "hoa"; dt.Rows.Add(dr); dt.AcceptChanges(); for(int i=0;i<dt.Rows.Count;i++)//Duyệt qua các dòng của dt Response.Write(dt.Rows[i][0].ToString()+":" + dt.Rows[i][1].ToString()); } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 54 Nội dung • Lớp đối tượng – Hàm dựng – Hàm huỷ – Trường – Phương thức Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 55 Lớp đối tượng Mứctruycập class <Tên lớp>: <lớp cha hoặc các giao diện> { - Hàm dựng (Constructors) – Hàm huỷ (Destructors) – Hằng (Constants) – Trường (Fields) – Phương thức (Methods) – Thuộc tính (Properties) – Chỉ mục (Indexers) – Sự kiện (Events) – Con trỏ hàm (Delegates) – Lớp con (Classes) – Giao diện (Interfaces) – Cấu trúc (Structs) } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 56 Mức truy cập Mức truy cập Mô tả public Biến hoặc phương thức có thể được truy xuất từ bất cứ nơi nào internal Biến hoặc phương thức chỉ có thể truy xuất trong phạm vi cùng assembly protected Biến hoặc phương thức chỉ có thể truy xuất từ bên trong kiểu dữ liệu mà nó thuộc về, hoặc các kiểu dữ liệu dẫn xuất protected internal Biến hoặc phương thức có thể được truy xuất trong phạm vi assembly hiện tại, hoặc từ các kiểu dữ liệu dẫn xuất từ kiểu dữ liệu chứa nó private Biến hoặc phương thức chỉ có thể được truy xuất từ bên trong kiểu dữ liệu mà nó thuộc về Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 57 Ví dụ public class Class_b { private class Class_b1 { } public class Class_b2 { } } class Program { public void test() { Class_b t2 = new Class_b(); Class_b.Class_b1 t21 = new Class_b.Class_b1(); Class_b.Class_b2 t22= new Class_b.Class_b2(); } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 58 Hàm dựng (Constructors) • Là một loại đặc biệt của phương thức trong một lớp • Được gọi khi một lớp được tạo. • Thường được sử dụng để khởi tạo các giá trị trong một lớp. • Tên trùng với tên lớp • Không trả về giá trị • Nếu không tạo ra hàm dựng C# sẽ tạo ra hàm dựng ngầm định • Một lớp có thể có nhiều hàm dựng nhưng khác nhau về số lượng hoặc kiểu của tham số Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 59 Ví dụ về Constructors using System; public class Person { public string Ten,dc=“Khong co”; public Person(string Ten) { this.Ten = Ten; } public Person(string Ten,string dc) { this.Ten = Ten; this.dc = dc; } } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 60 Ví dụ về Constructors public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { person p1 = new person("hung"); Response.Write(p1.Ten + p1.dc); person p2 = new person("Nga","hue"); Response.Write(p2.Ten + p2.dc); } } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 61 Destructor • Destructors trong C# gọi là bộ thu gom rác Garbage Collectors. • Bộ thu gom rác sẽ giải phóng bộ nhớ khi đối tượng không còn yêu cầu hoặc tham chiếu. • Destructors khai báo như sau: ~<tên hàm huỷ>()//giống tên lớp { //các cài đặt của người lập trình } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 62 Các trường (Fields) • Lưu trữ giá trị • Cú pháp: <Mứctruycập> <Kiểu> <tênfields> • Mức truy cập: public, private, protected, internal, protected internal • Kiểu: – Kiểu giá trị được định nghĩa sẳn (int,char …) – Kiểu tham chiếu: lớp, struct, mảng, chuỗi,…. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 63 Ví dụ namespace Vidu class Program { { class Class_Lop{ } static void Main(string[] args) class SinhVien { { public string hoten; SinhVien sv =new SinhVien(); private bool GioiTinh; sv.hoten = "Nguyen Nam"; protected DateTime NgaySinh; //sv.GioiTinh = false; internal float[] DsDiem = new float[100]; //sv.NgaySinh = DateTime.Parse("12/10/79"); Class_Lop Lop= new Class_Lop(); } sv.DsDiem[0] = 5; } }} Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 64 Trường tĩnh [1] • Được khai báo trong 1 lớp • Khi sử dụng không cần phải tạo ra lớp chứa trường tĩnh • Khi khai báo chỉ cần dùng static trước tên biến • Truy xuất: <tênlớp>.tên trường tĩnh Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 65 Ví dụ trường tĩnh using System; public class List { public static int Dem = 0; public List()//Hàm dựng: được gọi khi tạo lớp { Dem ++; } } public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Response.Write(List.Dem ); List n1 = new List(); Response.Write (List.Dem); List n2 = new List(); Response.Write (List.Dem); } } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 66 Phương thức(method) • Là tập hợp các câu lệnh • Được khai báo trong lớp hoặc cấu trúc, phải chỉ rõ mức truy cập, tên, kiểu trả về,danh sách các tham số. Nếu không có tham số phải có cặp dấu ngoặc • Phương thức không trả về giá trị có kiểu trả về là void • Dùng return để trả về giá trị của phương thức Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 67 Tham chiếu ref and out [1] using System; public class Point { int x; int y; public Point(int x,int y) { this.x = x; this.y = y; } public void GetPoint(int x,int y) { x = this.x; y = this.y; } } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 68 Tham chiếu ref and out [2] public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { int x = 0; //int x; --> Error int y = 0; //int y; --> Error Point p = new Point(100,200); p.GetPoint(x,y); Response.Write("({0},{1})",x,y); } } Output: (0,0) Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 69 Tham chiếu ref and out [3] using System; public class Point { int x; int y; public Point(int x,int y) { this.x = x; this.y = y; } public void GetPoint(ref int x,ref int y) { x = this.x; y = this.y; } } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 70 Tham chiếu ref and out [4] public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { int x = 0;// int x; --> Error int y = 0; // int y; --> Error Point p = new Point(100,200); p.GetPoint(ref x,ref y); Console.WriteLine("({0},{1})",x,y); } } Output: (100,200) - phải khởi tạo giá trị cho các tham số -Khi xây dựng và gọi phương thức phải dùng ref Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 71 Tham chiếu ref and out [5] using System; public class Point { int x; int y; public Point(int x,int y) { this.x = x; this.y = y; } public void GetPoint(out int x,out int y) { x = this.x; y = this.y; } } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 72 Tham chiếu ref and out [6] public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { int x; int y; Point p = new Point(100,200); p.GetPoint(out x,out y); Console.WriteLine("({0},{1})",x,y); } } Output: (100,200) •Không cần khởi tạo giá trị cho các tham số •Khi xây dựng và gọi phương thức phải dùng out Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 73 Danh sách các tham số có chiều dài thay đổi [1] • C# cho phép khai báo 1 tham số nhưng khi gọi phương thức thì số lượng tham số có thể thay đổi • Ví dụ như WriteLine(…) • Sử dụng từ khoá params để khai báo tham số có chiều dài thay đổi. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 74 Kế thừa - C# chỉ hỗ trợ đơn kế thừa, tức là một lớp chỉ có thể kế thừa nhiều nhất là từ một lớp cha - Lớp cơ sở nhất trong C# là lớp System.Object class LopCon : LopCha { Cai dat lop con} Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 75 Ví dụ về kế thừa [1] using System; public class Person { protected string name; //protected Field public Person(string name) //Function as a Constructor { this.name = name; } } public class Employee:Person { public Employee(string name):base(name){} } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 76 Ví dụ về kế thừa [2] public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Person p1 = new Person("Harry Potter"); Respone.Write(p1.name); } } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 77 Ví dụ về kế thừa [3] • Person là lớp cơ sở (lớp cha). • Employee là lớp dẫn xuất (lớp con) từ lớp Person, vì thế: – Nó kế thừa tất cả các dữ liệu và hàm thành viên của lớp cha (trừ private) – Constructors không tự động kế thừa lên lớp cha, do đó người sử dụng phải chỉ rõ: public Employee(string name):base(name){…} Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 78 Hàm nạp chồng (Overloading ) • Hàm nạp chồng là hàm trùng tên trong một lớp nhưng khác nhau về số lượng và kiểu của các tham số • Không nạp chồng dựa vào tên tham số và kiểu trả về của các tham số. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 79 Ví dụ [2] class TinhDt { public double Dt(double r) { return ((double)Math.PI*r*r); } public double Dt(double a,double b) { return a*b; } public double Dt(double a,double b,double c) { double p=(a+b+c)/2; return Math.Sqrt(p*(p-a)*(p-b)*(p-c)); } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 80 Ví dụ [3] public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { TinhDt DienTich=new TinhDt(); Console.WriteLine("Dt HT {0}",DienTich.Dt(3)); Console.WriteLine("Dt HCN {0}",DienTich.Dt(3,4)); Console.WriteLine("Dt HTG{0}",DienTich.Dt(3,4,5)); } } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 81 Hàm ghi đè (Overriding) [1] Hàm ghi đè là hàm giống nhau trên cả lớp cha và lớp con. Để ghi đè một hàm đã có trên lớp cha: Khai báo một hàm mới trong lớp con với tên giống với lớp cha. Sử dụng từ new. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 82 Hàm ảo (Virtual Functions) [1] • Cách xây dựng hàm ảo giống như hàm ghi đè nhưng sử dụng từ khoá virtual trong hàm của lớp cha và override trong hàm của lớp con • Khi gọi hàm, trình biên dịch sẽ nhìn vào lớp thực sự được tạo ra và gọi hàm tương ứng trên lớp này Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 83 Giao diện (Interfaces) • Giao diện giống như lớp trừu tượng • Chứa các phương thức trừu tượng nhưng không cài đặt. • Một lớp kế thừa lên 1 giao diện phải cài đặt tất cả các phương thức trên giao diện đó. • Một lớp chỉ kế thừa lên 1 lớp khác nhưng có thể kế thừa trên nhiều giao diện. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 84 Ví dụ [1] using System; interface Music { void PlayMusic(string filename); void EndPlay(); } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 85 Ví dụ [2] public class Winamp:Music { public Winamp() { } public void PlayMusic(string filename) { … } public void EndPlay() { … } } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 86 THUỘC TÍNH • Giới thiệu • Các loại của thuộc tính • Thuộc tính và trường • Thuộc tính và phương thúc • Thuộc tính tĩnh Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 87 Giới thiệu [1] • Thuộc tính trong 1 lớp được sử dụng để lấy và thay đổi giá trị trong lớp. • Một thuộc tính thường có 2 khối lệnh: – Get: trả về một giá trị – Set: Gán một giá trị mới – Từ khoá value được sử dụng để xác định giá trị được gán trong khối set. • Giống như hàm thuộc tính có thể dùng bổ từ virtual, override, abstract, static Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 88 Ví dụ [2] using System; public class Person { string name; // Field public string Name // Property { get { return (name); } set { name = value; } } } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 89 Ví dụ [3] public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Person p = new Person(); p.Name = "John Smith"; Response.Write("Person name is {0}",p.Name); } } Output: Person name is John Smith Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 90 Các loại thuộc tính • Read/Write: Thuộc tính có cả get và set. • Read-Only: Thuộc tính chỉ có get. • Write-Only: Thuộc tính chỉ có set. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 91 Xử lý ngoại lệ (Exception Handling) • • • • Dùng Trying và Catching Kiến trúc của ngoại lệ Truyền ngoại lệ Sử dụng Finally Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 92 Ngoại lệ [1] • Ngoại lệ được phát sinh khi chạy chương trình bị lỗi. • Ngoại lệ cung cấp đầy đủ thông tin về lỗi xẩy ra. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 93 Kiến trúc phân tầng của ngoại lệ [2] Exception IOException System Exception OutOfMemoryException OverflowException CoreException NullReferencException Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 94 Trying và Catching [1] • Khối try chứa đoạn chương trình • Khối catch xử lý lỗi, khi có lỗi xảy ra. • Dùng 1 khối try nhưng có thể nhiều khối catch • Không có try và catch chương trình dừng lại (treo) và đưa ra lỗi. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 95 Trying và Catching [2] using System; class Test { public static void Main() { int Zero = 0; try { int j = 22 / Zero; } catch (Exception e) { //Xử lý lỗi } } Các lệnh sau catch } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 96 Trying và Catching [3] int Zero = 0; try { int j = 22 / Zero; } catch (DivideByZeroException e) { //Xử lý lỗi1 } catch (Exception e) { ////Xử lý lỗi 2 } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 97 Trying và Catching [4] Kết quả hiển thị: Loi 1:Attempted to divide by zero. Sau catch Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 98 Truyền ngoại lệ [1] • Trong 1 số trường hợp chúng ta không xử lý khi lỗi xảy ra, chúng ta cần truyền các lỗi này đến hàm gọi nó • Có 3 cách để làm điều này: – Không xử lý lỗi – Truyền lỗi đến hàm được gọi – Truyền lỗi cụ thể đến hàm được gọi. Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 99 Truyền ngoại lệ[2] • Không xử lý lỗi using System; public class SumClass { int sum = 0; int count = 0; int average = 0; public void CalculateAverage() { try { average = sum/count; } catch{} } } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 100 Truyền ngoại lệ [4] • Bắt lỗi, sau đó truyền lỗi này đến hàm được gọi using System; public class SumClass { int sum = 0; int count = 0; int average = 0; public void CalculateAverage() { try { average = sum/count; } catch (DivideByZeroException e) { throw e; } } } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 101 Truyền ngoại lệ[6] • Xử lý lỗi, sau đó truyền các lỗi đã xử lý đến hàm được gọi. using System; public class SumClass { int sum = 0; int count = 0; int average = 0; public void CalculateAverage() { try { average = sum/count; } catch (DivideByZeroException e) { throw (new DivideByZeroException(“Loi roi:")); } } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH } 102 Sử dụng Finally • Khối Finally chứa đoạn chương trình luôn luôn thực hiện cho dù có phát sinh lỗi hay không? try { //đoạn chương trình } catch { //Xử lý lỗi } finally { //đoạn chương trình luôn thực hiện } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 103 Thực hành • Tạo 1 Project với tên ThucHanh • Tạo file ds.txt (Project -> Add New Item -> Text File -> Name: ds.txt) với nội dung: sv1|Lê thàng nam|5|Tink32 sv2|Đỗ chữ|9|TinK32 sv3|Đỗ văn Nam|10|Tink31 Sv4| Nguyễn Hoàng Nam|2|TinK31 Sv5|Trần dũng|3|HoaK19 Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 104 Thực hành • Tạo lớp CauHinh để kết nối đến file ds.txt using System.IO ; namespace ThucHanh { public class CauHinh { public static StreamReader f; public CauHinh(string DD) { f = new StreamReader(DD); } } } Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 105 Tạo Lớp SinhVien using System.Collections.Generic ; namespace ThucHanh { public class SinhVien { private string masv; public string Masv { get { return masv; } set { masv = value; } } private string hoten; public string Hoten { get { return hoten; } set { hoten = value; } } private double dtb; public double Dtb { get { return dtb; } set { dtb = value; } } private string tenlop; public string Tenlop { get { return tenlop; } set { hoten = value; } } public SinhVien(string masv, string ht, double dtb, string tenlop) { this.masv = masv; this.hoten = ht; this.dtb = dtb; this. tenlop= tenlop } }} Tạo 1 lớp: LopHoc chứa các sinh viên using System.Collections.Generic ; using System.Data; namespace ThucHanh { public class LopHoc { public List<SinhVien> LstSinhvien ; public DataTable DtSinhVien ; public LopHoc()//Hàm dựng { LstSinhvien = new List<SinhVien>();//Tạo List DtSinhVien = new DataTable("Sinhvien"); //Tao DataTable DtSinhVien.Columns.Add("Masv");//Tạo các cột của bảng DtSinhVien.Columns.Add("Hoten"); DtSinhVien.Columns.Add("DTB"); DtSinhVien.Columns.Add(“TenLop"); while (true)//Duyệt file ds.txt { string st = CauHinh.f.ReadLine();//Đọc ra 1 dòng if (st == "" || st == null) { CauHinh.f.Close(); break; } string[] tam = st.Split('|');//Tách ra các thông tin SinhVien sv = new SinhVien(tam[0],tam[1],double.Parse(tam[2]), tam[3] ); LstSinhvien.Add(sv);//Nạp dữ liệu vào List DataRow dr = DtSinhVien.NewRow(); //Tạo 1 dòng mới trên bảng dr["masv"] = tam[0]; dr["hoten"] = tam[1]; dr["DTB"] = double.Parse(tam[2]); dr[“tenlop"] = tam[3]; DtSinhVien.Rows.Add(dr); DtSinhVien.AcceptChanges(); } } } } Lập trình trên sự kiện Page_Load của trang Default.aspx protected void Page_Load(object sender, EventArgs e) { //Tạo ra đường kết nối đến file tt.txt CauHinh kn = new CauHinh(Server.MapPath("ttt.txt")); LopHoc sv = new LopHoc(); //Hiển thị các sinh viên trên List Response.Write("Danh sach cac sinh vien tren List "); for (int i = 0; i < sv.LstSinhvien.Count; i++) { Response.Write(sv.LstSinhvien[i].Masv +"<br>"); Response.Write(sv.LstSinhvien[i].Hoten + "<br>"); Response.Write(sv.LstSinhvien[i].Dtb.ToString() + "<br>"); } //Hiển thi các sinh viên trên DataTable Response.Write("Danh sach cac sinh vien tren DataTable "); for (int i = 0; i < sv.DtSinhVien.Rows.Count; i++) { Response.Write(sv.DtSinhVien.Rows[i]["Masv"].ToString() + "<br>"); Response.Write(sv.DtSinhVien.Rows[i]["hoten"].ToString() + "<br>"); Response.Write(sv.DtSinhVien.Rows[i]["DTB"].ToString() + "<br>"); } } • Trên lớp: LopHoc viết các phương thức để: – Hiển thị các sinh viên lên lớp – Hiển thị các sinh viên ở lại – Tính TBC của ĐTB của các sinh viên – Tạo file olai.txt để lưu các sinh viên ở lại – Xóa các sinh viên ở lại ra khỏi file ds.txt Chương 4 LẬP TRÌNH ỨNG DỤNG WEB VỚI ASP.NET Nội dung • • • • Kiến trúc của ứng dụng Web Công nghệ phát triển ứng dụng Web (động) Kiến trúc HTML Web động • Nội dung được Web Server sinh ra khi có yêu cầu từ Client. • Nội dung hiển thị tại các lần duyệt khác nhau là khác nhau. • Rất phổ dụng: Hầu hết các trang web thương mại đều là web động. • Sử dụng ngôn ngữ lập trình để sinh ra trang HTML. • Sử dụng CSDL. Web động Web động http://www.... Web Browser Web Server Nội dung (HTML) Yêu cầu dữ liệu Dữ liệu Database Provider Dữ liệu Thao tác CSDL CSDL Công nghệ phát triển Web (động) • Đa dạng và không ngừng được phát triển. • Microsoft: ASP, ASP.NET • Sun: Java Servelet, JSP. • Khác: PHP ASP.NET - Kiến trúc ASPX .ASPX ASP.NET - Kiến trúc Client (Browser) ASP.DLL ActiveX Data Objects (ADO) Database IIS ASP file VBScript JavaScript ASP.NET – Đặc điểm • Hướng đối tượng: Mỗi trang bao gồm hai đối tượng kế thừa nhau. • Tách mã giao diện (HTML) với mã xử lý bằng kỹ thuật Codebehind. • => Dễ viết chương trình, tìm lỗi. • => Giấu được mã (mã được dịch thành DLL). .aspx .aspx.cs ASP.NET – Đặc điểm (2) • Các điều khiển phía Server (server-side controls). • => Có thể xử lý tất cả trên server. – <form id="Form1" method="post" runat="server"> </form> – <asp:Button id="Button1" runat="server" Text="Tìm kiếm"></asp:Button> – <asp:TextBox id="txtUserName" runat="Server"/> – <input type = “text” id = “hoten” runat=“server”> ASP.NET – Đặc điểm (3) • Các điều khiển phía Server (server-side controls). – Auto PostBack cho từng điều khiển => Bắt sự kiện trên điều khiển đơn giản. • <asp:CheckBox id="CheckBox1" runat="server" AutoPostBack="True" ></asp:CheckBox> ASP.NET – Đặc điểm (3) • Các điều khiển phía Server (serverside controls). – Kiểm tra hợp thức (validation) • Cần mã – Tùy biến (CustomValidator) • Không cần mã – – – – Yêu cầu nhập (RequiredFieldValidator) Trong khoảng (RangeValidator) So sánh (CompareValidator) Biểu thức chung (RegularExpressionValidator) HTML Khái niệm HTML (HyperText Markup Language) là ngôn ngữ định dạng văn bản siêu liên kết. Sự định dạng dựa trên các tab hoặc các đoạn mã đặc biệt để đánh dấu một văn bản, một file ảnh ... giúp cho Web Brower thông dịch và hiển thị chúng lên màn hình. HTML có những phần mở rộng rất quan trọng cho phép những liên kết hypertext từ một tài liệu này đến một tài liệu khác. Cấu trúc cơ bản của một file HTML <HTML> <HEAD> <TITLE> <Tiêu đề> </TITLE> </HEAD> <BODY> <Phần thân> </BODY> </HTML> Giới thiệu 1 số thẻ HTML • <B>, <U>, <I> • <Table>, <tr>, <td> • <Img src=“file ảnh”> • <Marquee> • <A href =“url?ts1=gtri1&ts2=gt2&…&tsn=gtn”> Tên liên kết </a> • <Form> Ví dụ: Các thẻ HTML Các điều khiển phía Server Label PROPERTIES ID: tên của Label Text: Tiêu đề <asp:Label ID="Label1" runat="server" Text="Label"> </asp:Label> TextBox PROPERTIES ID TextMode Text Events TextChanged AutoPostBack <asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True" ontextchanged="TextBox1_TextChanged"></asp:TextBox> Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 129 Button PROPERTIES Events ID Text <asp:Button ID="ButDangNHap" runat="server" onclick="ButDangNHap_Click" Text="Dang NHap" /> Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 130 LinkButton PROPERTIES Events ID Text PostBackUrl <asp:LinkButton ID="LinkTheThao" runat="server" PostBackUrl="Thethao.aspx"> Thể thao</asp:LinkButton> Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 131 DropDownList (ListBox) PROPERTIES ID Events SelectedIndexChanged Text AutoPostBack <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" onselectedindexchanged="DropDownList1_SelectedIndexChanged"> </asp:DropDownList> Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 132 Nạp dữ liệu DropDownList (ListBox) • • • • <Tên DropDownList>.DataSource = list hoặc DataTable; <Tên DropDownList>.DataValueField = “Tên trường"; <Tên DropDownList>.DataTextField = “Tên trường"; <Tên DropDownList> .DataBind(); CauHinh ch=new CauHinh(Server.MapPath(“ds.txt")); LopHoc lh= new LopHoc(); DropDownList1.DataSource = lh.DtSinhVien; DropDownList1.DataValueField = "masv"; DropDownList1.DataTextField = "hoten"; DropDownList1.DataBind(); Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 133 Image PROPERTIES ID ImageUrl <asp:Image ID="Image1" runat="server" ImageUrl="~/image_sach/b1.jpg" /> Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 134 FileUpload PROPERTIES ID Methoad SaveAs <asp:FileUpload ID="FileUpload1" runat="server" /> Nguyễn Hoàng Hà - Khoa CNTT-ĐHKH 135 GridView <tên GridView>.DataSource =List, DataTable <tên GridView>.DataBind() CauHinh ch = new CauHinh(Server.MapPath(“ds.txt")); LopHoc lh = new LopHoc(); GridView1.DataSource = lh.DtSinhVien; GridView1.DataBind(); DataList <Tên DataList>.DataSource =list, DataTable; <Tên DataList>.DataBind(); CauHinh ch = new CauHinh(Server.MapPath(“ds.txt")); LopHoc lh = new LopHoc(); DataList1.DataSource = lh.DtSinhVien; DataList1.DataBind(); Ví dụ Tạo trang HtSinhVien.aspx với giao diện: Từ ToolBox: -Tạo 2 Label -1 DropDownList: với tên DropDownList1, thuộc tính AutoPostBack=true -1 GridView với tên GridView 1 Lập trình trên sự kiện Page_Load của trang để nạp các tên lớp vào DropDownList protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { CauHinh ch = new CauHinh(Server.MapPath(“ds.txt")); LopHoc lh = new LopHoc(); List<SinhVien> lssv = lh.LstSinhvien; List<SinhVien> tam = new List<SinhVien>(); for (int i = 0; i < lssv.Count; i++) { string tenlop = lssv[i].Tenlop; int j; for (j = 0; j < i; j++) if (tenlop.Equals(lssv[j].Tenlop )) break; if (j == i) tam.Add(lssv[i]); } DropDownList1.DataSource = tam; DropDownList1.DataTextField = "tenlop"; DropDownList1.DataBind(); } } Lập trình trên sự kiện SelectedIndexChanged của DropDownList để tìm sinh viên theo tên lớp protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { CauHinh ch = new CauHinh(Server.MapPath("ttt.txt")); LopHoc lh = new LopHoc(); List<SinhVien> lssv = lh.LstSinhvien; List<SinhVien> tam = new List<SinhVien>(); string tenlop = DropDownList1.Text ; for (int i = 0; i < lssv.Count; i++) { if (tenlop.Equals(lssv[i].Tenlop)) tam.Add(lssv[i]); } GridView1.DataSource = tam; GridView1.DataBind(); } } Tạo trang thongke.aspx Từ ToolBox tạo 1 ListBox để hiển thị tất cả các tên lớp - Khi chọn 1 tên lớp trên ListBox sẽ hiển thị các sinh viên của lớp này ra Gridview - Khi chọn nút Danh sách lên lớp sẽ hiển thị danh sách các sinh viên lên lớp (đtb>=5) của lớp chọn ở ListBoxx ra GridView và hiển thị số sinh viên lên lớp - Tương tự cho nút Danh sách sinhviên ở lại LÀM VIỆC VỚI STYLESHEET • CSS thực chất là một tập các qui tắc để format/ định kiểu (style) cho các phần tử được hiển thị và định vị trên trang web. Nhờ vào CSS mà việc định dạng (kiểu) cho các phần tử trở nên dễ dàng và linh hoạt hơn rất nhiều. LÀM VIỆC VỚI STYLESHEET • Các định nghĩa về CSS có thể được đặt ngay trong tệp nguồn nhưng cũng có thể được đặt riêng ra một tệp khác. Tệp này thường có đuôi mở rộng là css. LÀM VIỆC VỚI STYLESHEET • Tạo 1 file CSS • Web site -> Add New Item -> STYLESHEET > Gõ tên file •Nội dung của tệp chỉ chứa các định nghĩa CSS (Gồm định nghĩa bộ chọn thẻ, chọn ID, và lớp). LÀM VIỆC VỚI STYLESHEET • • • • Kích chuột phải trang -> Add Style Rule Element: định dạng lại các thẻ đã có ( Ví dụ a: hover) Class name: Tạo 1 lớp mới (ví dụ: .Mau) Element Id: Tạo 1 ID để các phần tử có cùng ID sẽ định dạng giống nhau( ví dụ: #TieuDe) LÀM VIỆC VỚI STYLESHEET • Kích chuột phải lên vị trí cần định dạng -> Add Style -> Chọn mục cần định dạng như hình trên LÀM VIỆC VỚI STYLESHEET • Nạp file Css vào trang: Mở trang ở chế độ Source và dùng thẻ: <link rel ="stylesheet" type ="text/css" href =“Tên file Css.css" /> ở thẻ <head> SỬ DỤNG WEB USER CONTROL • UserControl là thành phần có sẵn của ASP.NET, cho phép ta thiết kế điều khiển dựa trên các kỹ thuật mà ta đã lập trình trên trang ASP.NET. • Khi sử dụng UserControl, ta phải nhúng chúng vào trang ASP.NET thay vì thực thi một mình giống như trang ASP.NET, phần mở rộng của UserControl là ASCX. • Sau khi thiết kế xong UserControl ta chọn chúng từ cửa sổ Solution Explored và kéo thả vào trang ASP.NET • Để để quản lý ta tạo một thư mục để lưu các WebUserControl: • Web Site | New Folder| gõ tên thư mục là UC SỬ DỤNG WEB USER CONTROL + Tạo ra 1 WebUserControl: Kích chuột phải lên tên thư mục UC | Add New Item | Web User Control | gõ tên WebUserControl | Add: CÁC ĐỐI TƯỢNG ASP.NET GIỚI THIỆU • Active Server Pages (ASP): là kịch bản chạy ở phía Server, cung cấp 1 WebServer có thể xử lý các ứng dụng logic và trả về HTML cho browser. • Web Forms: Cung cấp các công cụ để thiết kế và soạn thảo Form • Design: hiển thị bố cục của trang • Source: Hiển thị mã tự động phát sinh khi tạo trang Web. • Web.config: là file XML chứa cấu hình trong project . • Global.asax là file tự chọn được sử dụng để thao tác trên các sự kiện ở mức ứng dụng. • *.aspx, *.aspx.cs: Desgn, Codebehind Thư mục ảo Request and Response • Resquest: – Nhận yêu cầu từ Client gởi đến Server khi nút Submit được nhấn. – Khi nhấn nút Submit thì dữ liệu của các điều khiển bên trong Form sẽ được gởi đến Server (Post). – Để nhận được dữ liệu gởi từ Form (client): • Request.Form[“tên điều khiển”]; • Để nhận được tham số gởi bằng Get (Dùng thể <A>) • Request.QueryString[“tên tham số]); • Response: – Gởi dữ liệu từ Client đến Server – Phương thức: • Write(dữ liệu); • Redirect(“URL”); Request and Response Nhap.htm <body> <form method="POST" action="NHAPHTML.ASPX"> <p>Mã Loại:<input type="text" name="txtma" size="20"></p> <p>Tên Loại<input type="text" name="txtten" size="20"></p> <p> <input type="submit" value="Nhap" name="Nhap"> </p> </form> </body> NhapHtml.aspx protected void Page_Load(object sender, EventArgs e) { string ma = Request.Form["txtma"]; string ten = Request.Form["txtten"]; Response.Write("Mã Loai:" + ma); Response.Write("<br>Tên Loại" + ten); } Đối tượng Server Cú pháp Methods Server.property | method HTMLEncode MapPath MachineName cn = new OleDbConnection("provider=microsoft.jet.oledb.4.0;data source=" + Server.MapPath("qlthuvien.mdb")); Response.Write(“<b>alo</b>”); Response.Write(Server.HtmlEncode(“<b>alo</b>”)); Đối tượng Session • Lưu trữ các thông tin của người dùng trong 1 phiên làm việc. • Biến lưu trữ trong Session không bị xoá đi khi người dùng chuyển từ trang này sang trang khác. • WebServer sẽ tự động tạo ra khi người dùng yêu cầu 1 trang web, bị giải phóng khi kết thúc phiên làm việc • Session[“tên biến” ]= object Tạo lớp Global để khởi tạo các Session Project -> Add New Item -> Global Application Class Khởi tạo các Session Ví dụ 1 • Tạo một Website để sinh viên mượn sách trong thư viện bao gồm các WebPage: – – – – Qlthuvien.aspx: Chứa giao diện chính Dangky.Aspx: Đăng nhập. Hienthi. Aspx: Hiển thị tất cả các sách Mượn. Asp: mượn sách. • Yêu cầu: người sử dụng phải đăng nhập mới được xem hoặc mượn sách. • Ta phải tạo ra 1 phiên làm việc (Session) để kiểm tra xem người dùng đã đăng nhập chưa? Qlthuvien.aspx protected void LinkButton3Dn_Click(object sender, EventArgs e) { Response.Redirect("Dangky.aspx"); } protected void LinkButton1HT_Click(object sender, EventArgs e) { Response.Redirect("Hienthi.aspx"); } ….. DangKy.aspx protected void ButDangNhap_Click(object sender, EventArgs e) { Session["ID"] = TextID.Text; .... } HienThi.aspx protected void Page_Load(object sender, EventArgs e) { if (Session["Id"] == null || Session["Id"] == "") Response.Redirect("~/Dangky.aspx"); // } Bài thực hành (Session) Tạo ra trang Web đơn giản để mua hàng trên mạng: GridView1 Tạo lớp GioHang.cs để nhập thêm 1 hàng vào giỏ public class Giohang { public DataTable dt = new DataTable("Hang"); public Giohang() { dt.Columns.Add("TenHang"); dt.Columns.Add("Soluong"); } public void ThemGiohang(string th,string sl) { DataRow dr = dt.NewRow(); dr[0] = th; dr[1] = sl; dt.Rows.Add(dr); dt.AcceptChanges(); } Lập trình trên nút mua và giỏ hàng protected void butMua_Click(object sender, EventArgs e) { if (Session["gh"] == null) gh = new Giohang(); else gh = (Giohang) Session["gh"]; gh.ThemGiohang(DropDownList1.Text, textSoluong.Text); Session["gh"] = gh; } protected void ButGioHang_Click(object sender, EventArgs e) { Giohang gh = (Giohang)Session["gh"]; if (gh != null) { GridView1.DataSource = gh.dt; GridView1.DataBind(); } } Yêu cầu bổ sung • Tạo CSDL qlhang.mdb bao gồm bảng hang(mahang,tenhang,gia), khachhang(hoten,diachi,tenhang,soluong,thanhtien). • DropDownList1 Hiển thị tất cả các tên hàng của bảng hàng • Trong giỏ hàng thêm trường ThanhTien=Sốlượng * giá. • Kiểm trả xem trong giỏ hàng nếu đã có tên hàng thì tăng số lượng, tính lại thành tiền. • Tạo thêm nút Thanh Toán: người dùng nhập họ tên và địa chỉ và chuyển tất cả hàng trong giỏ hàng vào bảng Khachhang Biến Application • Dùng để quản lý các biến có phạm vi toàn ứng dụng. Có tác dụng đến mọi người dùng. • Biến toàn ứng dụng là biến có tác dụng đối với mọi người dùng truy cập vào website. Mọi trang aspx đều có thể truy cập đến biến này và dù ở bất kỳ thời điểm nào. • Application[“tên biến"] = <giá trị> • Khởi tạo giá trị biến trong Application_Start của lớp Global Giới thiệu LINQ (Language Integrated Query) là sự mở rộng của .Net Frame Work. Nó bao gồm ngôn ngữ tích hợp truy vấn, là sự mở rộng C# và Visual Basic với cú pháp ngôn ngữ riêng cho các truy vấn và cung cấp các thư viện để truy xuất dữ liệu. Ví sao phải dùng LINQ? Data IS Everywhere But Data != Objects Ví sao phải dùng LINQ ? Objects Data != Kiến trúc của LINQ • LINQ to Objects: Cung cấp các khả năng để truy vấn IEnumerable <T>, dựa trên mảng, collections và list • LINQ to XML: giúp cho người lập trình thao tác trên các truy vấn XPath / XQuery một cách nhanh chóng và hiệu quả. • LINQ to SQL: Được sử dụng để truy cập các đối tượng cơ sở dữ liệu quan hệ như các đối tượng .NET. LINQ to SQL tích hợp SQL dựa trên các định nghĩa của lược đồ. Cung cấp cách đánh mạnh mẽ, kiểm tra cú pháp, IntelliSense trên các đối tượng SQL. • LINQ to DataSet: Cung cấp các khả năng để truy vấn ADO.NET Dataset. • Linq to Entities: cung cấp khả năng truy vấn trên các thực thể ADO.NET. Giới thiệu • LINQ to SQL là một phiên bản hiện thực hóa của ORM (object relational mapping) có bên trong .NET Framework 3.5, cho phép mô hình hóa một cơ sở dữ liệu dùng các lớp .NET. Sau đó bạn có thể truy vấn cơ sở dữ liệu (CSDL) dùng LINQ, cũng như cập nhật/thêm/xóa dữ liệu từ đó. • LINQ to SQL hỗ trợ đầy đủ transaction, view và các stored procedure (SP). Nó cũng cung cấp một cách dễ dàng để thêm khả năng kiểm tra tính hợp lệ của dữ liệu và các quy tắc vào trong mô hình dữ liệu Tạo CSDL trong SQL SERVER 2005 CSDL này được sử dụng trong toàn bộ chương trình Kết nối đến CSDL - View -> Server Explorer - Kích phải chuột lên DataConnection -> Add Connection Hiệu chỉnh đường kết nối trong file Web.config Tạo ra mô hình dữ liệu LINQ TO SQL • Tạo ra lớp DataContext – Project -> Add New Item -> LINQ To SQL Classes -> tại Name gõ tên: QlNvDb.dbml – Mở cửa số Server Explorer -> chọn Table -> Giữ phím Ctrl đồng thời chọn tất cả các bảng -> kéo các bảng này vào cửa sổ của file QlNvDb.dbml Tạo ra mô hình dữ liệu LINQ TO SQL Các thành phần của lớp DataContext Các thành phần của lớp DataContext Các thành phần của lớp DataContext Các thành phần của lớp DataContext Các truy vấn Biểu thức truy vấn Biến địa phương kiểu tham chiếu Biểu thức Lambda Các phương thức mở rộng Kiểu nặc danh Khởi tạo các đối tượng Các toán tử trong LINQ TO SQL Select Select manv, hoten from nhanvien Take, Skip select top 2 manv, hoten from nhanvien •Lấy về giá trị của dòng 5 và 6 db.NhanViens.Skip(4).Take(2); Order by select manv, hoten, hesoluong from nhanvien order by hesoluong desc Distinct select distinct madonvi from nhanvien var q = (from p in db.NhanViens select new { madv=p.MaDonVi }).Distinct() ; Where select manv, hoten, hesoluong from nhanvien where madonvi='dv1' Where select manv, hoten, hesoluong from nhanvien where hoten like N‘%Nguyễn%' Join select manv, hoten, tendonvi from donvi inner join nhanvien on donvi.madonvi=nhanvien.madonvi Group select TenDonVi,sum(hesoluong*830000) from donvi inner join nhanvien on donvi.madonvi=nhanvien.madonvi group by TenDonVi var q = from dv in db.DonVis join nv in db.NhanViens on dv.MaDonVi equals nv.MaDonVi group nv by dv.TenDonVi into kq select new{Madv=kq.Key , Tongluong=kq.Sum(t=>t.HeSoLuong*830000)}; Các hàm tập hợp select sum(hesoluong*830000) from nhanvien Select avg(hesoluong) from nhanvien Select count(*) from nhanvien Select Max(hesoluong) from nhanvien Select Min(hesoluong) from nhanvien var l = db.NhanViens.Sum(nv => nv.HeSoLuong * 830000); var tb = db.NhanViens.Average(nv => nv.HeSoLuong ); var snv = db.NhanViens.Count(); var max = db.NhanViens.Max(nv => nv.HeSoLuong); var min = db.NhanViens.Min(nv => nv.HeSoLuong); Thêm Insert into nhanvien values('nv123',N'Nguyễn Hoàng Hà','11/22/1976',1,3,'dv1') Xóa Delete from nhanvien where manv=‘nv1’ //Nếu xóa nhiều nhân viên dbDataContext db = new dbDataContext(); foreach(loai l in db.Nhanviens.Where(p=>p.Manv==“nv1")) db. Nhanviens..DeleteOnSubmit(l); db.SubmitChanges(); Sửa update nhanvien set hesoluong=hesoluong+1 where madonvi='dv1' Sử dụng thủ tục và View TimNv “lý” LinqDatasource Từ Data trên ToolBox chọn 1 LinqDataSource Buộc dữ liệu vài GridView