BAI GIANG LAP TRINH WEB BANG ASP,NET

advertisement
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
Download