cbbIdDanhHieu.DataSource = DanhHieu.docDuLieu("GhiChu = N'Tập thể'");
cbbIdDanhHieu.ValueMember = "IdDanhHieu";
cbbIdDanhHieu.DisplayMember = "TenDanhHieu";
AutoCompleteStringCollection namesCollection = new AutoCompleteStringCollection();
// Auto Complete
foreach (CanBo cs in list)
{
namesCollection.Add(cs.TenCanBo);
}
cbbIdDoiTuong.AutoCompleteMode = AutoCompleteMode.Suggest;
cbbIdDoiTuong.AutoCompleteSource = AutoCompleteSource.CustomSource;
cbbIdDoiTuong.AutoCompleteCustomSource = namesCollection;
// End Auto Complete
Thứ Sáu, 1 tháng 11, 2013
Thứ Hai, 21 tháng 10, 2013
Xuất báo cáo bằng Excel
Sử dụng:
using Microsoft.Office.Interop;
using Microsoft.Office.Interop.Excel;
Microsoft.Office.Interop.Excel.Application xlApp = new
Microsoft.Office.Interop.Excel.Application();
Workbook xlWorkbook;
Worksheet xlWorkSheet;
private void buttonX1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(Properties.Settings.Default.ConnectString);
con.Open();
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM
Diem", con);
System.Data.DataTable dt = new System.Data.DataTable();
da.Fill(dt);
xlWorkbook = xlApp.Workbooks.Open("E:\\abc.xlsx");
xlWorkSheet =
xlWorkbook.Sheets.get_Item("GHP");// tên sheet
xlApp.Visible = true;
xlWorkSheet.Activate();
int j = 13;
for (int i = 0; i < dt.Rows.Count;i++)
{
xlWorkSheet.Range["A" +
j].Value = i + 1;// chèn dữ liệu vào Ô Aj
trong excel
xlWorkSheet.Range["B" +
j].Value = dt.Rows[i][1];//
xlWorkSheet.Range["C" +
j].Value = dt.Rows[i][0];
xlWorkSheet.Range["D" +
j].Value = dt.Rows[i][2];
j++;
xlWorkSheet.Range["A" +
j].EntireRow.Insert(XlInsertShiftDirection.xlShiftDown);// chèn
1 hàng rỗng vào dưới hàng j
xlWorkSheet.Range["A" +
j].EntireRow.Select();
//xlWorkSheet.HPageBreaks.Add(xlWorkSheet.Range["A"
+ j]);
}
}
Chủ Nhật, 20 tháng 10, 2013
Một số điều cần lưu ít khi code
Nguồn từ: http://itforfun.wordpress.com/
Thông thường ta hay khai báo 1 biến kiểu chuỗi như sau:
string query = "UPDATE User SET Name='" + name + "' WHERE Id=" + id;
Đoạn code trên nhìn khá là rắc rối,nếu để ý thì nó sẽ tạo ra 3 bản chuỗi điều này thực sự không cần thiết trong ứng dụng của bạn.
Cách làm tốt hơn là bạn nên sử dụng String.Format,nó làm cho đoạn code của bạn trông sáng sủa hơn
string query = string.Format("UPDATE User SET Name='{0}' WHERE ID={1}", name, id);
2.Sử dụng quá nhiều khối try-catch
Thông thường trong thân hàm Main ta thường gọi các hàm con , mà trong mỗi hàm con đó ta thường tạo 1 khối try-catch đễ bẫy lỗi. Bạn tham khảo đoạn code mẫu sau
public class NestedExceptionHandling
{
public void MainMethod()
{
try
{
ChildMethod1();
}
catch (Exception exception)
{
//Handle exception
}
}
private void ChildMethod1()
{
try{
ChildMethod2();
}
catch (Exception exception)
catch (Exception exception)
{
//Handle exception
//Handle exception
throw;
}
}
private void ChildMethod2()
{
try
{
//some implementation
}
catch (Exception exception)
{
//Handle exception
throw;
}
}
}
private void ChildMethod2()
{
try
{
//some implementation
}
catch (Exception exception)
{
//Handle exception
throw;
}
}
}
Bạn để ý nếu 3 hàm trên chỉ tung ra cùng 1 biệt lệ,mà được xử lý nhiều lần thì chắc chắn sẽ rất tốn chi phí cho ứng dụng của ta. Và để tránh điều này ta chỉ cần sử dụng 1 khối try-catch ở trong thân hàm Main
public class NestedExceptionHandling
{
public void MainMethod()
{
try
{
ChildMethod1();
}
catch(Exception exception)
{
//Handle exception
}
}
private void ChildMethod1()
{
ChildMethod2();
}
ChildMethod2();
}
private void ChildMethod2()
{
//some implementation
//some implementation
}
}
4.Sử dụng các phương thức có sẵn}
5.Sử dụng khai baó Using
Thông thường khi chúng ta không sử dụng đối tượng thì chúng ta sử dụng phương thức Dispose() để hủy đối tượng đó. Đoạn code mẫu dưới đây sẻ hủy đối tượng SqlConnection khi ta không cần sủ dụng tới nó
public void MethodUsing()
{
SqlConnection connection = null;
try
{
connection = new SqlConnection("itforfun");
connection.Open();
//Do Something
}
catch (Exception exception)
{
//handle exception
}
finally
{
connection.Close();
connection.Dispose();
}
}
Dưới đây là cách sử dụng Using
public void MethodUsing()
{
using (SqlConnection connection = new SqlConnection("itforfun"))
{
connection.Open();
//Do Something
}
}
Bạn để ý khi sử dụng using thì ta không cần sử dụng khối try-catch dù có biệt lệ xảy ra, cũng không cần sử dụng phương thức Dispose() để giải phóng dữ liệu.
Dưới đây là cách sử dụng Using
public void MethodUsing()
{
using (SqlConnection connection = new SqlConnection("itforfun"))
{
connection.Open();
//Do Something
}
}
Bạn để ý khi sử dụng using thì ta không cần sử dụng khối try-catch dù có biệt lệ xảy ra, cũng không cần sử dụng phương thức Dispose() để giải phóng dữ liệu.
Single-instance trong lập trình C#
1) Form được mở một lần
// Đối với Normal Form
private void titleCuocThi_Click(object sender, EventArgs e)
{
foreach (Form f in Application.OpenForms)
{
if (f is frmCuocThi)
{
f.WindowState = FormWindowState.Normal;
f.Focus();
return;
}
}
frmCuocThi frm = new frmCuocThi();
frm.Show();
}
// Đối với Child Form
private void titleCuocThi_Click(object sender, EventArgs e)
{
foreach (Form child in this.MdiChildren)
{
if (child.GetType() == typeof(frmCuocThi))
{
chidl.WindowState = FormWindowState.Normal;
chidl.Focus();
return;
}
}
frmCuocThi frm = new frmCuocThi();
frm.MdiParent = this;
frm.Show();
}
2) Ứng dụng Single-instance
Tóm lại là thêm 3 lớp này vào Project
Download
Trong frmMain thì thêm các phương thức và các sự kiện sau:
protected override void WndProc(ref Message message)
{
if (message.Msg == SingleInstance.WM_SHOWFIRSTINSTANCE)
{
ShowWindow();
}
base.WndProc(ref message);
}
public void ShowWindow()
{
//if (minimizedToTray)
//{
// notifyIcon.Visible = false;
// this.Show();
// this.WindowState = FormWindowState.Normal;
// minimizedToTray = false;
//}
//else
{
WinApi.ShowToFront(this.Handle);
}
}
//private void btnMinToTray_Click(object sender, EventArgs e)
//{
// // Tie this function to a button on your main form that will minimize your
// // application to the notification icon area (aka system tray).
// MinimizeToTray();
//}
//void MinimizeToTray()
//{
// notifyIcon = new NotifyIcon();
// //notifyIcon.Click += new EventHandler(NotifyIconClick);
// notifyIcon.DoubleClick += new EventHandler(NotifyIconClick);
// notifyIcon.Icon = this.Icon;
// notifyIcon.Text = ProgramInfo.AssemblyTitle;
// notifyIcon.Visible = true;
// this.WindowState = FormWindowState.Minimized;
// this.Hide();
// minimizedToTray = true;
//}
//public void ShowWindow()
//{
// if (minimizedToTray)
// {
// notifyIcon.Visible = false;
// this.Show();
// this.WindowState = FormWindowState.Normal;
// minimizedToTray = false;
// }
// else
// {
// WinApi.ShowToFront(this.Handle);
// }
//}
//void NotifyIconClick(Object sender, System.EventArgs e)
//{
// ShowWindow();
//}
// Đối với Normal Form
private void titleCuocThi_Click(object sender, EventArgs e)
{
foreach (Form f in Application.OpenForms)
{
if (f is frmCuocThi)
{
f.WindowState = FormWindowState.Normal;
f.Focus();
return;
}
}
frmCuocThi frm = new frmCuocThi();
frm.Show();
}
// Đối với Child Form
private void titleCuocThi_Click(object sender, EventArgs e)
{
foreach (Form child in this.MdiChildren)
{
if (child.GetType() == typeof(frmCuocThi))
{
chidl.WindowState = FormWindowState.Normal;
chidl.Focus();
return;
}
}
frmCuocThi frm = new frmCuocThi();
frm.MdiParent = this;
frm.Show();
}
2) Ứng dụng Single-instance
Tóm lại là thêm 3 lớp này vào Project
Download
Trong frmMain thì thêm các phương thức và các sự kiện sau:
protected override void WndProc(ref Message message)
{
if (message.Msg == SingleInstance.WM_SHOWFIRSTINSTANCE)
{
ShowWindow();
}
base.WndProc(ref message);
}
public void ShowWindow()
{
//if (minimizedToTray)
//{
// notifyIcon.Visible = false;
// this.Show();
// this.WindowState = FormWindowState.Normal;
// minimizedToTray = false;
//}
//else
{
WinApi.ShowToFront(this.Handle);
}
}
//private void btnMinToTray_Click(object sender, EventArgs e)
//{
// // Tie this function to a button on your main form that will minimize your
// // application to the notification icon area (aka system tray).
// MinimizeToTray();
//}
//void MinimizeToTray()
//{
// notifyIcon = new NotifyIcon();
// //notifyIcon.Click += new EventHandler(NotifyIconClick);
// notifyIcon.DoubleClick += new EventHandler(NotifyIconClick);
// notifyIcon.Icon = this.Icon;
// notifyIcon.Text = ProgramInfo.AssemblyTitle;
// notifyIcon.Visible = true;
// this.WindowState = FormWindowState.Minimized;
// this.Hide();
// minimizedToTray = true;
//}
//public void ShowWindow()
//{
// if (minimizedToTray)
// {
// notifyIcon.Visible = false;
// this.Show();
// this.WindowState = FormWindowState.Normal;
// minimizedToTray = false;
// }
// else
// {
// WinApi.ShowToFront(this.Handle);
// }
//}
//void NotifyIconClick(Object sender, System.EventArgs e)
//{
// ShowWindow();
//}
Thứ Sáu, 18 tháng 10, 2013
Cập nhật code mới cho GenCode v2.01
1) Thủ tục đọc toàn bộ dữ liệu
// Thủ tục đọc toàn bộ bảng
public static List<VanBan> VanBanDocToanBo(string cn)
{
try
{
//ten phuong thuc Select * from CongVan where ID=@ID
DataTable dt = SqlHelper.ExecuteDataset(cn, "VanBanDocToanBo").Tables[0];
List<VanBan> list = new List<VanBan>();
foreach (DataRow row in dt.Rows)
{
list.Add(new VanBan(row));
}
return list;
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString(), "Thông Báo!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
}
Đề nghị đ/c Tân Láp chuyển từ DataTable sang List toàn bộ các phương thức lấy dữ liệu khác nhé!
2) Thủ tục LoadData mới
- Ghi từng dòng một vào DataGridView
private void VanBanDocDuLieu()
{
int dong=0;
if (dgvVanBan.Rows.Count > 0 && dgvVanBan.CurrentRow.Index > 0)
{
dong = dgvVanBan.CurrentRow.Index;
}
dgvVanBan.Rows.Clear();
try
{
List<VanBan> list = VanBan.VanBanDocToanBo(connectString);
foreach (VanBan vb in list)
{
DataGridViewRow row = (DataGridViewRow)dgvVanBan.RowTemplate.Clone();
row.CreateCells(dgvVanBan, vb.IdVanBan, vb.Loai, vb.CoQuanBanHanh,vb.NgayBanHanh,vb.NoiDung,vb.GhiChu);
dgvVanBan.Rows.Add(row);
}
if (dgvVanBan.Rows[dong] != null)
{
dgvVanBan.Rows[dong].Selected = true;
dgvVanBan.CurrentCell = dgvVanBan[0, dong];
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Thông Báo! DocDuLieu", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
3) Xóa một dòng trên DataGridView
dgvVanBan.Rows.RemoveAt(dgvVanBan.CurrentRow.Index);
// Thủ tục đọc toàn bộ bảng
public static List<VanBan> VanBanDocToanBo(string cn)
{
try
{
//ten phuong thuc Select * from CongVan where ID=@ID
DataTable dt = SqlHelper.ExecuteDataset(cn, "VanBanDocToanBo").Tables[0];
List<VanBan> list = new List<VanBan>();
foreach (DataRow row in dt.Rows)
{
list.Add(new VanBan(row));
}
return list;
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString(), "Thông Báo!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
}
Đề nghị đ/c Tân Láp chuyển từ DataTable sang List toàn bộ các phương thức lấy dữ liệu khác nhé!
2) Thủ tục LoadData mới
- Ghi từng dòng một vào DataGridView
private void VanBanDocDuLieu()
{
int dong=0;
if (dgvVanBan.Rows.Count > 0 && dgvVanBan.CurrentRow.Index > 0)
{
dong = dgvVanBan.CurrentRow.Index;
}
dgvVanBan.Rows.Clear();
try
{
List<VanBan> list = VanBan.VanBanDocToanBo(connectString);
foreach (VanBan vb in list)
{
DataGridViewRow row = (DataGridViewRow)dgvVanBan.RowTemplate.Clone();
row.CreateCells(dgvVanBan, vb.IdVanBan, vb.Loai, vb.CoQuanBanHanh,vb.NgayBanHanh,vb.NoiDung,vb.GhiChu);
dgvVanBan.Rows.Add(row);
}
if (dgvVanBan.Rows[dong] != null)
{
dgvVanBan.Rows[dong].Selected = true;
dgvVanBan.CurrentCell = dgvVanBan[0, dong];
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Thông Báo! DocDuLieu", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
3) Xóa một dòng trên DataGridView
dgvVanBan.Rows.RemoveAt(dgvVanBan.CurrentRow.Index);
Thứ Ba, 15 tháng 10, 2013
Hướng dẫn sử dụng GenCodeV2.01
Download Here
Các bước thực hiện sử dụng GenCode:
Bước 1:
Tạo CSDL bằng file Excel MS.xlsx
Trong file Excel:
sheet "Bang" chứa các bảng.
sheet "Truong" chứa các trường của các bảng
sheet "KhoaChinh" chứa trường khóa chính của các bảng
Bước 2: Tạo Project
Bước 3: Trong Project tạo các thư mục:
- Objects
- Views
- DataAccessLayer
Trong Objects tạo các fille:
- LopCha.cs
- TrangThai.cs
- [TenBang].cs (lần lượt là các bảng, có bao nhiêu bảng thì tạo bấy nhiêu lớp)
Trong DataAccessLayer tạo:
- DataAccessHelper.cs
Trong Views tạo các form:
-frm[TenBang] (có bao nhiêu bảng làm bấy nhiêu form)
ở phần Properties> Settings.settings khai báo 1 biến ConnectString với kiểu là string
Xong công tác chuẩn bị và chạy.
Chú ý tên bảng không cần phải đặt tiếp đầu ngữ là : "tb" nữa GenCode có rồi! :)
Các bước thực hiện sử dụng GenCode:
Bước 1:
Tạo CSDL bằng file Excel MS.xlsx
Trong file Excel:
sheet "Bang" chứa các bảng.
sheet "Truong" chứa các trường của các bảng
sheet "KhoaChinh" chứa trường khóa chính của các bảng
Bước 2: Tạo Project
Bước 3: Trong Project tạo các thư mục:
- Objects
- Views
- DataAccessLayer
Trong Objects tạo các fille:
- LopCha.cs
- TrangThai.cs
- [TenBang].cs (lần lượt là các bảng, có bao nhiêu bảng thì tạo bấy nhiêu lớp)
Trong DataAccessLayer tạo:
- DataAccessHelper.cs
Trong Views tạo các form:
-frm[TenBang] (có bao nhiêu bảng làm bấy nhiêu form)
ở phần Properties> Settings.settings khai báo 1 biến ConnectString với kiểu là string
Xong công tác chuẩn bị và chạy.
Chú ý tên bảng không cần phải đặt tiếp đầu ngữ là : "tb" nữa GenCode có rồi! :)
Thứ Hai, 14 tháng 10, 2013
Sử dụng Properties.Settings để lưu ConnectString
Khai báo:
Properties.Settings fs = new Properties.Settings();
Cài đặt:
private void btnOk_Click(object sender, EventArgs e)
{
connectString = @"";
fs.ConnectString = connectString;
fs.Save();
}
Sử dụng:
con = new SqlConnection(Settings.Default.ConnectString);
Properties.Settings fs = new Properties.Settings();
Cài đặt:
private void btnOk_Click(object sender, EventArgs e)
{
connectString = @"";
fs.ConnectString = connectString;
fs.Save();
}
Sử dụng:
con = new SqlConnection(Settings.Default.ConnectString);
Chủ Nhật, 13 tháng 10, 2013
Phần mềm GenCode v2.0 (demo)
Dowload here
Hướng dẫn sử dụng:
- File MS.xls là file cơ sở dữ liệu của phần mềm.
-....
- To be continues....
Hướng dẫn sử dụng:
- File MS.xls là file cơ sở dữ liệu của phần mềm.
-....
- To be continues....
Thứ Năm, 3 tháng 10, 2013
Mô hình 3-layers, 3-tiers
Ngày đăng: 7/5/2013
Người đăng: SwitchLanguageBài đăng sử dụng nguồn của tác giả: Phú NguyễnSau 1 thời gian tìm hiểu và cũng có rất nhiều câu hỏi, mình xin phép giới thiệu lại mô hình này, mong các bạn góp ý để bài viết hoàn thiện hơn!Mô hình 3 tầng (3-tiers architecture) là gì, mô hình 3 lớp (3-layers architecture) là gì, sự khác biệt giữa 3-layer và 3-tiers, nó có ý nghĩa như thế nào và tại sao ta phải dùng mô hình 3-layers để viết theo mô hình này trong ứng dụng quản lý .NET?Chào các bạn, câu hỏi trên cũng chính là nội dung mà tôi sẽ trình bày trong chủ đề này: "Mô hình 3-layers, 3-tiers và ứng dụng của nó trong lập trình quản lý .Net"Để trả lời câu hỏi trên, tôi sẽ trình bày 1 số lợi ít có được khi bạn tìm hiểu và sử dụng mô hình này:
- Khi ứng dụng đòi hỏi có sự tách biệt 3 phần: giao diện, xử lý nghiệp vụ, giao tiếp với hệ quản trị CSDL để người viết có thể dễ dàng quản lý ứng dụng của mình khi có bug xảy ra với 1 số thành phần xử lý nghiệp vụ không mong muốn. Ngoài ra với mô hình này nó còn tạo ra 1 không gian làm việc rất tốt để người thiết kế giao diện, lẫn người lập trình có thể làm việc chung với nhau 1 cách dễ dàng.
- Khả năng tái tạo cao: Khi ứng dụng bất chợt yêu cầu thay đổi hệ quản trị CSDL hoặc chuyển ứng dụng từ window application sang web application, việc xây dựng lại ứng dụng từ đầu rất tốn nhiều thời gian và chi phí. Vì vậy với mô hình này ra đời sẽ giải quyết vấn đề này.
- Mô hình 3 tầng (3-tiers) là gì?
Theo wikipedia:“3-tiers là một kiến trúc kiểu client/server mà trong đó giao diện người dùng (UI-user interface), các quy tắc xử lý (BR-business rule hay BL-business logic), và việc lưu trữ dữ liệu được phát triển như những module độc lập, và hầu hết là được duy trì trên các nền tảng độc lập, và mô hình 3 tầng (3-tiers) được coi là một kiến trúc phần mềm và là một mẫu thiết kế.” (dịch lại từ wikipedia tiếng Anh).3-Tiers có tính vật lý (physical): là mô hình client-server (mỗi tier có thể đặt chung 1 nơi hoặc nhiều nơi, kết nối với nhau qua Web services, WCF, Remoting...). Như hình vẽ ta thấy 3 tầng rõ rệt 3 tầng:
- Presentation tier bao gồm các thành phần phần xử lý giao diện Graphic User Interface (GUI).
- Business tier gồm các thành phần Business Logic Layer (BLL), Data Access Layer (DAL) và Data Tranfer Object (DTO): xem thêm phần 3-layers.
- Data tier lưu trữ dữ liệu, là các hệ quản trị CSDL như MS SQL Server, Oracle, SQLite, MS Access, XML files, text files,...
Tuy nhiên bạn cần chú ý những ưu và nhược điểm sau đây để áp dụng nó một cách đúng đắn.Ưu điểm:
- Dễ dàng mở rộng, thay đổi quy mô của hệ thống: Khi cần tải lớn, người quản trị có thể dễ dàng thêm các máy chủ vào nhóm, hoặc lấy bớt ra trong trường hợp ngược lại.
Nhược điểm:
- Việc truyền dữ liệu giữa các tầng sẽ chậm hơn vì phải truyền giữa các tiến trình khác nhau (IPC), dữ liệu cần phải được đóng gói -> truyền đi -> mở gói trước khi có thể dùng được.
- Việc phát triển ứng dụng phức tạp hơn.
2. Mô hình 3 lớp (3-layers) là gì?Không như 3-Tiers có tính vật lý, 3-Layers có tính logic (mỗi layer có 1 công việc) và là 1 thành phần của 3-Tiers. Gồm 3 lớp chính:
- Graphic User Interface (GUI): Thành phần giao diện, là các form của chương trình tương tác với người sử dụng.
- Business Logic Layer (BLL): Xử lý các nghiệp vụ của chương trình như tính toán, xử lý hợp lệ và toàn vẹn về mặt dữ liệu.
- Data Access Layer (DAL): Tầng giao tiếp với các hệ quản trị CSDL
Trong 1 số trường hợp vì lượng thông tin gởi nhiều ta có thể dùng Data Tranfer Object (DTO) để chuyển đối tượng hoặc danh sách đối tượng giữa các tầng với nhau cho tiện dụng.Theo như hình vẽ: mô tả sự hoạt động của mô hình 3-layer gồm 2 tiến trình sau:Các đường mũi tên màu cam biểu diễn cho 1 tiến trình giao tiếp từ GUI đến Data Acess Layer:
- (1) Người sử dụng tác động lên GUI yêu cầu hiển thị thông tin lên màn hình. Tại đây GUI sẽ kiểm tra yêu cầu của người dùng nhập có hợp lệ hay không, nếu không hợp lệ sẽ thông báo cho người dùng.
- Ngược lại yêu cầu sẽ được gởi trực tiếp đến BLL (2) hoặc thông qua lớp object DTO hỗ trợ luân chuyển (2.1 & 2.2), tại đây BLL sẽ xử lý nghiệp vụ về yêu cầu của người dùng, nếu yêu cầu không hợp lệ hoặc tự xử lý yêu cầu không cần phải truy vấn thì BLL sẽ gởi thông tin về GUI (3) và GUI sẽ hiển thị kết quả cho người dùng.
- Trong trường hợp BLL cần thao tác trên dữ liệu từ CSDL thì BLL sẽ gởi yêu cầu đến trực tiếp đến DAL (4) hoặc thông qua DTO (4.1 & 4.2), nhờ DAL giao tiếp với hệ quản trị CSDL (5) lấy hoặc thêm, xóa, sửa dữ liệu.
- DAL sẽ giao tiếp hệ quản trị CSDL (5) với các truy vấn (sử dụng công nghệ ADO, LINQ to SQL, NHibernate, Entity Framework)
Tại đây tiếp tục thực hiện tiến trình thứ 2 được biểu diễn bằng các mũi tên màu xanh:
- Sau khi DAL thực hiện giao tiếp, hệ quản trị CSDL sẽ trả kết quả truy vấn về DAL (7), DAL sẽ gởi thông tin về dữ liệu vừa lấy trực tiếp sang BLL (8) hoặc thông qua DTO (8.1 & 8.2) xử lý tiếp nghiệp vụ với yêu cầu đã gởi từ trước, sau khi xử lý xong nghiệp vụ, BLL sẽ gởi thông tin đến GUI (10), GUI sẽ hiển thị thông báo và kết quả yêu cầu lên màn hình.
VD: Mô tả hoạt động của mô hình 3-layer với ứng dụng liệt kê danh sách điểm sinh viên:Từ màn hình form quản lý sinh viên gồm có 1 combobox chọn lớp, 1 gridview để hiển thị danh sách sinh viên và 1 button để thực hiện lệnh liệt kê danh sách.(1) Người dùng chọn combobox lớp trên GUI và ấn button liệt kê(2) GUI kiểm tra yêu cầu chọn combobox hợp lệ và gởi mã lớp (**) vừa chọn sang BUS xử lý yêu cầu hiển thị danh sách điểm sinh viên(4) Tại BUS vì yêu cầu từ GUI khá đơn giản nên BUS sẽ không xử lý gì mà sẽ gởi mã lớp sang DAL lấy danh sách điểm.(5) Tại DAL sau khi đã nhận được yêu cầu lấy danh sách điểm từ mã lớp, DAL sẽ tương tác với hệ quản trị CSDL (6) qua các lệnh mở tập tin, kết nối, truy vấn,… để lấy được danh sách điểm (7) với mã số yêu cầu, DAL tiếp tục gởi danh sách (**) này sang BUS để xử lý (7)(8) Tại BUS sau khi nhận được danh sách điểm từ DAL gởi sang, BUS thực hiện nghiệp vụ của mình bằng cách tính điểm trung bình, kết luận đậu/rớt của từng sinh viên (tất cả xử lý về mặt nghiệp vụ), sau đó gởi danh sách điểm đã xử lý (**) sang GUI để hiển thị (9)(9) 1 lần nữa GUI có thể kiểm tra tính hợp lệ của dữ liệu và hiển thị thông tin và thông báo lên màn hình cho người dùng (10)(**) Trong 1 số trường hợp vì lượng thông tin gởi nhiều, ví dụ như 1 sinh viên gồm nhiều thuộc tính như họ tên, tuổi, ngày sinh,… ta có thể dùng DTO để chuyển đối tượng hoặc danh sách đối tượng giữa các tầng với nhau cho tiện dụng.3. Cách tổ chức mô hình trên ứng dụng .NET:Với mỗi tầng (DAL,BLL) ta tạo 1 project mới kiểu Class Library, sau khi buil ra các dll như: BUS.dll, DAL.dll . Khi đó:
- Tầng GUI là project chính chương trình, vì đặc điểm GUI chỉ thấy BLL nên ta sẽ add references BLL.dll từ tab project vào GUI.
- Tầng BUS chỉ thấy được DAL, ta tiếp tục add references DAL.dll vào BUS.
- Tầng DAL giao tiếp được với database nên ta chỉ sử dụng các namespace data provider để tương tác với hệ quản trị CSDL.
4. 1 số câu kinh nghiệm khi sử dụng:
- Các thao tác trên control như: kiểm tra nhập hợp lệ, ẩn hiện các control, và các xử lý thông tin trên control thì ta đặt các hàm xử lý ngay trên GUI.
- Các thao tác trên các dữ liệu cơ bản như: List, Array List, Object, DataTable, string, int, long, float,… ta xử lý ngay chính tầng nghiệp vụ BUS, vì bản chất khi thay đổi hệ quản trị hay các platform thì BUS không thay đổi.
- Các thao tác với CSDL như truy vấn, kết nối, đóng kết nối,… ta xử lý trong DAL.
- Khi có nhu cầu thay đổi hệ quản trị CSDL, ta chỉ cần thay đổi DAL phù hợp với hệ quản trị mới, giữ nguyên BUS, GUI và build lại project.
- Khi có nhu cầu chuyển đổi qua lại giữa ứng dụng web forms hoặc win forms ta chỉ cần thay GUI, giữ nguyên DAL,BUS và build lại project.
5. Sự khác biệt giữa 3-tiers và 3-layer:3-tiers có nghĩa là 3 tầng, 3-layer có nghĩa là 3 lớp. Về mặt ý nghĩa tầng sẽ lớn hơn lớp, mỗi tầng sẽ có nhiều lớp.Trích 1 bài viết:The terms tier and layer are frequently used interchangeably, but actually there is a difference between them: Tiers indicate a physical separation of components, which may mean different assemblies such as DLL, EXE etc on the same server or multiple servers; but layers refers to a logical separation of components, such as having distinct namespaces and classes for the Database Access Layer (DAL), Business Logic Layer (BLL) and User Interface Layer (UIL). Therefore, tier is about physical separation and units of deployment, and layers are about logical separation and units of design.
- Khi dùng từ layer, chúng ta nói tới việc phân chia ứng dụng thành các thành phần một cách logic theo chức năng hoặc theo vai trò, điều này giúp phần mềm của bạn có cấu trúc sáng sủa, dễ dùng lại, từ đó giúp việc phát triển và bảo trì dễ dàng hơn. Các layer khác nhau khi được thực thi vẫn có thể nằm trong cùng một vùng bộ nhớ của một process, và hiển nhiên việc giao tiếp giữa 2 layer có thể không phải là giao tiếp giữa 2 process, đồng nghĩa với việc chúng không liên quan tới mô hình client/server.
- Trái lại, tier liên quan đến cách phân chia một cách vật lý các thành phần trên các máy tính khác nhau. Điều làm nhiều người nhầm lẫn giữa layer và tier là chúng có cùng cách phân chia (presentation, business, data), tuy nhiên trên thực tế chúng khác nhau. Vì cách phân chia như trên nên 1 tier có thể chứa nhiều hơn 1 layer.
Thứ Sáu, 27 tháng 9, 2013
CheckBoxComboBox
Download DLL and Project demo
Hướng dẫn sử dụng: Thêm vào Toolbox giống DotNetBar
Code:
List<string> Dau = new List<string>();
DataTable DT = new DataTable();
DT.Columns.AddRange(new DataColumn[]
{
new DataColumn("IdDanhHieu", typeof(int)),
new DataColumn("TenDanhHieu", typeof(string)),
new DataColumn("MoTa", typeof(string)),
});
List<DHDTuong> list = new List<DHDTuong>();
for (int i = 0; i < dgvDHDTuong.Rows.Count; i++)
{
if (Dau.Find(Items => Items == dgv.Rows[i].Cells["Ten"].Value.ToString()) == null)
{
list.Add(new DHDTuong(dgvDHDTuong.Rows[i]));
Dau.Add(dgv.Rows[i].Cells["Ten"].Value.ToString());
}
}
foreach (DHDTuong cs in list)
{
DT.Rows.Add(cs.IdDanhHieu, cs.TenDanhHieu, cs.TenDanhHieu);
}
ccbDanhHieu.DataSource = new ListSelectionWrapper<DataRow>(DT.Rows,"TenDanhHieu");
ccbDanhHieu.DisplayMemberSingleItem = "Name";
ccbDanhHieu.DisplayMember = "NameConcatenated";
ccbDanhHieu.ValueMember = "Selected";
CheckListBox
Download DLL and Project Demo
Hướng dẫn sử dụng:
- Thêm vào Toolbox giống như DotNetBar
Code với CSDL:
((ListBox)clbVanBanDH).DataSource = DHVB.docDuLieu("IdDanhHieu = " + ma);
((ListBox)clbVanBanDH).DisplayMember = "TenVanBan";
((ListBox)clbVanBanDH).ValueMember = "IdDHVB";
for (int i = 0; i < clbVanBanDH.Items.Count; i++)
{
clbVanBanDH.SetItemChecked(i, true);
}
Chú ý: Thuộc tính Sort mặc định là True
Đăng ký:
Bài đăng (Atom)