在DATAGRID中使用分類標題

來源:互聯網
上載者:User
datagrid

  在asp.net中,DATAGRID是使用頻率比較高的控制項,而在日常應用中,如何在DATAGRID中使用分類標題呢?

  什麼是分類標題呢?舉個例子,我們在使用DATAGRID時,都以一定的順序來顯示有關的資料,比如在使用ms sql server的Northwind資料庫時,在product產品表中,每一個產品都是屬於一個類別,這些類別在category表中定義。那麼我們可以按照category表中類別的順序,在DATAGRID中顯示每個類別有哪些產品。

  從上面的圖中,可以看出,在這個DATAGRID中,藍色的列名是一個分類標題,很明顯地指出商品所屬的類別,分類標題以下的就是該分類下的所有商品了。

  好吧,講了這麼多,讓我們一步步來開始設計咯。(下面的內容假定各位都初步掌握了VS.NET的基本操作,有asp.net和VB.NET的初步知識)。

  首先,我們建立一個名為subheading的工程,選用VB.NET。之後添加一個datagrid,並修改其html代碼如下:

<?XML:NAMESPACE PREFIX = ASP /><ASP:BOUNDCOLUMN DataField="UnitsInStock" HeaderText="Stock Level"></ASP:BOUNDCOLUMN>

   目的是在datagrid中設定綁定的幾列,注意,要把datagrid中AutoGenerateColumns 屬性設定為 False.之後,我們因為一陣要寫ItemDataBound事件,所以繼續編輯代碼如下:

   ForeColor="Black" BackColor="White" CellPadding="3"

   GridLines="None" CellSpacing="1"

   OnItemDataBound="DataGrid1_ItemDataBound">

  之後我們再看下如何寫邏輯部分的代碼。其實做分類標題的過程很簡單,過程為:   

  用SQL語句從資料庫讀取product表的資料,之後放到dataset的預設datatable中去,  

  然後檢查每一個產品所屬的類別,如果發現某一個產品的類別和前一條記錄中產品所屬的類別不一樣的話,那麼就可以肯定當前產品是屬於一個新的分類了,就可以插入新的行,並且加以修飾,成為分類標題。   

  下面先看page_load()的代碼:

  Private Sub Page_Load(ByVal sender As System.Object, ByVale As System.EventArgs)

  Handles MyBase.Load

  Dim ConnectionString As String

  ConnectionString = "server=localhost;database=northwind;UID=sa"

  Dim CommandText As String = "Select CategoryName, ProductName, " & _

   "Cast(UnitPrice as varchar(50)) as UnitPrice, UnitsInStock " & _

   "from Products " & _

   " INNER JOIN Categories On " & _

   " Products.categoryID = Categories.CategoryID " & _

   "order by Products.categoryID"

   Dim myConnection As New SqlConnection(ConnectionString)

   Dim myCommand As New SqlDataAdapter(CommandText, myConnection)

   Dim ds As New DataSet()

   myCommand.Fill(ds)

   Dim curCat As String ‘指示目前記錄中產品所屬的類別

   Dim prevCat As String ‘指示上一條記錄中產品所屬的類別

   Dim row As TableRow ‘要插入分類標題的行

   Dim i As Integer = 0 ‘要插入分類標題列的位置,用I表示

   '遍曆結果集,找出要插入分類標題的行

   Do While i <= ds.Tables(0).Rows.Count - 1

   curCat = ds.Tables(0).Rows(i).Item("CategoryName")

   If curCat <> prevCat Then

   ‘如果發現前後兩記錄的所屬類別不一樣

   prevCat = curCat

   Dim shRow As DataRow = ds.Tables(0).NewRow

   shRow("ProductName") = ds.Tables(0).Rows(i).Item(0)

   ‘修改行的標題為分類標題名

   shRow("UnitPrice") = "SubHead" ‘設定一個臨時的標記

   ds.Tables(0).Rows.InsertAt(shRow, i) ‘插入新的分類標題列

   i += 1

   End If

   i += 1

   Loop

   DataGrid1.DataSource = ds

   DataGrid1.DataBind()

   End Sub

  在上面的page_load事件中,首先是用SQL語句,對product表和Category表進行串連,得出的結果集是在Category表中每個類別的所有產品,之後對結果集進行遍曆,然後檢查每一個產品所屬的類別,如果發現某一個產品的類別和前一條記錄中產品所屬的類別不一樣的話,那麼就可以肯定當前產品是屬於一個新的分類了,就可以插入新的行做為分類標題列,而在新插入的行中,我們寫了一句 shRow("UnitPrice") = "SubHead",這是為什麼呢?

  這其實只是一個臨時的標記而已,因為新插入的分類標題列是和普通的行不同的,我們要設定其樣式,於是在其item_bound事件中,代碼如下:

  Private Sub DataGrid1_ItemDataBound(sender As Object, e As DataGridItemEventArgs)

   Select Case e.Item.ItemType

   Case ListItemType.AlternatingItem, ListItemType.Item

  ’如果發現是分類標題列的話,則對其進行格式化

  If e.Item.Cells(1).Text.Equals("SubHead") Then

  ’設定列寬

   'Set the cell to a ColSpan of 3

   e.Item.Cells(0).ColumnSpan = 3

  ‘合拼為一個新的分類標題列,移除其中的儲存格

   e.Item.Cells.RemoveAt(2)

   e.Item.Cells.RemoveAt(1)

   e.Item.Cells(0).Attributes.Add("align", "Left")

   e.Item.Cells(0).Font.Bold = True

   e.Item.BackColor = Color.FromArgb(204,204,255)

   End If

  End Select

  End Sub

  最後,別忘記了Imports System.Data.SqlClient。

  本程式在win2000 server+vs.net 2002下通過,也可以在vs.net 2003下運行。



相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。