• 沒有找到結果。

程式設計 .1 變數宣告

在文檔中 第六章資料處理類別介紹 (頁 31-37)

Step 1 首先定義當鍵值不存在時新增鍵值之 SQL 指令

6.7 動態表單

6.7.2 程式設計 .1 變數宣告

在表單程序區宣告下列公用變數:

ds:DataSet

bindSRC:BindingSource bindADP:OdbcDataAdapter bindTBL:DataTable

bindADP2:OdbcDataAdapter bindTBL2:DataTable

daView2:DataView

builder:OdbcCommandBuilder builder2:OdbcCommandBuilder DataView

lbl():標籤控制項物件,用於提示欄位抬頭

obj():標籤控制項物件,用於設定欄位資料控制項 vl():控制項資料暫存變數

fln:主表欄數 fln2:子表欄數

tblStruct():主表欄位結構 tblStruct2():子表欄位結構 keyField1:主表主鍵 keyField2:主表第二主鍵 ckeyField1:子表主鍵 ckeyField2:子表第二主鍵

Dim ime1, ime2, ime3 As ImeMode ↑H

ime1 = Windows.Forms.ImeMode.Alpha '英數 ime2 = Windows.Forms.ImeMode.Off

ime3 = Windows.Forms.ImeMode.On '中文半形 6.7.2.2 加入控制項

在表單之 Load 事件程序內加入下列敘述:

¾ 開啟資料來源 ds = New DataSet("ds")

bindADP = New OdbcDataAdapter(strSQL, myCon) bindADP.Fill(ds, wkTBL)

bindTBL = ds.Tables(wkTBL) bindSRC.DataSource = ds

bindSRC.DataMember = wkTBL bindTBL.PrimaryKey = 主表主鍵 tbl = ds.Tables(wkTBL)

BindingNavigator1.BindingSource = bindSRC

¾ 設定資料表欄位結構及介面資料

在此段加入資料表欄位結構及介面資料設定程式碼 ReDim tblStruct(fln)

If wkSQL = "" Then

Call getTableStructure(wkTBL, 1) 說明:請自行設計副程式 Else

Call getSqlStructure(wkSQL, 1) End If

¾ 計算資料表欄數

fln = tbl.Columns.Count - 1 ReDim lbl(fln)

說明:重新宣告相關變數陣列大小 ReDim obj(fln)

ReDim vl(fln)

¾ 填入主表鍵值-搜尋鍵值下拉方塊 If keyField1 <> "" Then

keyValue = getKeyValue(wkTBL, keyField1)

kvl = Split(keyValue, ",") ↑H

keyCBO.Items.Clear() 說明:搜尋鍵值下拉方塊 keyCBO.Items.Add("")

說明:空字串可用於取消Filter For i = 0 To UBound(kvl)

keyCBO.Items.Add(kvl(i)) Next

End If

¾ 加入控制項-依主表欄數 stX1 = 1,說明:標籤X座標 stY1 = 60,說明:標籤Y座標

stX2 = 95,說明:資料控制項X座標 stY2 = 60,說明:資料控制項 Y 座標 For i = 0 To fln

‹ 加入欄位抬頭(Label)控制項 lbl(i).Text = tblStruct(i).fldTitle lbl(i).font = 自訂字型

loc.X = stX1 loc.Y = stY1

lbl(i).Location = loc sz.Height = 18

sz.Width = 94 lbl(i).Size = sz

Me.Controls.Add(lbl(i))

‹ 加入資料輸入控制項

obj(i) = New TextBox 或是 ComboBox loc.X = stX2

loc.Y = stY2

obj(i).Location = loc obj(i).font = 自訂字型

sz.Height = font.GetHeight + 5 obj(i).Size = sz

obj(i).Name = tbl.Columns(i).ColumnName Me.Controls.Add(obj(i))

stY2 = stY2 + setY 說明:遞增Y座標

stY1 = stY2, ↑H

‹ 設定滑鼠事件

AddHandler CType(obj(i), TextBox).MouseDown, AddressOf On_MouseDown 說明:On_MouseDown 事件程序必須自行定義,它將用來回應用戶按下滑鼠

時,需要處理之作業。

‹ 設定輸入法

If tblStruct(i).fldImeMode = "Aa" Or tblStruct(i).fldImeMode = "" Then obj(i).imemode = ime1

ElseIf tblStruct(i).fldImeMode = "Of" Then obj(i).imemode = ime2

ElseIf tblStruct(i).fldImeMode = "On" Then obj(i).imemode = ime3

End If Next

¾ 設定 KeyText 連結資料來源 此控制項用於存取鍵值。

KeyText.DataBindings.Clear()

KeyText.DataBindings.Add(New Binding("Text", bindSRC, keyField1, True))

¾ 開啟子表資料來源 Dim ds2 As New DataSet

If wkTBL2 <> "" Or wkSQL2 <> "" Then If wkSQL2 = "" Then

strSQL2 = "Select * From " & wkTBL2 & " Order By " & ckeyField1 Else

strSQL2 = wkSQL2 End If

bindADP2 = New OdbcDataAdapter(strSQL2, myCon) bindADP2.Fill(ds2, wkTBL2)

bindTBL2 = ds2.Tables(wkTBL2) daView2 = New DataView(bindTBL2)

fln2 = bindTBL2.Columns.Count – 1 說明:以下程式用於設定子表關聯條件 If tblStruct2(0).fldType = "Numeric" Then

daView2.RowFilter = ckeyField1 & "=" & KeyText.Text Else

daView2.RowFilter = ckeyField1 & "='" & KeyText.Text & "'" ↑H

End If

DataGridView1.DataSource = daView2

‹ 設定資料表欄位結構及介面資料

在此段加入子表資料表欄位結構及介面資料設定程式碼 ReDim tblStruct2(fln2)

If wkSQL = "" Then

Call getTableStructure(wkTBL2, 2),說明:請自行設計副程式 Else

Call getSqlStructure(wkSQL2, 2) End If

End If

¾ 定義 On_MouseDown 事件程序

Private Sub On_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

Dim na As String '取得傳入事件之控制項名稱 na = sender.name

在此處加入自訂敘述

說明:加入自訂敘述,可依 na 個別設定對應程序,當處理人員在控制項上按 下滑鼠時,就會啟動此段程序。

End Sub

¾ 定義 KeyCBO_TextChanged 事件程序

用途:下拉選取鍵值,當鍵值改變時,觸發主表過濾機制

Private Sub keyCBO_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles keyCBO.SelectedIndexChanged

Try

bindSRC.Filter = Nothing

If keyCBO.Text = "" Then Exit Sub 說明:以下程式用於設定主表過濾條件

If tblStruct(0).fldType = "String" Or tblStruct(0).fldType = "Stamp" Then bindSRC.Filter = keyField1 & "='" & keyCBO.Text & "'"

Else

If tblStruct(0).fldType = "Date" Then

bindSRC.Filter = keyField1 & "='" & keyCBO.Text & "'"

Else

bindSRC.Filter = keyField1 & "=" & keyCBO.Text

End If ↑H

End If

Catch ex As Exception MsgBox(ex.Message) End Try

End Sub

¾ 定義 KeyText_TextChanged 事件程序

Private Sub KeyText_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KeyText.TextChanged

Dim i As Integer Dim vl

說明:以下程式用於設定子表關聯條件 If wkTBL2 <> "" Or wkSQL2 <> "" Then If tblStruct2(0).fldType = "Numeric" Then

daView2.RowFilter = ckeyField1 & "=" & KeyText.Text Else

daView2.RowFilter = ckeyField1 & "='" & KeyText.Text & "'"

End If End If End Sub

¾ 定義主表資料更新事件程序

事件程序應包含下列敘述(子表更新程序與主表類似):

‹ 擷取控制項資料並存放於資料表結構體變數內 語法:

For i = 0 To UBound(tblStruct) vl = obj(i).text

vl = 依欄位型態將 vl 轉型 tblStruct(i).fldValue = vl Next

‹ 修改資料時

upOK = UpdateNewRecord(1, kv1, kv2) If upOK = True Then

lblStatus.Text = "更新成功..."

Else

lblStatus.Text = "更新失敗..."

End If ↑H

‹ 新增資料時

upOK = InsertNewRecord(1, kv1, kv2) If upOK = True Then

lblStatus.Text = "新增成功..."

BindingNavigatorAddNewItem.Visible = True Else

lblStatus.Text = "新增失敗..."

End If

¾ 定義主表資料刪除事件程序

事件程序應包含下列敘述(子表刪除程序與主表類似):

Dim srtKey As String srtKey = 組合過濾鍵值 If newDrow = False Then

If DeleteKeyValue(wkTBL, srtKey) = True Then lblStatus.Text = "紀錄已刪除.."

End If End If

在文檔中 第六章資料處理類別介紹 (頁 31-37)

相關文件