B1: Tạo các Entity Class. Thứ tự tạo là các Class đại diện cho các SubTable trước (Vd: LoaiSach (maSach, tenLoai) –> Sach(maSach,tenSach, soTrang)  thì tạo Entity Class LoaiSach trước)

[code language=”java”] public class ClsLoaiSach
{
private eBookDataDataContext _dt;

public ClsLoaiSach()
{
_dt = new eBookDataDataContext(); //Cập nhật lại DataContext
}

public List <LoaiSach> GetAllLoaiSach()
{
_dt = new eBookDataDataContext(); //Cập nhật lại trước khi GetAll
return _dt.LoaiSaches.ToList(); //Trả về tất cả các Loại Sách
}
}
[/code]

B2: Entity Class còn lại
[code language=”java”] public class ClsSach
{
//DataContext là đối tượng đại diện cho toàn bộ Database; Nó sẽ kèm them tên ta đặt khi tạo connection to SQL Database
//DataContext db = new DataContext(“C:\\SampleDatabases\\Northwnd.mdf”); – Là cách tạo bằng code
private eBookDataDataContext _dt;
public ClsSach()
{
_dt = new eBookDataDataContext(); //Update DataContext
}

//GetTypeBook
public List<Sach> GetSachtheoLoai(LoaiSach ls)
{
return ls.Saches.ToList();
//ls.Saches: Tất cả các Sach trong LoaiSach truyền vào
//_dt.Saches: Tat cả các Sach
//_dt.LoaiSaches: Tất cả các LoaiSach
}
//GetNamedBook – Dùng cho tìm kiếm (Chưa hoàn thành :V)
public Sach GetSach(string tenSach)
{
return _dt.Saches.Single(s => s.tenSach.CompareTo(tenSach) == 0);
}

//Methods
public bool KtraTrung(Sach s)
{
_dt = new eBookDataDataContext(); //Update

var sa = _dt.Saches.Where(ss => ss.maSach == s.maSach);
if (sa.Count()>0)
return true; // trùng mã
return false; // không trùng
}

public bool ThemSach(string maSach, string tenSach, int soTrang, int gia, string maLoai)
{
_dt = new eBookDataDataContext();
Sach s = new Sach();
s.maSach = maSach;
s.tenSach = tenSach;
s.soTrang = soTrang;
s.gia = gia;
s.maLoai = maLoai;

if (KtraTrung(s))
return false;
else
{
_dt.Saches.InsertOnSubmit(s); //Luu s vao Sumit của Sachs
_dt.SubmitChanges(); //Lenh Save
return true;
}
}

public bool SuaSach(string maSach, string tenSach, int soTrang, int gia, string maLoai)
{
_dt = new eBookDataDataContext();
Sach s = _dt.Saches.Single(sa => sa.maSach.CompareTo(maSach) == 0);

if (s == null)
return false;
else
{
s.tenSach = tenSach;
s.soTrang = soTrang;
s.gia = gia;
s.maLoai = maLoai;
_dt.SubmitChanges();
return true;
}
}
[/code]

B3: Code chính thôi :V

[code language=”java”] public partial class FrmDe1 : Form
{
public FrmDe1()
{
InitializeComponent();
}

private ClsLoaiSach _objLoaiSach;
private ClsSach _objSach;

private bool _them;

//Hàm xử lí
void Clear()
{
txtmaSach.Clear();
txttenSach.Clear();
txtsoTrang.Clear();
txtGia.Clear();
txtLoaiSach.Clear();
}
void SetEnable(bool bo)
{
txtmaSach.Enabled = bo;
txttenSach.Enabled = bo;
txtsoTrang.Enabled = bo;
txtGia.Enabled = bo;

btnHuy.Enabled = bo;
btnLuu.Enabled = bo;

btnThem.Enabled = !bo;
btnSua.Enabled = !bo;
btnThoat.Enabled = !bo;
}
//Events From
private void UpdateDatatoLstLoaiSach()
{
lstLoaiSach.DataSource = null;//Reset lại Database ở DatGridView
_objLoaiSach = new ClsLoaiSach();
lstLoaiSach.DataSource = _objLoaiSach.GetAllLoaiSach(); //Update lại cho DataGridView
//DataSource là thuộc tính của DataGridView để liên kết với Database – được show lên trong ListBox

lstLoaiSach.DisplayMember = “tenLoai”; //Gán giá trị hiển thị trên ListBox = thuộc tính tenLoai
lstLoaiSach.ValueMember = “maLoai”; //Như trên cho giá trị đi theo của item hiển thị -dễ quản lý VD: lstLoaiSach.SelectedValue
}

private void frmDe1_Load(object sender, EventArgs e)
{
_objSach = new ClsSach();
_objLoaiSach = new ClsLoaiSach();
//Refresh
UpdateDatatoLstLoaiSach();
lstLoaiSach.SelectedIndex = 0;
SetEnable(false);

}

//Events ListBox
private void lstLoaiSach_SelectedIndexChanged(object sender, EventArgs e)
{
if(lstLoaiSach.SelectedItem!=null)
{
LoaiSach ls = (LoaiSach)lstLoaiSach.SelectedItem;
dgrSach.DataSource = ls.Saches;//Show các sách từ loại sách được chọn qua DataGridView

txtLoaiSach.Text = lstLoaiSach.SelectedValue.ToString();
//Show textbox của Loại sách; Các textbox còn lại là do Datagridview quan li
//Như đã gán ở trên lstLoaiSach.ValueMember =”maLoai” nên ở đây chỉ cần show ra
}
}

//Events DataGridview
private void UpdateDatatoTxtSach(DataGridViewRow dtr)
{
txtmaSach.Text = dtr.Cells[0].Value.ToString();
txttenSach.Text = dtr.Cells[1].Value.ToString();
txtsoTrang.Text = dtr.Cells[2].Value.ToString();
txtGia.Text = dtr.Cells[3].Value.ToString();
}

private void dgrSach_SelectionChanged(object sender, EventArgs e)
{
DataGridViewRow dtr = dgrSach.CurrentRow;
if (dtr != null && !dtr.IsNewRow)
UpdateDatatoTxtSach(dtr);

}
//——————————————————————————–//
//Evnets Button
private void btnThem_Click(object sender, EventArgs e)
{
_them = true; // Nếu đúng thì sẽ nhảy vào if của btnLuu
SetEnable(true);
Clear();
}

private void btnSua_Click(object sender, EventArgs e)
{
_them = false; //False thì sẽ nhảy vào else của btnLuu
SetEnable(true);

txtmaSach.Enabled = false; //Khong duoc sua ma sách
}

private void btnLuu_Click(object sender, EventArgs e)
{
ModifyBooks();

int index = lstLoaiSach.SelectedIndex; //???

UpdateDatatoLstLoaiSach(); //Refresh

lstLoaiSach.SelectedIndex = index; //???

SetEnable(false); //Giong luc Form Load
}

private void ModifyBooks()
{
if (_them)
{
try
{
if (!_objSach.ThemSach(txtmaSach.Text,
txttenSach.Text,
Convert.ToInt32(txtsoTrang.Text),
Convert.ToInt32(txtGia.Text),
txtLoaiSach.Text))

MessageBox.Show(“Mã sách đã tồn tại”);
}
catch (Exception ex)
{
MessageBox.Show(“Thêm không thành công\n” + ex.Message);
}
}
else
{
if (!_objSach.SuaSach(txtmaSach.Text,
txttenSach.Text,
Convert.ToInt32(txtsoTrang.Text),
Convert.ToInt32(txtGia.Text),
txtLoaiSach.Text))

MessageBox.Show(“Không hợp lệ”);
}
}

private void btnHuy_Click(object sender, EventArgs e)
{
SetEnable(false);
Clear();
}
//Chức năng Tìm vẫn chưa được nhen! Bạn nào giúp mình với T.T
private void btnTim_Click(object sender, EventArgs e)
{
_objSach.GetSach(txtTim.Text);
}
private void btnThoat_Click(object sender, EventArgs e)
{
Close();
}
}</pre>
<pre>[/code]