以DATASET.TABLE 使用展開功能
待改進:無法使用排序
wa12.rar




圖 01 02
03 04
功能說明:
就是點一點欄位 他會把欄位內容展開 如果只有一項 他就會直接顯示在上面
大概作法:
Datagridview(DGV) Datatable(DT1)
圖01
1.先顯示在(DGV)
把主表資料放入DGV 再把副表資料放入DT 2
利用DT的SELECT的選出只有主表在附表中一項的內容 並把它填入DGV
圖02 03 04
2.之後把DGV的資料掃入(DT1)
然後把副表的資料掃入DT2 再利用DT的SELECT語法
再次搜尋出點選時該行資料 主表帶副表是否有多項
超過一項 1.如該項尚未點選則利用DT1.rows.insert 在指定位子 插入搜尋到之副表內容
2. 如該項早已點選 則利用DT1.ROWS.REMOVEAT 移除DT1.ROWS.該隱藏內容
註:要關閉DATAGRIDVIEW的准許新增=false
Imports System.Data.OleDb
Public Class Form1
' Dim weBindingSource As New BindingSource
Dim wdataset As New DataSet
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim connect_string As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source =" + "c:\db2.mdb"
Dim cs As String = "select 員工編號,姓名,名 from man order by 員工編號"
Dim Dt As New DataTable
Dt = selectfunction(connect_string, cs, "man")
DataGridView1.DataSource = Dt
addopenFuncn()
End Sub
Private Sub DataGridView1_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
If e.RowIndex >= 0 Then
Dim dr2() As DataRow = wdataset.Tables("man1").Select("直屬上司='" + DataGridView1.Rows(e.RowIndex).Cells(0).Value.ToString() + "'")
Dim dr As DataRow
If dr2.Length > 1 Then
Dim dt As New DataTable()
dt = scanFuncion(DataGridView1)
If dt.Rows(e.RowIndex).Item(3) = "..." Then
dt.Rows(e.RowIndex).Item(3) = "true"
For indx As Integer = 0 To dr2.Length - 1
dr = dt.NewRow
dr("下屬") = dr2(indx)(1)
dr("作業") = dr2(indx)(2)
dt.Rows.InsertAt(dr, e.RowIndex + 1)
Next
DataGridView1.DataSource = dt
ElseIf dt.Rows(e.RowIndex).Item(3) = "true" Then
dt.Rows(e.RowIndex).Item(3) = "..."
For indx As Integer = 0 To dr2.Length - 1
dt.Rows.RemoveAt(e.RowIndex + 1)
Next
DataGridView1.DataSource = dt
End If
End If
End If
End Sub
Function scanFuncion(ByVal dv As DataGridView)
Dim dt As New DataTable()
Dim dc As DataColumn
' Dim dv As New DataGridView
Dim dr As DataRow
For id As Integer = 0 To dv.ColumnCount - 1
dc = New DataColumn
dc.ColumnName = dv.Columns(id).DataPropertyName.ToString()
dt.Columns.Add(dc)
Next
For ind As Integer = 0 To dv.Rows.Count - 1
dr = dt.NewRow()
For inde As Integer = 0 To dv.Columns.Count - 1
If IsDBNull(dv.Rows(ind).Cells(inde).Value) Then
dr(inde) = ""
ElseIf dv.Rows(ind).Cells(inde).Value = "" Then
dr(inde) = ""
Else
dr(inde) = dv.Rows(ind).Cells(inde).Value.ToString
End If
Next
dt.Rows.Add(dr)
Next
Return dt
End Function
Function addopenFuncn() As Integer
Dim column As DataGridViewColumn = New DataGridViewTextBoxColumn()
'column = New DataGridViewCheckBoxColumn()
column = New DataGridViewTextBoxColumn()
column.DataPropertyName = "開啟"
column.Name = "開啟"
column.ReadOnly = True
Dim column1 As DataGridViewColumn = New DataGridViewTextBoxColumn()
column1 = New DataGridViewTextBoxColumn()
column1.DataPropertyName = "下屬"
column1.Name = "下屬"
Dim column2 As DataGridViewColumn = New DataGridViewTextBoxColumn()
column2 = New DataGridViewTextBoxColumn()
column2.DataPropertyName = "作業"
column2.Name = "作業"
DataGridView1.Columns.Add(column)
DataGridView1.Columns.Add(column1)
DataGridView1.Columns.Add(column2)
Dim connect_string As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source =" + "c:\db2.mdb"
Dim cs As String = "select 直屬上司,下屬,作業 from man1 order by 直屬上司"
Dim connx As New OleDbConnection(connect_string)
Dim dataAdapter As New OleDb.OleDbDataAdapter(cs, connx)
Dim Dt As New DataTable
dataAdapter.Fill(wdataset, "man1")
Dt = wdataset.Tables("man1")
Dt.Select("直屬上司='1'", "直屬上司")
For i As Integer = 0 To DataGridView1.Rows.Count - 1
Dim dr2() As DataRow = wdataset.Tables("man1").Select("直屬上司='" + DataGridView1.Rows(i).Cells(0).Value.ToString() + "'")
If dr2.Length = 1 Then
DataGridView1.Rows(i).Cells(3).Value = "True"
DataGridView1.Rows(i).Cells(4).Value = dr2(0)(1).ToString
DataGridView1.Rows(i).Cells(5).Value = dr2(0)(2).ToString
Else
DataGridView1.Rows(i).Cells(3).Value = "..."
DataGridView1.Rows(i).Cells(4).Value = ""
DataGridView1.Rows(i).Cells(5).Value = ""
End If
Next
Return 0
End Function
End Class