Tải bản đầy đủ (.pdf) (22 trang)

hướng dẫn lập trình winform và webform với c#.net [hướng dẫn thực hành một số ứng dụng cơ bản]

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (879.87 KB, 22 trang )


1

BÀI 1: ỨNG DỤNG CONTROL WEBBROWSER XÂY DỰNG FORM HỖ TRỢ TRỰC
TUYẾN NHƯ TRÊN WEBSITE

+ Bài viết này giúp các bạn xây dựng chức năng hỗ trợ trực tuyến cho ứng dụng
của bạn thông qua nick yahoo, skype.
+ Để xây dựng chức năng này ta dùng Control WebBrowser có sẵn trong .net.



Để xây dựng được ứng dụng trên ta làm như sau :

B1: Chọn Control WebBrowser trong danh sách các đối tượng của .Net

2



B2 : Vào hàm khởi tạo của Form chúng ta viết đoạn mã để chèn các đoạn mã Html
của chức năng hỗ trợ trực tuyến


3



B3: Lưu lại và chạy chương trình để có kết quả mong muốn.

4




BÀI 2: ĐỊNH DẠNG KIỂU DATETIME C#

Trong bài này sẽ hướng dẫn cách định dạng kiểu ngày tháng trong C#, sử dụng
hàm String.Format. Tất cả các kiểu định dạng cũng có thể dùng
DateTime.ToString.

Tùy chỉnh định dạng ngày tháng
Có các định dạng tùy chỉnh sau đây: y (năm), M (tháng), d (ngày), h (giờ 12), H (giờ
24), m (phút), s (thứ hai), f (phần nhỏ của giây), F (phần nhỏ của giây, không bao gồm
số 0 sau cùng), t (PM hoặc AM) và z (múi giờ).
Những ví dụ sau minh họa cụ thể giá trị đầu ra của các kiểu định dạng.
/Khởi tạo thời gian date time 2008-03-09 16:05:07.123
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);
String.Format("{0:y yy yyy yyyy}", dt); // "8 08 008 2008" năm
String.Format("{0:M MM MMM MMMM}", dt); // "3 03 Mar March" tháng
String.Format("{0:d dd ddd dddd}", dt); // "9 09 Sun Sunday" ngày
String.Format("{0:h hh H HH}", dt); // "4 04 16 16" giờ 12/24
String.Format("{0:m mm}", dt); // "5 05" phút
String.Format("{0:s ss}", dt); // "7 07" giây
String.Format("{0:f ff fff ffff}", dt); // "1 12 123 1230" phần nhỏ của giây
String.Format("{0:F FF FFF FFFF}", dt); // "1 12 123 123" phần nhỏ của giây (không
có số 0)
String.Format("{0:t tt}", dt); // "P PM" A.M. or P.M.
String.Format("{0:z zz zzz}", dt); // "-6 -06 -06:00" muối giờ
Sử dụng dấu phân cách”/” , “:”. Các ký tư này sẻ được chèn vào kết quả đầu ra, để
xác đinh thời gian.
//Dấu phân cách trong định dạng của người Đức là "." (chuyển "/" =>".")
String.Format("{0:d/M/yyyy HH:mm:ss}", dt);// "9/3/2008 16:05:07" - english (en-US)

String.Format("{0:d/M/yyyy HH:mm:ss}", dt);// "9.3.2008 16:05:07" - german (de-DE)
//Dưới đây là một vài ví dụ về tùy chỉnh định dạng kiểu DateTime
//Định dạng tháng/ngày/năm với ký tự "0" và không có ký tự "0"
String.Format("{0:M/d/yyyy}", dt); // "3/9/2008"
String.Format("{0:MM/dd/yyyy}", dt); // "03/09/2008"
//Lấy tên của ngày/tháng
String.Format("{0:ddd, MMM d, yyyy}", dt); // "Sun, Mar 9, 2008"
String.Format("{0:dddd, MMMM d, yyyy}", dt); // "Sunday, March 9, 2008"
//Lấy năm với 2, 4 ký tự
String.Format("{0:MM/dd/yy}", dt); // "03/09/08"
String.Format("{0:MM/dd/yyyy}", dt); // "03/09/2008"
Định dạng Datetime với các kiểu mẫu được định sẳn.
Trong DateTimeFormatInfo có các kiểu mẫu định sẳn cho các culture hiện hành. Ví dụ
ShortTimePattern định dạng h:mm tt cho en-US culture và định dạng HH:mm cho de-
DE culture.
Bảng sau cho thấy các kiểu mẫu định sẳn trong DateTimeFormatInfo đươc định theo
en-US culture. Cột đầu tiên chỉ ra các kiểu mẫu được định sẳn.
Kiểu
mẫu
DateTimeFormatInfo
Giá trị định sẳn (en-US culture)
T
ShortTimePattern
h:mm tt

5

D
ShortDatePattern
M/d/yyyy

T
LongTimePattern
h:mm:ss tt
D
LongDatePattern
dddd, MMMM dd, yyyy
F
(combination of D and t)
dddd, MMMM dd, yyyy h:mm tt
F
FullDateTimePattern
dddd, MMMM dd, yyyy h:mm:ss tt
G
(combination of d and t)
M/d/yyyy h:mm tt
G
(combination of d and T)
M/d/yyyy h:mm:ss tt
m, M
MonthDayPattern
MMMM dd
y, Y
YearMonthPattern
MMMM, yyyy
r, R
RFC1123Pattern
ddd, dd MMM yyyy HH':'mm':'ss
'GMT' (*)
S
SortableDateTimePattern

yyyy'-'MM'-'dd'T'HH':'mm':'ss (*)
U
UniversalSortableDateTimePat-
tern
yyyy'-'MM'-'dd HH':'mm':'ss'Z' (*)


(*) = không phụ thuộc vào culture
Ví dụ sau minh họa cách sử dụng kiểu mẫu định sẳn.
String.Format("{0:t}", dt); // "4:05 PM" ShortTime
String.Format("{0:d}", dt); // "3/9/2008" ShortDate
String.Format("{0:T}", dt); // "4:05:07 PM" LongTime
String.Format("{0:D}", dt); // "Sunday, March 09, 2008" LongDate
String.Format("{0:f}", dt);//"Sunday, March 09, 2008 4:05 PM" LongDate+ShortTime
String.Format("{0:F}", dt);//"Sunday, March 09, 2008 4:05:07 PM" FullDateTime
String.Format("{0:g}", dt);//"3/9/2008 4:05 PM" ShortDate+ShortTime
String.Format("{0:G}", dt);//"3/9/2008 4:05:07 PM" ShortDate+LongTime
String.Format("{0:m}", dt); // "March 09" MonthDay
String.Format("{0:y}", dt); // "March, 2008" YearMonth
String.Format("{0:r}", dt); // "Sun, 09 Mar 2008 16:05:07 GMT" RFC1123
String.Format("{0:s}", dt); // "2008-03-09T16:05:07" SortableDateTime
String.Format("{0:u}", dt); // "2008-03-09 1

6


BÀI 3: TẠO MÃ AN TOÀN (CAPTCHA IMAGE) CHO WEBSITE

Nhằm ngăn chặn việc submit data liên tục về Web Server chúng ta sẽ ra một vài
chữ trên 1 tấm hình và buộc người dùng phải đọc những chữ đó và nhập lại việc

này máy sẽ làm chưa được nếu chữ trên hình càng ngoằn ngèo. Mình sẽ hướng
dẫn các bạn 1 cách tạo ra tấm hình đó với c# và asp.net.

Sử dụng thư viện Drawing trong c#
Chúng ta cần sử dụng thư viện Drawing trong c# để làm chuyện này.
?
Code
1
2
using System.Drawing;
using System.Drawing.Drawing2D;

Tạo mới 1 tấm hình rất đơn giản
Đoạn code dưới đây giúp bạn tạo ra một tấm hình bitmap và dùng đối tượng Graphics để vẽ
mọi thứ có thể như chữ, đường thẳng, hình chữ nhật, lên tấm hình bitmap.
Bitmap bmp = new Bitmap(_width, _height);
Graphics g = Graphics.FromImage(bmp);

Tạo background cho hình - tăng độ khó nhận dạng cho máy
Giúp chúng ta có một background với 2 màu trộn lẫn.
// Fill in the background.
Rectangle rect = new Rectangle(0, 0, _width, _height);
HatchBrush hatchBrush = new HatchBrush(HatchStyle.SmallConfetti,
Color.Black, Color.Gray);
g.FillRectangle(hatchBrush, rect);

Tạo chữ ngẩu nhiên với đối tượng Ramdom
Giúp tăng tính đa dạng của chữ thể hiện.
// Get random text
string text = "qwertyuiopasdfghjklzxcvbnm";

string s = "";
for (int i = 0; i < 7; i++) {
s += text[rnd.Next(0, text.Length - 1)];
}
// Draw text on the Image
Font f = new Font("Bradley Hand ITC", 20, FontStyle.Bold);
Point p = new Point(1, -3);
g.DrawString(s, f, Brushes.Black, p);

Cách sử dụng
Xem đoạn code ứng dụng tấm hình này vào trang web.
protected void Page_Load(object sender, EventArgs e)

7

{
Response.Clear();
Response.ContentType = "image/jpeg";
string text;
CaptchaImage.GenericImage(out text,120,30).Save(Response.OutputStream,
System.Drawing.Imaging.ImageFormat.Jpeg);
}



8


BÀI 4: THIẾT KẾ ENTITY DATA MODEL – PART 1: DATABASE FIRST


Là thành phần trung gian giữa ứng dụng và database, Entity Data Model (EDM)
giúp tạo liên kết và mô tả giữa nguồn dữ liệu vật lý và các đối tượng bussiness
(hay object layer) trong ứng dụng. Dựa vào sự lựa chọn thành phần nào sẽ
được tạo ra trước, một ứng dụng Entity Framework (EF) có thể sử dụng 1 trong
3 cách tiếp cận: Database First, Model First và Code First.

Là thành phần trung gian giữa ứng dụng và database, Entity Data Model (EDM) giúp
tạo liên kết và mô tả giữa nguồn dữ liệu vật lý và các đối tượng bussiness (hay object
layer) trong ứng dụng. Dựa vào sự lựa chọn thành phần nào sẽ được tạo ra trước,
một ứng dụng Entity Framework (EF) có thể sử dụng 1 trong 3 cách tiếp cận:
Database First, Model First và Code First.

Các sơ đồ dưới đây minh hoạt mối quan hệ và thứ tự tạo ra giữa các thành phần dữ
liệu trong ứng dụng của Entity Framework. Phần Model tương ứng với tập tin .edmx,
Code tương ứng với tập tin .cs (hoặc .vb nếu bạn dùng VB.NET).

Note: Bạn có thể nhận thấy rằng phần Model luôn được theo sau bởi Code, điều này
là nhờ công cụ Entity Data Model Designer trong Visual tự động tạo ra code tương
ứng mỗi khi bạn thực hiện chỉnh sửa tập tin .edmx.
Database First:
Đây là cách thông thường và được hỗ trợ từ phiên bản EF 1 trong Visual Studio 2008.
EF sẽ tự động tạo ra data model và các class (object layer) cho bạn từ database có
sẵn thông qua công cụ Entity Data Model Wizard. Bạn có thể thay đổi data model và
cập nhật lại vào database. Đây là cách tiếp cận phổ biến vì cách thực hiện đơn giản,
nhanh chóng
Model First:
Hướng tiếp cận này được bổ sung từ phiên bản EF 4 trong Visual 2010.
Bạn có thể tạo một data model rỗng bằng công cụ Entity Data Model Designer, khi đó
object layer cũng tự động được sinh ra. Sau khi đã hoàn thành việc thiết kế, bạn có
thể sử dụng chức năng Generate Database from Model để tạo ra các mã DDL (data


9

definition language) dựa trên mã SSDL (Store Schema Definition Language). Các mã
DDL này sẽ được thực thi và lưu thành tập tin .sql.
Code First:
Với phiên bản EF 4 bạn cần phải cài thêm thư viện EF Feature CTP (Community
Technology Preview) để sử dụng. Tuy nhiên tính năng này đã được tích hợp vào trong
phiên bản EF 4.1 và với phiên bản VS 2010 hiện tại thì bạn cần phải download để cài
đặt thủ công.
Hướng tiếp cận này bỏ qua phần Model (.edmx), bạn có thể thiết kế các class tương
ứng với các table của database mà bạn cần làm việc hoặc muốn tạo ra. Với hướng
tiếp cận này, bạn sẽ sử dụng class DbContext thay vì ObjectContext để thao tác với
database. Việc sử dụng Code First đòi hỏi bạn phải thực hiện các công việc một cách
thủ công nhưng bù lại nó linh hoạt và được sử dụng rất phổ biến.
Tạo EDM theo hướng Database First (Step by Step)
Phần này bạn sẽ được hướng dẫn cách tạo một Entity Data Model từng bước dựa vào
công cụ Entity Data Model Designer. Dữ liệu nguồn được sử dụng trong ví dụ là
Northwind (download
tại
Bước 1: Tạo dự án mới với kiểu là Console Application.
Bước 2: Nhấn Add New Item (Ctrl+Shift+A) trên thanh công cụ và chọn mục
ADO.NET Entity Data Model trong hộp thoại hiện ra. Đặt tên mục sắp thêm vào là
NorthwindModel với phần mở rộng mặc định là .edmx. Nhấn Add.

Bước 3: Cửa sổ Entity Data Model Wizard hiện ra. Bước này để xác định bạn sẽ tạo
model từ database có sẵn hoặc một model rỗng. Bạn để lựa chọn mặc định là
Generate from database và nhấn Next.

10



Bước 4: Bước này bạn cần chọn database nào sẽ sử dụng. Chuỗi kết nối sẽ tự động
được sinh trong phần Entity connection string. Với tùy chọn Save entity connection
settings in App.Config, chuỗi kết nối này sẽ tự động được thêm vào tập tin App.Config,
nhờ đó bạn không cần nhớ chuỗi kết nối mà chỉ cần nhớ tên của kết nối là
NorthwindEntities.

11


Trong trường hợp bạn chưa có sẵn kết nối với database nào, hãy nhấn nút New
Connection… Các kết nối mà bạn đã tạo sẽ hiện ra trong cửa sổ Server Explorer.
Nhấn Next.
Bước 5: Lựa chọn các table, view và stored procedure bạn muốn sử dụng. Trong ví
dụ này, tôi chỉ sử dụng ba table là Orders, Order Details và Products.

12


Sau khi nhấn Finish, tập tin NorthwindModel.edmx sẽ được thêm vào Solution
Explorer. Đây là tập tin có dạng .xml và được mở với trình mặc định ADO.NET Entity
Data Model Designer với giao diện trực quan như hình dưới. Nếu muốn coi nội dung
của tập tin này dưới dạng văn bản .xml, bạn nhấn chuột phải vào tập tin trong Solution
Explorer > Open With… và chọn XML Editor. Bạn có thể coi các thông tin đầy đủ của
model trong cửa sổ Model Browser và Mapping Details.

13



Ngoài tập tin .edmx trên, một tập tin khác cũng được tự động tạo ra
là NorthwindModel.Designer.cs. Tập tin này chứa code C# được sinh ra cho các
class bạn sẽ sử dụng trực tiếp khi lập trình. Các class này được gọi là Object Layer (là
phần Object Services trong kiến trúc của Entity Framework).
Khảo sát tập tin này, bạn sẽ thấy nó bao gồm các class là: NorthwindEntities, Order,
Order_Detail và Product. Trong đó, class NorthwindEntities chính là class thừa kế từ
ObjectContext mà bạn cần sử dụng để tạo kết nối và thao tác với database.
Kiểm tra kết quả với LINQ to Entities
Việc sử dụng LINQ to Entities rất đơn giản, tương tự như LINQ to SQL. Bạn chỉ cần
làm việc với các class của object layer và property của chúng. Ví dụ sau in ra các sản
phẩm có CategoryID là 1 trong bảng Products:
?

//
NorthwindEntities db = new NorthwindEntities();


14

var query = from p in db.Products
where p.CategoryID == 1
select p.ProductName;

foreach (var item in query)
{
Console.WriteLine(item);
}
//
Output:
Chai

Chang
Guaraná Fantástica
Sasquatch Ale
Steeleye Stout
Côte de Blaye
Chartreuse verte
Ipoh Coffee
Laughing Lumberjack Lager
Outback Lager
Rhönbräu Klosterbier
Lakkalikööri

15


BÀI 5: TỔNG QUAN KIẾN TRÚC CỦA ENTITY FRAMEWORK

ADO.NET Entity Framework là một nền tảng được sử dụng để làm việc với
database thông qua cơ chế ánh xạ Object/Relational Mapping (ORM). Nhờ đó,
bạn có thể truy vấn, thao tác với database gián tiếp thông qua các đối tượng lập
trình.

ADO.NET Entity Framework là một nền tảng được sử dụng để làm việc với database
thông qua cơ chế ánh xạ Object/Relational Mapping (ORM). Nhờ đó, bạn có thể truy
vấn, thao tác với database gián tiếp thông qua các đối tượng lập trình.

Kiến trúc của Entity Framework được minh họa như sau:

Các nội dung dưới đây sẽ đi vào giải thích từng phần trong sơ đồ trên. Trong giới hạn
của bài viết, tôi chỉ đi khái quát để bạn nắm được nội dung chính. Trong thực tế, bạn

cũng không cần biết sâu hơn về kiến trúc bên dưới trừ những mục đích đặc biệt.
Object Services
Đây là các class tự động sinh ra tương ứng với mô hình dữ liệu. Các class này bao
gồm:
- ObjectContext đại diện cho một database. ObjectContext có chức năng quản lý
các kết nối, định nghĩa mô hình dữ liệu với metadata và thao tác với database. Lớp
này cũng có thể thêm vào các phương thức đại diện cho các stored procedure trong
database.
- ObjectSet<TEntity> là một một tập hợp các entity. Mỗi đối tượng này tương ứng
với một table. Có thể lấy được các đối tượng này thông qua các property tương ứng
của ObjectContext.

16

- EntityObject, ComplexObject là các lớp tương ứng cho một dòng dữ liệu của table
trong database. Khác biệt chính giữa hai loại này là ComplexObject không chứa
primary key.
- EntityCollection<TEntity> và EntityReference<TEntity>: là các đối tượng thể hiện
mối quan hệ (relationship) giữa hai entity class. Mỗi đối tượng này có thể được truy
xuất thông qua các property của entity class.
Ta có bảng ánh xạ tương đương sau giữa các đối tượng trong database và EF:
Database Object
Entity Framework Object
Database
ObjectContext
Table, View
EntityObject, ComplexObject
Column
Property
Relationship

EntityCollection<TEntity>,
EntityReference<TEntity>
Ví dụ sau cho thấy cách tạo một đối tượng ObjectContext từ mô hình dữ liệu
NorthwindEntities (tên của connection string được lưu trong app.config), sau đó sử
dụng LINQ to Entities để lấy ra các sản phẩm (trong bảng Products) có tên bắt đầu
bằng “G” và in ra màn:
?

// …
ObjectContext context = new ObjectContext("name=NorthwindEntities");

ObjectSet<Product> products = context.CreateObjectSet<Product>();

var query = from p in products
where p.ProductName.StartsWith("g")
select p;

foreach (var item in query)
{
Console.WriteLine("{0,-4}{1}",item.ProductID, item.ProductName);
}
// …
Output:
6 Grandma's Boysenberry Spread
15 Genen Shouyu
22 Gustaf's Knäckebröd
24 Guaraná Fantástica
26 Gumbär Gummibärchen
31 Gorgonzola Telino
33 Geitost

37 Gravad lax
44 Gula Malacca
56 Gnocchi di nonna Alice
69 Gudbrandsdalsost
Entity Data Model
Entity Data Model (EDM) là mô hình dữ liệu được mô tả thông qua các ngôn ngữ theo
chuẩn XML. EDM được chia làm 3 lớp là: Conceptual, Mapping và Logical. Mỗi lớp
này được định nghĩa bởi ngôn ngữ riêng theo định dạng XML:

17

- Conceptual – Conceptual Schema Definition Language (CSDL): là ngôn ngữ
định nghĩa các entity, relationship, hàm trong tập tin với phần mở rộng .csdl. Có thể
tạo được các entity class (object layer).
- Mapping – Mapping specification language (MSL): định nghĩa các ánh xạ giữa
lớp conceptual và logical, nội dung này được lưu trong tập tin .msl.
- Logical – Store Schema Definition Language (SSDL): định nghĩa mô hình lưu
trữ của dữ liệu, lưu trữ trong tập tin .ssdl.

Tham khảo thêm: CSDL, SSDL, and MSL Specifications
Các nội dung của ba tập tin .csdl, .msl và .ssdl được lưu trữ trong cùng tập tin
.edmx trong Visual Studio. Tập tin này có thể được tạo ra tự động từ database và
công cụ Entity Framework Model Wizard của Visual Studio. Trong quá trình biên dịch,
các tập tin .csdl, .msl và .ssdl sẽ được tạo ra dựa vào tập tin .edmx này.
Note: Khi mở tập tin .edmx này, VS tự động hiển thị giao diện trực quan của nó bằng
công cụ mặc định là ADO.NET Entity Data Model Designer. Để xem nội dung của tập
tin này, bạn nhấn chuột phải, nhấnOpen with… và chọn mục XML Editor hoặc một
trình xem dưới dạng văn bản bất kì.
EntityClient Data Provider
EntityClient là một data provider mới của ADO.NET dùng để truy xuất đến database.

Được xây dựng bên trên các ADO.NET data provider cơ bản, EntityClient không truy
xuất trực tiếp dữ liệu mà thông qua các data provider khác dựa vào các thông tin dữ
liệu từ Entity Data Model.
EntityClient cũng bao gồm các lớp giống như các ADO.NET data provider khác và tên
lớp được đặt với tiền tố Entity. Ví dụ bạn có thể tạo kết nối bằng EntityConnection, tạo
các câu truy vấn bằngEntityCommand và đọc kết quả bằng EntityDataReader.
Một điểm khác biệt với các data provider khác là EntityClient sử dụng Entity SQL để
truy vấn dữ liệu. Các lệnh Entity SQL sẽ được chuyển thành một cấu trúc lệnh dạng
cây (command tree) và chuyển xuống cho các data provider khác.
Ví dụ sau sử dụng EntityClient để tạo kết nối, tạo đối tượng EntityCommand và sử
dụng tham số để lấy các sản phẩm có CategoryID là 1:
?

int categoryID = 1;
using (EntityConnection con = new EntityConnection("Name=NorthwindEntities"))
{
con.Open();

18

EntityCommand cmd = con.CreateCommand();
cmd.CommandText = "SELECT VALUE p FROM NorthwindEntities.Products AS p
WHERE p.CategoryID = @catId";
cmd.Parameters.AddWithValue("catId", categoryID);
EntityDataReader reader =
cmd.ExecuteReader(CommandBehavior.SequentialAccess);
while (reader.Read())
{
var name = reader["ProductName"];
var catId=reader["CategoryID"];

Console.WriteLine("{0,-3}{1}",catId,name);
}
reader.Close();
}
//
Output:
CategoryID ProductName
1 Chai
1 Chang
1 Guaraná Fantástica
1 Sasquatch Ale
1 Steeleye Stout
1 Côte de Blaye
1 Chartreuse verte
1 Ipoh Coffee
1 Laughing Lumberjack Lager
1 Outback Lager
1 Rhönbräu Klosterbier
1 Lakkalikööri

19


BÀI 6: C# – MULTI LANGUAGE (ĐA NGÔN NGỮ) TRONG WINDOWS FORMS

Để tạo một ứng dụng đa ngôn ngữ, cách điển hình là tạo các string table để lưu
trữ các văn bản, chuỗi cho mỗi ngôn ngữ. Trong .NET, bạn có thể dùng các
Resource để tạo ra các string table này và dùng lớp ResourceManager để quản
lý và lấy ra các chuỗi cụ thể dựa vào một đối tượng CultureInfo.


Để tạo một ứng dụng đa ngôn ngữ, cách điển hình là tạo các string table để lưu trữ
các văn bản, chuỗi cho mỗi ngôn ngữ. Trong .NET, bạn có thể dùng các Resource để
tạo ra các string table này và dùng lớpResourceManager để quản lý và lấy ra các
chuỗi cụ thể dựa vào một đối tượng CultureInfo.

Download sourcecode (38 KB)
Trước hết tôi tạo một ứng dụng WinFoms với tên WinFormsMultilingual, tạo thêm một
thư mục tên là “Lang”. Sau đó thêm một Resources File với tên MyResource.resx vào
thư mục này.

Tạo thêm hai Resource vào thư mục Lang tương ứng cho hai ngôn ngữ là English và
Vietnamese. Các Resource này phải có tên theo dạng < default resource name
>.<culture>.resx với <default resource name > chính là MyResource mà tôi đặt ở
bước trên.
Solution Explorer sẽ có dạng:

20


Thêm dữ liệu vào các file MyResource.en-US.resx và MyResource.vi-VN.resx. Mỗi
dòng bao gồm hai cột cần có dữ liệu là Name và Value. Cột Name là định danh giúp
lấy ra Value của bảng khi bạn dùng ResourceManager để làm việc:

Viết phương thức SetLanguage() để thay đổi ngôn ngữ cho giao diện. Các giá trị của
tham số cultureName bạn có thể tham khảo ở cuối bài viết:
?

private void SetLanguage(string cultureName)

21


{
culture = CultureInfo.CreateSpecificCulture(cultureName);
ResourceManager rm = new
ResourceManager("WinFormsMultiLingual.Lang.MyResource",typeof(Form1).Ass
embly);

btnHello.Text = rm.GetString("hello", culture);
radEnglish.Text = rm.GetString("english", culture);
radVietnamese.Text = rm.GetString("vietnamese", culture);
helloWorldString = rm.GetString("helloworld", culture);
}
Mã nguồn code-behind hoàn chỉnh của Form1.cs:
?
1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1

3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2

using System;
using System.Windows.Forms;
using System.Resources;
using System.Globalization;

namespace WinFormsMultiLingual
{
public partial class Form1 : Form
{
CultureInfo culture;

string helloWorldString = "Hello World!";

public Form1()
{
InitializeComponent();

culture = CultureInfo.CurrentCulture;

}

private void btnHello_Click(object sender, EventArgs e)
{
MessageBox.Show(helloWorldString);
}

private void LanguageRadioButtons_CheckedChanged(object sender,
EventArgs e)
{
if (radEnglish.Checked)
SetLanguage("en-US");
else if (radVietnamese.Checked)
SetLanguage("vi-VN");
//else
//

}


22


private void SetLanguage(string cultureName)
{
culture = CultureInfo.CreateSpecificCulture(cultureName);
ResourceManager rm = new
ResourceManager("WinFormsMultiLingual.Lang.MyResource",typeof(For
m1).Assembly);

btnHello.Text = rm.GetString("hello", culture);
radEnglish.Text = rm.GetString("english", culture);
radVietnamese.Text = rm.GetString("vietnamese", culture);
helloWorldString = rm.GetString("helloworld", culture);
}
}
}
Khi biên dịch, mỗi một tập tin Resource sẽ được tạo ra trong một thư mục mới với tên
tương ứng là en-US và vi-VN. Mỗi thư mục này sẽ chứa một tập tin có
tên WinFormsMultiLingual.resources.dll.

Kết quả:


×