vb.net 展開程式碼

以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