Kỹ thuật lập trình Ứng dụng kỹ thuật lập trình module Dotnetnuke vào Winform, theo kỹ thuật mô hình 3 lớp: lớp thể hiện giao diện, lớp các thành phần thực hiện công việc, lớp thao tác dữ liệu.Tài liệu này rất đơn giản và thực tế, phù hợp để các bạn vừa nghiên cứu vừa áp dụng vào thực tiễn
Trang 1HƯỚNG DẪN LẬP TRÌNH WINFORM
THEO MÔ HÌNH 3 LỚP CỦA MODULE DOTNETNUKE
Tác giả: vuathongtin – Bùi Thành Nhân
THÁNG 05/2014
Trang 2I Mô hình 3 lớp của module DotNetNuke (gọi tắt là 3 lớp DNN)
Lớp thể hiện giao diện
Các thành phần của giao diện
(Windows User Control)
Lớp các thành phần thực hiện công việc
Các thành phần thực thi (Bussiness Components)
Lớp truy xuất/nhập dữ liệu
Lớp truy nhập dữ liệu đa hình
Mô tả truy nhập dữ liệu
(Abstract Data Provider)
Lớp thực thi truy nhập dữ liệu
(Sql Data Provider)
Các khối truy nhập dữ liệu
Mô hình hóa của các đối tượng được thể hiện trong mô hình 3 lớp
Controller Class
Đối tượng điều khiển, sự dụng các phương thức của DataProvider để truy xuất dữ liệu
Info Class
Lớp mô tả các đối tượng lưu trữ thông tin
DataProvider Class
Lớp ảo (abstract) định nghĩa các phương thức truy nhập dữ liệu Lớp
ảo này cho phép phát triển độc lập các mô tả truy nhập dữ liệu
SqlDataProvider Class
Controller
Object
Controller
Object
Info Object
DataProvider Object
DataProvider Object
SQLDataProvider
Object
SQLDataProvider
Procedure Store Procedure
Trang 3Đối tượng truy nhập dữ liệu thực sự
Store Procedure
Các thủ tục ở CSDL MSSQL server được SqlDataProvider sử dụng
Sử dụng thư viện
Microsoft.ApplicationBlocks.Data.dll
Thư viện các hàm làm việc trực tiếp với CSDL
Quy trình xây dựng project winform 3 lớp DNN:
(Thực nghiệm với bài toán tạo form quản lý danh sách dự án Gồm: tb_duan(duanid,
tenduan,loaiduan,mota,namthuchien,khachhang)
1 Khởi tạo database 2 Tạo Project 3 Xây dựng Object 4 Xây dựng lớp giao diện
1.1.Tạo table
1.2 Tạo các store
procedure
- Tạo các thư mục chứa các Object
- Tạo file App.config
3.1 Data Info 3.2 DataProvider 3.3 SqlDataProvider 3.4 Controller
4.1 Form danh sách (hiện
dữ liệu) 4.2 Form cập nhật (thêm, sửa)
Bước 1: Khởi tạo database nhatkyduan (table: tb_duan, store procedure: pr_duan_them,
pr_duan_sua, pr_duan_xoa, pr_duan_thongtin)
Table
CREATETABLE [dbo].[tb_duan](
[duanid] [bigint] IDENTITY(1,1)NOTNULL,
[loaiduan] [int] NULL,
[tenduan] [nvarchar](200)NULL,
[mota] [ntext] NULL,
[namthuchien] [int] NULL,
[khachhang] [nvarchar](200)NULL
)
Store Procedure
CREATEproc [dbo].[pr_duan_them](
@tenduan nvarchar(200),
@mota ntext,
@loaiduan int,
@namthuchien int,
@khachhang nvarchar(200)
)
AS
BEGIN
INSERTINTO
tb_duan(tenduan,mota,loaiduan,namthuchien,khachhan
g)
createproc [dbo].[pr_duan_xoa](
@duanid bigint
)
AS BEGIN DELETEFROM tb_duan WHERE duanid=@duanid
END GO createproc [dbo].[pr_duan_thongtin](
@duanid bigint
Trang 4n,@khachhang)
SELECTCAST(SCOPE_IDENTITY()asINT)
END
GO
CREATEproc [dbo].[pr_duan_sua](
@tenduan nvarchar(200),
@mota ntext,
@loaiduan int,
@namthuchien int,
@khachhang nvarchar(200),
@duanid bigint
)
AS
BEGIN
UPDATE tb_duan SET
tenduan=@tenduan,mota=@mota,loaiduan=@loaidua
n,namthuchien=@namthuchien,khachhang=@khachha
ng
WHERE duanid=@duanid
END
GO
)
AS BEGIN SELECT*FROM tb_duan WHERE duanid=@duanid
END GO
Bước 2:
- Xây dựng mới 1 project Winform (Ví dụ: Project name NhatKyDuAn)
- Tạo lần lượt các thư mục: Components, Data, SqlDataProviders, VguiLayers
Đặc tả:
Components: Chứa các đối tượng Controller (thuộc lớp các thành phần thực hiện công việc)
Ví dụ: DuAnController.cs.
Data: Chứa các đối tượng InfoObject và DataProvider Object
Ví dụ: DuAnInfo.cs, DataProvider.cs
SqlDataProviders: Chứa đối tượng SqlDataProvider Object
Ví dụ: SqlDataProvider.cs
VguiLayers: Chứa các form giao diện người dùng (thuộc lớp thể hiện giao diện)
Ví dụ: frm_duan.cs, frm_duan_capnhat.cs
Bước 3: Xây dựng các đối tượng tương ứng với các thư mục được tạo ở Bước 2.
Trang 5Bước 3.1: Xây dựng đối tượng Data và DataProvider: nhấn phải chuột vào thư mục Data và lần
lượt tạo 2 Class mới có tên: DuAnInfo.cs và DataProvider.cs
publicclassDuAnInfo
{
publiclong duanid { get; set; }
publicstring tenduan { get; set; }
publicint loaiduan { get; set; }
publicstring mota { get; set; }
publicint namthuchien { get; set; }
publicstring khachhang { get; set; }
public DuAnInfo() { }
public DuAnInfo(long duanid, string tenduan, int loaiduan, string mota, int namthuchien,string khachhang)
{
this.duanid = duanid;
this.tenduan = tenduan;
this.loaiduan = loaiduan;
this.mota = mota;
this.namthuchien = namthuchien;
this.khachhang = khachhang;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using NhatKyDuAn.Components;
using NhatKyDuAn.Components.Data;
namespace NhatKyDuAn.Data
{
publicabstractclassDataProvider
{
#region Shared/Static Methods
privatestaticDataProvider provider;
// return the provider
publicstaticDataProvider Instance()
{
if (provider == null)
{
conststring assembly = "NhatKyDuAn.SqlDataProviders.SqlDataProvider,NhatKyDuAn"; Type objectType = Type.GetType(assembly, true, true);
provider = (DataProvider)Activator.CreateInstance(objectType);
}
return provider;
}
Trang 6publicstaticIDbConnection GetConnection()
{
string _connectionString;
_connectionString =
System.Configuration.ConfigurationManager.AppSettings["SiteSqlServer"];
IDbConnection newConnection = new System.Data.SqlClient.SqlConnection();
newConnection.ConnectionString = _connectionString.ToString();
newConnection.Open();
return newConnection;
}
#endregion
#region Du An
publicabstractList<DuAnInfo> duan_danhsach(string tenduan);
publicabstractint duan_them(DuAnInfo DA);
publicabstractint duan_sua(DuAnInfo DA);
publicabstractint duan_xoa(long duanid);
publicabstractDuAnInfo duan_thongtin(long duanid);
protectedvirtualList<DuAnInfo> duan_danhsachFromReader(IDataReader rdr)
{
List<DuAnInfo> LST = newList<DuAnInfo>();
while (rdr.Read())
{
LST.Add(duanFromReader(rdr));
}
return LST;
}
protectedvirtualDuAnInfo duanFromReader(IDataReader rdr)
{
returnnewDuAnInfo(
Convert.ToInt64(rdr["duanid"]),
rdr["tenduan"].ToString(),
Convert.ToInt32(rdr["loaiduan"]),
rdr["mota"].ToString(),
Convert.ToInt32(rdr["namthuchien"]),
rdr["khachhang"].ToString());
}
#endregion
}
}
Bước 3.2: Xây dựng đối tượng Controller: nhấn phải chuột vào thư mục Components, tạo
Class mới có tên: DuAnController.cs
Nội dung class DuAnController:
Trang 7using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using NhatKyDuAn.Components.Data;
using NhatKyDuAn.Data;
namespace NhatKyDuAn.Components
{
publicclassDuAnController
{
publicstaticList<DuAnInfo> duan_danhsach(string tenduan)
{
returnDataProvider.Instance().duan_danhsach(tenduan);
}
publicstaticint duan_them(DuAnInfo DA)
{
returnDataProvider.Instance().duan_them(DA);
}
publicstaticint duan_sua(DuAnInfo DA)
{
returnDataProvider.Instance().duan_sua(DA);
}
publicstaticDuAnInfo duan_thongtin(Int64 duanid)
{
returnDataProvider.Instance().duan_thongtin(duanid);
}
publicstaticint duan_xoa(Int64 duanid)
{
returnDataProvider.Instance().duan_xoa(duanid);
}
}
}
Bước 3.3: Xây dựng đối tượng SqlDataProvider: nhấn phải chuột vào thư mục
SqlDataProvider, tạo mới class SqlDataProvider
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Microsoft.ApplicationBlocks.Data;
using NhatKyDuAn.Components;
using NhatKyDuAn.Data;
using NhatKyDuAn.Components.Data;
using System.Data.SqlClient;
Trang 8namespace NhatKyDuAn.SqlDataProviders
{
publicclassSqlDataProvider : DataProvider
{
#region Private Members
privatereadonlystring _connectionString;
#endregion
#region Constructors
public SqlDataProvider()
{
if (string.IsNullOrEmpty(_connectionString))
{
_connectionString =
System.Configuration.ConfigurationManager.AppSettings["SiteSqlServer"];
}
}
#endregion
#region Properties
publicstring ConnectionString
{
get
{
return _connectionString;
}
}
#endregion
#region SqlData Du An
publicoverrideList<DuAnInfo> duan_danhsach(string tenduan)
{
IDataReader rdr = (IDataReader)SqlHelper.ExecuteReader(ConnectionString,
"pr_duan_danhsach", tenduan);
return duan_danhsachFromReader(rdr);
}
publicoverrideint duan_them(DuAnInfo DA)
{
SqlParameter[] parameter = newSqlParameter[5];
parameter[0] = newSqlParameter("@tenduan", DbType.String);
parameter[0].Value = DA.tenduan;
parameter[1] = newSqlParameter("@mota", DbType.String);
parameter[1].Value = DA.mota;
parameter[2] = newSqlParameter("@loaiduan", DbType.Int32);
Trang 9parameter[2].Value = DA.loaiduan;
parameter[3] = newSqlParameter("@namthuchien", DbType.Int32);
parameter[3].Value = DA.namthuchien;
parameter[4] = newSqlParameter("@khachhang", DbType.String);
parameter[4].Value = DA.khachhang;
return (int)SqlHelper.ExecuteScalar(ConnectionString, "pr_duan_them", parameter);
}
publicoverrideint duan_sua(DuAnInfo DA)
{
SqlParameter[] parameter = newSqlParameter[6];
parameter[0] = newSqlParameter("@tenduan", DbType.String);
parameter[0].Value = DA.tenduan;
parameter[1] = newSqlParameter("@mota", DbType.String);
parameter[1].Value = DA.mota;
parameter[2] = newSqlParameter("@loaiduan", DbType.Int32);
parameter[2].Value = DA.loaiduan;
parameter[3] = newSqlParameter("@namthuchien", DbType.Int32);
parameter[3].Value = DA.namthuchien;
parameter[4] = newSqlParameter("@khachhang", DbType.String);
parameter[4].Value = DA.khachhang;
parameter[5] = newSqlParameter("@duanid", DbType.Int64);
parameter[5].Value = DA.duanid;
returnSqlHelper.ExecuteNonQuery(ConnectionString, "pr_duan_sua", parameter);
}
publicoverrideDuAnInfo duan_thongtin(long duanid)
{
IDataReader rdr = SqlHelper.ExecuteReader(ConnectionString, "pr_duan_thongtin", duanid); DuAnInfo DA = newDuAnInfo();
while (rdr.Read())
{
DA = duanFromReader(rdr);
}
return DA;
}
publicoverrideint duan_xoa(long duanid)
{
returnSqlHelper.ExecuteNonQuery(ConnectionString, "pr_duan_xoa", duanid);
}
#endregion
Trang 10}
}
Bước 4: Xây dựng lớp giao diện: nhấn phải chuột vào thư mục
Thiết kế 2 form: frm_duan, frm_duan_capnhat
Kế thừa các Object được tạo ở Bước 3 để code xử lý 2 form trên
publicvoid duan_danhsach()
{
dgv_duan.AutoGenerateColumns = false;
dgv_duan.DataSource = DuAnController.duan_danhsach(txt_timkiem.Text.Trim());
lbl_tongso.Text = dgv_duan.Rows.Count.ToString();
}
privatevoid btn_luulai_Click(object sender, EventArgs e)
{
if (txt_tenduan.Text.Trim() == "")
{
MessageBox.Show("Chưa nhập tên dự án!");
txt_tenduan.Focus();
}
else
{
string tenduan = txt_tenduan.Text.Trim();
int namthuchien = int.Parse(cbo_namthuchien.Text);
string mota = txt_mota.Text;
DuAnInfo DA = newDuAnInfo ();
DA.tenduan = tenduan;
DA.namthuchien = namthuchien;
DA.loaiduan =0;
DA.mota = mota;
DA.khachhang = txt_khachhang.Text.Trim();
if (duanid == 0)
{
if (DuAnController.duan_them(DA) > 0)
{
if (MessageBox.Show("Đã thêm! Bạn có muốn thêm dự án khác nữa không?", "Chú ý", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
== System.Windows.Forms.DialogResult.OK)
{
txt_tenduan.Text = "";
cbo_namthuchien.SelectedIndex = 0;
txt_mota.Text = "";
txt_tenduan.Focus();
Trang 11}
elsethis.Close();
}
}
else
{
DA.duanid = duanid;
if (DuAnController.duan_sua(DA) > 0) {
this.Close();
}
}
}
}