close

由於工作需要這幾天做了一隻小程式
程式本身並無啥可說之處
介面如下

這是一隻用來查詢/列印書籍資料標籤的程式
可選擇查的條件
比較重點的部分是查詢的結果將會用來列印
但由於書籍資料眾多 查詢功能只是方便查詢所要列印的書籍資料

初步的查詢結果列在上方的DataGridView
最前面插入一個欄位蘭為型態為DataGridViewCheckBoxColumn
由於我並不是程式啥程式狂人所以設定都是在GUI介面中設定

前面提到插入的DataGridViewCheckBoxColumn欄位中還設定了該欄位True以1表示其值 False當然就是0了
這是為了讓使用者可以將初步篩選出來的資料可以用勾選的方式選擇他要列印的東西
以方便與快速做為主要考量
勾選的功能還另外增加了全選/全不選 因為有可能屆時會新增大量的新書籍就可以更快速的選擇需要的資料
然後透過向下箭頭的按鈕就可把資料丟到要準備列印的DataGridView
當然也可在上面做全選/全不選 或者取消選錯的資料

A

要說的明部分是查詢結果的清單加到列印清單時 會把已勾選的項目從查詢結果移除 然後新增到列印清單
這樣才不會讓使用者選到重複的資料 這樣邏輯上來講比較合理
當然 如果發現選錯 理所當然 就是反向把列印清單中的指定資料移除 加回查詢結果

最後 用ReportViewer產生列印的資料 條碼的部分是使用條碼字型

P

程式重點說明如下
DGVSource 查詢結果清單
DGVPrint 列印清單

全選/全不選

'來源全選
Private Sub btnSourceCheckAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSourceCheckAll.Click
    '呼叫chech 傳遞 要處理的DataGridView 與 一個布林值True作為全選使用
    check(DGVSource, True)
End Sub

'來源全不選
Private Sub btnSourceCancelAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSourceCancelAll.Click
   
'呼叫chech 傳遞 要處理的DataGridView 與 一個布林值False作為全不選使用 
    check(DGVSource, False)
End Sub

''' <summary>
    ''' 全選 或 全不選
    ''' </summary>
    ''' <param name="DGView">要處理的DataGridView對象</param>
    ''' <param name="Selected">選擇 或 取消 True/False </param>
    ''' <remarks></remarks>

    Private Sub check(ByVal DGView As DataGridView, ByVal Selected As Boolean)
       '宣告一個預設的字串 做為處理勾選與不勾選使用 因為前面提到 自行加入的核取欄位 True/False的對應值為1/0
        Dim SelectType As String = "0"
 
        '判斷傳入的參數如果是True就把Selected設為1
        If Selected Then
            SelectType = "1"
        End If

        '使用迴圈設定勾選狀態
        For index As Integer = 0 To DGView.RowCount - 1
            DGView(0, index).Value = SelectType
        Next index

    End Sub

列印清單只是傳入的參數不同 就不贅述

DataGridView之間的資料複製
這個部分雖然只是小功能 但讓初接觸VB.Net的我著實花了不少時間
後來回去翻看自己以往寫的C#程式 才發現早就做過類似的功能 實在走了不少冤枉路 因此 才決定好好把寫過的東西記錄下來

由於用到兩個DataGridView
為了要方便做資料的複製/移除
因此個別繫結一個DataTable
因此宣告了兩個全域變數
    Private DtSource As DataTable     '查詢的資料
    Private DtPrint As DataTable        '列印的資料

接下來就是移動資料按鈕的處理程序

' 移除選擇項目 加到列印清單
    Private Sub btnSelect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSelect.Click

       '這一段是處理複製資料
       If DGVSource.RowCount > 0 Then
            '使用迴圈取得核取的資料
            For index As Integer = 0 To DGVSource.RowCount - 1
                '判斷是否有勾選
                If DGVSource(0, index).Value = 1 Then
                    '複製到列印資料表 宣告一個DataRow存放該筆資料
                    Dim dr As DataRow = DtSource.Rows(index)
                    '將該筆資料加到列印清單的DataTable
                    DtPrint.Rows.Add(dr.ItemArray)
                End If
            Next

            '這一段是把已經複製的資料 由來源移除
            '使用迴圈取得核取的資料 迴圈是由最後一筆開始進行比對 與移除 因為移除資料後Row的Count會改變
            '所以必須倒著刪
            For index As Integer = DGVSource.RowCount - 1 To 0 Step -1
                If DGVSource(0, index).Value = 1 Then
                   
'移除
                    DtSource.Rows(index).Delete()
                End If
            Next

            '確認DataTable中紀錄的變更.以避免資料重新挑選或排序時 因未認可狀態而產生的Index錯誤
            DtPrint.AcceptChanges()
            DtSource.AcceptChanges()

        End If
    End Sub

以上是由查詢結果 移動資料到列印清單
由列印清單移到查詢結果的做法一樣 只是來源與目的相反 因此不再贅述

結語
資料的操作在程式設計上是一大重點
觀念不清就很容易在死巷子裡面轉不出來
一般來講初學者(其實我就是@@)很容易混淆DataSet .DataTable .與DataRow .DataColumn之間的關係
除了認真多用力K幾遍相關文件外 時做還是比較容易理解的
最後附帶一提重點 就是DataGridView繫結的對象 也就是DataSource可以是DataSet也可以是DataTable
只是以DataSet做為DataSource時必須指定DataMember 因為一個DataSet可以包含多個DataTable

但如果直接以DataTable作為DataSource就不須指定DataMember了 而且就可以直接操作DataTable其結果
會直接反映在DataGridView上
我就是在這裡轉了好久啊~~~

arrow
arrow
    全站熱搜

    ADOLPH 發表在 痞客邦 留言(5) 人氣()