摘要:讀者 Yao 與 呆呆 的問題與解答
讀者 Yao於 "留言板" 中詢問以下問題:
書裡有相當多很不錯的功能..但最近要用到...
(1) dataGridView的新增、修改、刪除功能
(2) 或ListView可否做到修改多欄(如:檔案總管的重新命名只能改一欄)。
可否提示些範例..謝謝你..
解答
親愛的讀者您好,很感謝您對於章立民研究室的支持,有關於您提到的問題,回覆如下:
圖表1
圖表2
圖表3
圖表1至3是程式範例的執行畫面,它示範如何於DataGridView控制項中新增與編輯資料,並搭配BeginEdit、EndEdit與CancelEdit方法以及ColumnChanged事件處理常式來檢驗使用者編輯後的欄位內容是否符合驗證規則。
請記得,當使用者變更資料繫結控制項的資料值時,會隱含地呼叫BeginEdit方法。以本範例而言,由於使用者是直接編輯繫結於資料表之DataGridView控制項中的資料,因此不需要自行呼叫BeginEdit方法。相關設計重點與程式碼如下所列:
q 於定義資料表的結構之後,請務必撰寫下列陳述式,以便設定當引發 DataTable.ColumnChanged事件時便執行事件處理常式 limingTable_ColumnChanged:
AddHandler limingTable.ColumnChanged, New _
DataColumnChangeEventHandler(
AddressOf limingTable_ColumnChanged)
q 本範例會先自行新增一些資料列來讓您作為編輯操作的演練對象,在新增完這些範例資料列之後,請務必呼叫DataTable的AcceptChanges方法,以確保它們的資料列狀態是Unchanged:
' 接受所新增的資料列
limingTable.AcceptChanges()
圖表4
q 大家必須瞭解,您可以在DataGridView控制項中直接新增資料列,其作法是移至最後一筆資料列的下一筆即可開始輸入新資料列的各欄位內容(如圖表4所示)。請注意,在此時該筆新資料列的狀態將是Detached,也就是說該資料列仍未被加入至資料列集合(DataRowCollection)中,如果在此階段因為欄位內容不符合驗證規則就呼叫其CancelEdit方法將會產生例外狀況。基於此原因,我們必須先判斷資料列狀態是否為Detached,才能決定是否可呼叫其CancelEdit方法。
在您於DataGridView控制項中完成所有的新增與編輯作業後,如果確定要接受所有的異動,請按一下「接受對資料表的異動」按鈕,以便讓所有資料列狀態是Added和Modified狀態的資料列變成是Unchanged。以下是「接受對資料表的異動」按鈕之Click事件處理常式的程式碼內容:
Private Sub btnAccept_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnAccept.Click
limingTable.AcceptChanges()
End Sub
q 您於DataGridView控制項中進行新增與編輯作業的期間,可以隨時按一下「取消對資料表的異動」按鈕,以便放棄自上一次按一下「接受對資料表的異動」按鈕以來的所有新增與編輯操作。以下是「取消對資料表的異動」按鈕之Click事件處理常式的程式碼內容:
Private Sub btnReject_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnReject.Click
limingTable.RejectChanges()
End Sub
最後, 關於刪除作業方面,在預設狀態下,使用者於 DataGridView 控制項中只要按一下最左側的資料列標題來選取資料列,然後按一下 Delete 鍵即可將資料列刪除。有許多人詢問,如果希望能顯示一個對話方塊來讓使用者先行確認的話,該怎麼做呢?
作法非常簡單,當使用者於 DataGridView 控制項中選取一筆資料列並按下 Delete 鍵時,就會引發 UserDeletingRow 事件。因此您可以在 UserDeletingRow 事件處理常式中撰寫程式碼來顯示一個確認對話方塊,如果使用者表示不要刪除,只需將 DataGridViewRowCancelEventArgs 型別之參數的 Cancel 屬性設定成 True 即可。
更詳細的內容,請參考 Visual VB 2005 檔案IO與資料存取秘訣一書的程式範例 CH5_DemoForm014.vb 與 CH13_DemoForm008.vb, 感謝您。
讀者呆呆的問題與解答
讀者呆呆於留言板中詢問以下問題:
章老師您好:
因小弟是之前是學 vf 的,但轉到 vb 2005來之後,總覺得 vb 綁手綁腳的,總覺得不是很靈活,但 vf 處理資料方面卻很活,所以想請問老師 一下~
雖然你有的書買了三本了,但總覺得老師 講得很深,都是用程式來建立要的物件,但小弟不才,無法體會~
我建立一個 gridview 後,共有三個 資料
數量 價格 加總
1 10 10
2 10 20
那請問一下,我該如何 下
加總 = 數量 * 價格 這個 命令呢?
在 vf 可以 下
ThisForm.Grid1.Column3.Text1.value=
ThisForm.Grid1.Column1.Text1.value * ThisForm.Grid1.Column1.Text1.value
但在 vb 中不行,請老師解答一下,謝謝
還有 一種 就是 收支 資料
支出 存款 餘額
10 10
5 5
----------
餘額每次都會去 加/減 支出 /存款 的動作
像這種我要怎麼寫呢?
解答
親愛的讀者您好。很感謝您對於章立民研究室的支持,有關於您提到的問題,回覆如下:
圖表 5
圖表5所示者是程式範例的執行畫面,當輸入「數量」與「價格」欄位之後,不需要手動產生數量乘以價格之加總結果於「加總」欄位中,當嘗試輸入下一筆資料時,DataGridView會自動計算上一筆資料之加總結果,並顯示在上一筆資料之「加總」欄位。請於DataGridView之CellEndEdit事件處理常式中,撰寫如下所示之程式碼內容:
Private Sub DataGridView1_CellEndEdit( _
ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
Handles DataGridView1.CellEndEdit
If e.RowIndex > -1 Then
If Me.DataGridView1.Rows(e.RowIndex).Cells(0).Value > 0 _
AndAlso Me.DataGridView1.Rows(e.RowIndex).Cells(1).Value > 0 Then
Me.DataGridView1.Rows(e.RowIndex).Cells(2).Value = _
CInt(Me.DataGridView1.Rows(e.RowIndex).Cells(0).Value) *
CInt(Me.DataGridView1.Rows(e.RowIndex).Cells(1).Value)
End If
End If
End Sub
圖表6
程式範例的執行畫面如圖表 6 所示,當使用者嘗試輸入下一筆支出或是存款資料時,DataGridView 會自動計算截至目前為止存款扣除支出的結餘,並顯示在餘額欄位。請於 DataGridView 之 CellEndEdit 事件處理常式中撰寫程式碼,如下所示:
Private Sub DataGridView2_CellEndEdit(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
Handles DataGridView2.CellEndEdit
If e.RowIndex > -1 Then
If e.RowIndex = 0 Then
Me.DataGridView2.Rows(e.RowIndex).Cells(2).Value =
Me.DataGridView2.Rows(e.RowIndex).Cells(1).Value -
Me.DataGridView2.Rows(e.RowIndex).Cells(0).Value
ElseIf e.RowIndex > 0 Then
Me.DataGridView2.Rows(e.RowIndex).Cells(2).Value =
Me.DataGridView2.Rows(e.RowIndex - 1).Cells(2).Value
Me.DataGridView2.Rows(e.RowIndex).Cells(2).Value += _
IIf(Me.DataGridView2.Rows(e.RowIndex).Cells(1).Value Is Nothing, 0,
CInt(Me.DataGridView2.Rows(e.RowIndex).Cells(1).Value)) - _
IIf(Me.DataGridView2.Rows(e.RowIndex).Cells(0).Value Is Nothing, 0,
CInt(Me.DataGridView2.Rows(e.RowIndex).Cells(0).Value))
End If
End If
End Sub