HƯỚ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
I. 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
Info
Object
DataProvider
Object
DataProvider
Object
SQLDataProvider
Object
SQLDataProvider
Object
Store
Procedure
Store
Procedure
Đố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
CREATE TABLE [dbo].[tb_duan](
[duanid] [bigint] IDENTITY(1,1) NOT NULL,
[loaiduan] [int] NULL,
[tenduan] [nvarchar](200) NULL,
[mota] [ntext] NULL,
[namthuchien] [int] NULL,
[khachhang] [nvarchar](200) NULL
)
Store Procedure
CREATE proc [dbo].[pr_duan_them](
@tenduan nvarchar(200),
@mota ntext,
@loaiduan int,
@namthuchien int,
@khachhang nvarchar(200)
)
AS
BEGIN
INSERT INTO
tb_duan(tenduan,mota,loaiduan,namthuchien,khachhan
g)
create proc [dbo].[pr_duan_xoa](
@duanid bigint
)
AS
BEGIN
DELETE FROM tb_duan WHERE
duanid=@duanid
END
GO
create proc [dbo].[pr_duan_thongtin](
@duanid bigint
VALUES(@tenduan,@mota,@loaiduan,@namthuchie
n,@khachhang)
SELECT CAST(SCOPE_IDENTITY() as INT)
END
GO
CREATE proc [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.
Bướ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
public class DuAnInfo
{
public long duanid { get; set; }
public string tenduan { get; set; }
public int loaiduan { get; set; }
public string mota { get; set; }
public int namthuchien { get; set; }
public string 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
{
public abstract class DataProvider
{
#region Shared/Static Methods
private static DataProvider provider;
// return the provider
public static DataProvider Instance()
{
if (provider == null)
{
const string assembly = "NhatKyDuAn.SqlDataProviders.SqlDataProvider,NhatKyDuAn";
Type objectType = Type.GetType(assembly, true, true);
provider = (DataProvider)Activator.CreateInstance(objectType);
}
return provider;
}
public static IDbConnection 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
public abstract List<DuAnInfo> duan_danhsach(string tenduan);
public abstract int duan_them(DuAnInfo DA);
public abstract int duan_sua(DuAnInfo DA);
public abstract int duan_xoa(long duanid);
public abstract DuAnInfo duan_thongtin(long duanid);
protected virtual List<DuAnInfo> duan_danhsachFromReader(IDataReader rdr)
{
List<DuAnInfo> LST = new List<DuAnInfo>();
while (rdr.Read())
{
LST.Add(duanFromReader(rdr));
}
return LST;
}
protected virtual DuAnInfo duanFromReader(IDataReader rdr)
{
return new DuAnInfo(
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:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using NhatKyDuAn.Components.Data;
using NhatKyDuAn.Data;
namespace NhatKyDuAn.Components
{
public class DuAnController
{
public static List<DuAnInfo> duan_danhsach(string tenduan)
{
return DataProvider.Instance().duan_danhsach(tenduan);
}
public static int duan_them(DuAnInfo DA)
{
return DataProvider.Instance().duan_them(DA);
}
public static int duan_sua(DuAnInfo DA)
{
return DataProvider.Instance().duan_sua(DA);
}
public static DuAnInfo duan_thongtin(Int64 duanid)
{
return DataProvider.Instance().duan_thongtin(duanid);
}
public static int duan_xoa(Int64 duanid)
{
return DataProvider.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;
namespace NhatKyDuAn.SqlDataProviders
{
public class SqlDataProvider : DataProvider
{
#region Private Members
private readonly string _connectionString;
#endregion
#region Constructors
public SqlDataProvider()
{
if (string.IsNullOrEmpty(_connectionString))
{
_connectionString =
System.Configuration.ConfigurationManager.AppSettings["SiteSqlServer"];
}
}
#endregion
#region Properties
public string ConnectionString
{
get
{
return _connectionString;
}
}
#endregion
#region SqlData Du An
public override List<DuAnInfo> duan_danhsach(string tenduan)
{
IDataReader rdr = (IDataReader)SqlHelper.ExecuteReader(ConnectionString,
"pr_duan_danhsach", tenduan);
return duan_danhsachFromReader(rdr);
}
public override int duan_them(DuAnInfo DA)
{
SqlParameter[] parameter = new SqlParameter[5];
parameter[0] = new SqlParameter("@tenduan", DbType.String);
parameter[0].Value = DA.tenduan;
parameter[1] = new SqlParameter("@mota", DbType.String);
parameter[1].Value = DA.mota;
parameter[2] = new SqlParameter("@loaiduan", DbType.Int32);
parameter[2].Value = DA.loaiduan;
parameter[3] = new SqlParameter("@namthuchien", DbType.Int32);
parameter[3].Value = DA.namthuchien;
parameter[4] = new SqlParameter("@khachhang", DbType.String);
parameter[4].Value = DA.khachhang;
return (int)SqlHelper.ExecuteScalar(ConnectionString, "pr_duan_them", parameter);
}
public override int duan_sua(DuAnInfo DA)
{
SqlParameter[] parameter = new SqlParameter[6];
parameter[0] = new SqlParameter("@tenduan", DbType.String);
parameter[0].Value = DA.tenduan;
parameter[1] = new SqlParameter("@mota", DbType.String);
parameter[1].Value = DA.mota;
parameter[2] = new SqlParameter("@loaiduan", DbType.Int32);
parameter[2].Value = DA.loaiduan;
parameter[3] = new SqlParameter("@namthuchien", DbType.Int32);
parameter[3].Value = DA.namthuchien;
parameter[4] = new SqlParameter("@khachhang", DbType.String);
parameter[4].Value = DA.khachhang;
parameter[5] = new SqlParameter("@duanid", DbType.Int64);
parameter[5].Value = DA.duanid;
return SqlHelper.ExecuteNonQuery(ConnectionString, "pr_duan_sua", parameter);
}
public override DuAnInfo duan_thongtin(long duanid)
{
IDataReader rdr = SqlHelper.ExecuteReader(ConnectionString, "pr_duan_thongtin", duanid);
DuAnInfo DA = new DuAnInfo();
while (rdr.Read())
{
DA = duanFromReader(rdr);
}
return DA;
}
public override int duan_xoa(long duanid)
{
return SqlHelper.ExecuteNonQuery(ConnectionString, "pr_duan_xoa", duanid);
}
#endregion
}
}
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.
public void duan_danhsach()
{
dgv_duan.AutoGenerateColumns = false;
dgv_duan.DataSource = DuAnController.duan_danhsach(txt_timkiem.Text.Trim());
lbl_tongso.Text = dgv_duan.Rows.Count.ToString();
}
private void 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 = new DuAnInfo ();
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();
}
else this.Close();
}
}
else
{
DA.duanid = duanid;
if (DuAnController.duan_sua(DA) > 0)
{
this.Close();
}
}
}
}