Xây dựng đối tượng thể hiện
Xây dựng điều khiển người dùng - user control rất cần thiết cho việc tái sử dụng các đoạn mã lệnh mà ta đã xây dựng chúng, đây là một trong những tiêu chí quan trọng trong lĩnh vực xây dựng phần mềm nói chung và xây dựng ứng dụng web nói riêng.
Xây dựng điều khiển người dùng cũng tương tự như việc xây dựng các trang web mà chúng ta đã làm trước đây. Chỉ có điều khác biệt chính là trong trang web, chúng ta có nhiều thành phần giao diện và xử lý tương ứng còn trong điều khiển người dùng, chúng ta chỉ thiết kế và xây dựng cho một chức năng hay yêu cầu cụ thể.
Điều khiển người dùng cũng có các thuộc tính, phương thức và sự kiện như các Web Server control, lẽ đương nhiên là các thuộc tính, phương thức và sự kiện đều do chúng ta thiết kế và xây dựng.
Tạo mới đối tượng thể hiện
Để tạo mới đối tượng thể hiện, chọn Add | Add Web User Control… từ thực đơn ngữ cảnh của ứng dụng.
          
            
            
          
          
            
            
          
Việc thiết kế và xây dựng các đối tượng thể hiện hoàn toàn tương tự như các bạn đã từng làm với
trang web. Chúng ta cùng xây dựng đối tượng thể hiện thông tin sách.
          
            
            
          
Khi hoàn tất thiết kế đối tượng thể hiện, công việc tiếp theo là viết các xử lý cần thiết cho các điều khiển có trên đối tượng thể hiện theo yêu cầu sử dụng.
Viết các xử lý cho đối tượng thể hiện:
Private Sub Page_Load(…, e …) Handles MyBase.Load 
    If Not IsPostBack Then 
    'Khởi tạo chuỗi kết nối 
    Dim lSach As New XL_SACH 
    dtlSach.DataSource = lSach 
    dtlSach.DataKeyField = "Ms" 
    dtlSach.DataBind() 
    End If 
    End Sub 
    Private Sub dtlSach_ItemDataBound(…, e …) … 
    'Xử lý hiển thị Tên sách 
    'Xử lý hiển thị hình ảnh minh họa 
    'Xử lý hiển thị thông tin tóm tắt nội dung 
    'Xử lý hiển thị thông tin chủ đề 
    'Xử lý hiển thị thông tin nhà xuất bản 
    'Xử lý hiển thị giá tiền của sách 
    End Sub
    
      Sử dụng đối tượng thể hiện
Sau khi thiết kế và viết các xử lý, chúng ta tiến hành đưa đối tượng thể hiện đã được xây dựng vào trang Web. Các bước thực hiện:
Bước 1. Mở trang web ở chế độ thiết kế - design.
Bước 2. Từ cửa sổ Solution Explorer, chọn đối tượng thể hiện cần sử dụng, nhấn và kéo rê vào trang web đã được mở.
          
            
            
          
Bước 3. Thiết lập các thuộc tính cho điều khiển vừa được kéo vào
Khi thi hành, kết quả hiển thị của đối tượng thể hiện trên trang Web:
          
            
          
Tạo phương thức cho đối tượng thể hiện
Trong ví dụ trên, chúng ta đã xây dựng đối tượng thể hiện Sách. Khi tạo mới một thể hiện Sách vào trang web, thông tin sách sẽ được hiển thị. Tuy nhiên, chắc hẳn các bạn sẽ hài lòng hơn khi chúng ta thiết kế đối tượng thể hiện sách: TH_SACH, chỉ với 1 đối tượng, nhưng chúng ta có thể hiển thị thông tin sách theo yêu cầu như: Hiển thị sách mới vừa nhập, hiển thị sách bán chạy nhất, hiển thị sách được nhiều đọc giả xem và bình chọn nhất, hiển thị sách của một nhà xuất bản hay hiển thị thông tin sách của một tác giả nào đó. Thú vị quá phải không các bạn?
Để làm được điều đó, rất đơn giản. Chúng ta chỉ việc tạo cho đối tượng thể hiện các phương thức - hành vi tương ứng với những yêu cầu cụ thể.
Chúng ta sẽ tiến hành bổ sung các phương thức sau vào đối tượng thể hiện vừa được xây dựng.
Lưu ý: Khi bổ sung các phương thức hiển thị dữ liệu cho đối tượng thể hiện, chúng ta không xử lý hiển thị dữ liệu trong sự kiện PageLoad.
Private Sub Page_Load(…, e …) Handles MyBase.Load 
    'Khởi tạo giá trị cho chuỗi kết nối 
    End Sub 
    Public Sub Hien_thi_sach_co_ma(ByVal pMS As Long) 
    Dim lSach As New XL_SACH(pMS) 
    dtlSach.DataSource = lSach 
    dtlSach.DataBind() 
    End Sub 
    Public Sub Hien_thi_sach_ban_chay() 
    Dim lSach As New XL_SACH() 
    dtlSach.DataSource = lSach.Doc_sach_ban_chay() 
    dtlSach.DataBind() 
    End Sub 
    Public Sub Hien_thi_sach_moi() 
    Dim lSach As New XL_SACH() 
    dtlSach.DataSource = lSach.Doc_sach_moi() 
    dtlSach.DataBind() 
    End Sub 
    Public Sub Hien_thi_sach_theo_nxb(ByVal pMNxb As Long) 
    Dim lSach As New XL_SACH() 
    dtlSach.DataSource = lSach.Doc_sach_theo_nxb(pMNxb) 
    dtlSach.DataBind() 
    End Sub
    Public Sub Hien_thi_sach_theo_chu_de(ByVal pMcd As Long) 
    Dim lSach As New XL_SACH() 
    dtlSach.DataSource = lSach.Doc_sach_theo_chu_de(pMaCD) 
    dtlSach.DataBind() 
    End Sub
    
      Tạo sự kiện cho đối tượng thể hiện
Chắc các bạn không quên sự kiện Click của các điều khiển Button (Button, LinkButton,
ImageButton). Sự kiện Click xảy ra khi Button được nhấn vào. Và mới đây thôi, với điều khiển DataGrid, DataList, chúng ta đã làm việc với các sự kiện: ItemCommand, EditCommand, UpdateCommand, … Mỗi sự kiện xảy ra bởi một hành động tương ứng trước đó của người dùng.
Các đối tượng thể hiện mà chúng ta vừa xây dựng cũng vậy, có khả năng phát ra các sự kiện nếu được chúng ta xây dựng.
Chúng ta cùng tạo sự kiện cho thể hiện Sách. Trong thể hiện sách có các thông tin mô tả liên quan:
Tên sách, Chủ đề, Nhà xuất bản. Khi người dùng chọn chức năng nào thì điều khiển sẽ phát ra sự kiện tương ứng:
- Tên sách -> Điều khiển sẽ phát ra sự kiện Chon_sach(pMs)
Trong đó: pMs là Mã sách được người dùng chọn.
- Chủ đề -> Điều khiển sẽ phát ra sự kiện Chon_chu_de(pMcd)
Trong đó: pMcd là Mã chủ đề được người dùng chọn.
- Nhà xuất bản -> Điều khiển sẽ phát ra sự kiện Chon_nha_xuat_ban(pMnxb)
Trong đó: pMnxb là Mã nhà xuất bản được người dùng chọn.
          
            
            
          
Phát ra sự kiện
Chon_sach
Phát ra sự kiện
Chon_chu_de
Phát ra sự kiện
Chon_nha_xuat_ban
Thiết kế
Thiết lập thuộc tính CommandName cho các LinkButton: Tên sách, Chủ đề và Nhà xuất bản.
            
              
            
| Bảng mô tả thuộc tính của các điều khiển | |||
| Điều khiển | Loại | Thuộc tính | Giá trị | 
| lnkTen_sach | LinkButton | Text | Tên sách | 
| CommandName | Ten_sach | ||
| lnkChu_de | LinkButton | Text | Chủ đề | 
| CommandName | Chu_de | ||
| lnkNha_xb | LinkButton | Text | Nhà xuất bản | 
| CommandName | Nha_xuat_ban | 
Xử lý
Bước 1. Khai báo các sự kiện:
Imports System.Web.UI.WebControls 
    Public Class TH_SACH 
    Inherits System.Web.UI.UserControl 
    Public Event Chon_sach(ByVal pMs As Long) 
    Public Event Chon_chu_de(ByVal pMcd As Long) 
    Public Event Chon_nha_xuat_ban(ByVal pMnxb As Long) 
    End Class 
    
          Bước 2. Xử lý sự kiện ItemDataBound
Trong xử lý sau, chúng ta gán giá trị cho thuộc tính CommandArgument của các LinkButton để lưu trữ các mã tương ứng cho từng điều khiển.
'Xử lý cho Tên sách 
    Dim lnkTen_sach As LinkButton 
    lnkTen_sach = e.Item.FindControl("lnkTen_sach") 
    lnkTen_sach.Text = e.Item.DataItem("Ten_sach")
    lnkTen_sach.CommandArgument = e.Item.DataItem("Ms") 
    'Xử lý cho chủ đề 
    Dim lChu_de As New XL_CHU_DE 
    Dim lnkChu_de As LinkButton 
    lnkChu_de = e.Item.FindControl("lnkChu_de") 
    Dim Mcd As Integer = e.Item.DataItem("Mcd") 
    lnkChu_de.Text = lChu_de.Thuoc_tinh(Mcd, "Ten_chu_de") 
    lnkChu_de.CommandArgument = Mcd 
    'Xử lý cho nhà xuất bản 
    Dim lNXB As New XL_NHA_XB 
    Dim lnkNha_xb As LinkButton 
    lnkNha_xb = e.Item.FindControl("lnkNha_xb") 
    Dim Mnxb As Integer = e.Item.DataItem("Mnxb") 
    lnkNha_xb.Text = lNXB.Thuoc_tinh(Mnxb, "Ten_nha_xuat_ban") 
    lnkNha_xb.CommandArgument = MNXB
    
          Bước 3. Bẫy biến cố ItemCommand để phát sự kiện tương ứng
Private Sub dtlSach_ItemCommand(…, e …) … 
    If e.CommandName = "Ten_sach" Then 
    Dim Ms As Long = e.CommandArgument 
    RaiseEvent Chon_sach(Ms) 
    ElseIf e.CommandName = "Chu_de" Then 
    Dim Mcd As Long = e.CommandArgument 
    RaiseEvent Chon_chu_de(Mcd) 
    ElseIf e.CommandName = "Nha_xuat_ban" Then 
    Dim Mnxb As Long = e.CommandArgument 
    RaiseEvent Chon_nha_xuat_ban(Mnxb) 
    End If 
    End Sub 
    
          Chúng ta có thể đồng thời vừa xử lý biến cố và phát ra sự kiện:
Private Sub dtlSach_ItemCommand(…, e …) … 
    If e.CommandName = "Ten_sach" Then 
    Dim Ms As Long = e.CommandArgument 
    RaiseEvent Chon_sach(Ms) 
    ElseIf e.CommandName = "Chu_de" Then 
    Dim Mcd As Long = e.CommandArgument 
    Hien_thi_sach_theo_chu_de(Mcd)
    RaiseEvent Chon_chu_de(Mcd) 
    ElseIf e.CommandName = "Nha_xuat_ban" Then 
    Dim Mnxb As Long = e.CommandArgument 
    Hien_thi_sach_theo_nxb(Mnxb) 
    RaiseEvent Chon_nha_xuat_ban(Mnxb) 
    End If 
    End Sub 
    
          Hiển thị sách theo chủ đề Công nghệ thông tin