2008年5月31日 星期六

DataGridView - 加入ComboBox 欄位

DataGridView 支援多種欄位控制項, 包含CheckedBox, ComboBox, Image ... 等. 可以被加入DataGridView的欄位物件必須是DataGridViewColumn 類別的延伸類別, .NET 內建DataGridViewComboBoxColumn, 即可呈現ComboBox 的效果. 屬性列表:

  • DataPropertyName: 繫結到DataGridView 的欄位
  • DataSource: 下拉內容的資料來源
  • DisplayMember: 顯示的欄位
  • ValueMember: 不會顯示的欄位
下面這段範例是說明如何在產品資料表中包含一個分類的下拉選項, DataGridViewComboBoxColumn 必須與Categories 進行資料繫結.
        Dim combo As New DataGridViewComboBoxColumn
combo.DataSource = CategoriesBindingSource
combo.DataPropertyName = "CategoryID"
combo.DisplayMember = "CategoryName"
combo.ValueMember = "CategoryID"

ProductsDataGridView.Columns.Insert(0, combo)



執行結果如下:


ComboBox

2008年5月23日 星期五

DataGridView - Row的條件格式化

上一篇是針對儲存格的條件格式化, 這一篇是針對資料記錄, 例如, 檢查庫存量小於10時, 將整筆記錄以紅色顯示.
DataGridView在進行Row的繪制流程時會觸發兩個事件, 分別是RowPrePaint及RowPostPaint, 這裡是要在處理完Row的繪製動作之後, 再將每個儲存格背景色改為紅色, 所以是在RowPostPaint事件處理.

使用e.RowIndex取得DataGridViewRow物件,取出DataGridViewRow物件後, 經由DataBoundItem屬性取得該筆記錄,
然後判斷記錄欄位是否符合條件, 若符合條件, 修改該記錄的每個儲存格Style.BackColor屬性.

    Private Sub ProductsDataGridView_RowPostPaint(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowPostPaintEventArgs) Handles ProductsDataGridView.RowPostPaint
If e.RowIndex <= 0 Then
Return
End If
Dim row As DataRowView
row = CType(ProductsDataGridView.Rows(e.RowIndex).DataBoundItem, DataRowView)
If row("UnitsInStock") < 10 Then
For Each cell As DataGridViewCell In ProductsDataGridView.Rows(e.RowIndex).Cells
cell.Style.BackColor = Color.Red
Next
End If
End Sub


圖: 庫存量小於10, 整筆以紅色顯示.
01

DataGridView - 儲存格條件格式化

若要在DataGridView中提供儲存格的條件格式化, 例如, 檢查庫存量為零時, 儲存格背景色顯示為紅色.
這代表要對儲存格進行繪製作業, 可以在CellPainting 事件處理.

DataGridViewCellPaintingEventArgs 事件參數,提供ColumnIndex, RowIndex, Value, CellStyle, PaintBackground 等屬性, 可以利用這些屬性是處理引發事件的儲存格.

範例中我使用e.ColumnIndex 找到控制項對應的欄位名稱, 並確定是在進行記錄而不是標題處理(e.RowIndex >0), 才檢查儲存格是否為0. 透過CellStyle的BackColor 改變目前儲存格的背景色.

   Private Sub ProductsDataGridView_CellPainting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles ProductsDataGridView.CellPainting
If e.ColumnIndex <= 0 Then
Return
End If
Dim column As DataGridViewColumn
column = ProductsDataGridView.Columns(e.ColumnIndex)

If column.DataPropertyName = "UnitsInStock" AndAlso e.RowIndex > 0 _
AndAlso e.Value = 0 Then
e.CellStyle.BackColor = Color.Red
End If

End Sub


圖1: 庫存量為零的儲存格, 背景色為紅色.

01

2008年5月22日 星期四

DataGridView - 執行階段調整欄位順序

若要讓DataGridView 可以在執行階段調整欄位順序倒不是一件難事, 只要設定控制項的AllowUserToOrderColumns 屬性為True即可達到效果. 此屬性預設是False.

圖1: 拖拉QuantityPerUnit欄位
01

圖2:欄位調整後
02

2008年5月21日 星期三

DataGridView - 凍結欄位與記錄

DataGridView 是.NET Framework 2.0 新增的Windows Form 控制項, 這個控制項提供類似Excel 凍結欄位及記錄的功能.

DataGridViewColumn及DataGridViewRow皆有Frozen 屬性, 只要將這個屬性值設為True就可達到凍結的目的.

處理凍結時通常還會將 "分割線" 設為較粗的線條, 
DataGridViewColumn有DividerWidth屬性, DataGridViewRow有DividerHeight屬性, 分別將它們設為大於1的值就會有比較明顯的區隔效果.

例如, 在Form_Load 事件處理凍結效果:

ProductsDataGridView.Columns(1).Frozen = True   
ProductsDataGridView.Columns(1).DividerWidth = 3

ProductsDataGridView.Rows(1).Frozen = True
ProductsDataGridView.Rows(1).DividerHeight = 3


圖1: 凍結ProductName欄及第二筆記錄
凍結ProductName欄及第二筆記錄



圖2: 凍結效果的呈現
凍結效果的呈現

2008年5月8日 星期四

Visual Studio 2008的重構功能(1) – for C#

在程式寫完之後,重新審視程式可能會發現程式有很多地方需要最佳化。例如,類別中的公開變數需要封裝、變數名稱不合規範要修改、太多重複出現的程式可以提列為方法…等等。在你的程式碼需要做大手術時,工具有沒有提供重構(Refactor)功能就很重要了。重構功能在Visual Studio 2005的C#編輯器中首次出現,可惜的是Visual Basic編輯器的重構功能只有「重新命名」這一項(Visual Studio 2005及Visual Studio 2008皆是)。這篇文章將介紹重構(Refactor)功能。

什麼是重構?

重構(Reactor)是指在程式完成之後,在不變更外部行為的情況下修改程式碼內部的結構,以達到最佳化程式碼程序的目的。Visual Studio 2008的C#編輯器內含的重構功能包含以下項目:
  • 重新命名: 可以為變數、方法、命名空間、類別名稱…等多種類型的名稱重新命名,並且會將所有參考到這個名稱的程式一併修改,免除了修改名稱的後遺症。
  • 封裝欄位:熟知物件導向的朋友看到這四個字,應該就知道這是做什麼的了。它可以幫你將Public的欄位封裝成屬性及私有欄位。 擷取方法可以將選取的程式碼區段提出成為一個新的方法。
  • 擷取介面:可以從現有的類別或結構根據其成員產生一個新介面。
  • 重新排列:參數用來變更方法、索引子、Delegate的參數順序,同時會更新呼叫到此成員的程式參數順序。
  • 移除參數: 將方法、索引子、Delegate的參數移除。同時更新呼叫端的程式。
  • 將區域變數升級為參數: 名稱已經很清楚的表達用途了,可將方法、索引子、建構函式的區域變數升級為參數,並且更新其他呼叫端的程式。重新命名、重新排列參數、移除參數、將區域變數升級為參數等功能都會影響到其他呼叫端的程式,Visual Studio會進行多專案跨檔案的更新,同時為了預防自動更新所發生的錯誤,也提供了預覽變更的對話方塊以供確認。
詳全文...

2008年5月5日 星期一

Visual Basic 的表單列印功能

應用程式的資料若需要設計可輸出的報表,可以藉由Visual Studio開發工具所附的報表工具(Microsoft Report或Crystal Report)設計可輸出的報表。某些時候,使用者的需求是要將目前執行中的表單狀態輸出,而不是另外製作的報表格式。

對於Visual Basic的開發者來說,直接列印執行中的表單,並不是一件難事。Visual Studio 2008的Visual Basic語言Windows應用程式專案,可以在「工具箱」的「Visual Basic Power Packs」索引頁籤看到PrintForm控制項。控制項的名稱已經直接了當的介紹它的用途。

更多詳細內容, 請參考: http://www.delightpress.com.tw/article_c.aspx?article_id=36

Visual Basic 2008最佳實務講座內容勘誤-1

感謝讀者Jeffrey 回報書中錯誤, 以下是修正內容:
1.第6頁, 第12行
應為Visual Basic 2008, 而不是Visual Basic 2005
2.第56頁,練習中的Label1屬性應該要設定:
UseMnemonic=>False , ForeColor=>ButtonHighlight, 沒有FontColor屬性(筆誤).
3.第67頁, 第7題
答案應為B