簡體   English   中英

Datagridview水平到垂直按鈕

[英]Datagridview Horizontal to vertical button

嘗試使datagridview數據垂直(帶有左側標題和每個旁邊的文本)時,下面的代碼不起作用。 一旦翻轉,用戶將單擊button1導出到excel。

Imports System.Data.DataTable
Imports System.IO
Imports Microsoft.Office.Interop
Public Class Form1
Dim table As New DataTable(0)
Public checkBoxList As List(Of CheckBox)
Private ds As DataSet = Nothing
Private dt As DataTable = Nothing
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ds = New DataSet()
    dt = New DataTable()
    ds.Tables.Add("Table")
    Dim my_DataView As DataView = ds.Tables(0).DefaultView
    DataGridView1.DataSource = my_DataView
    table.Columns.Add("Forename", Type.GetType("System.String"))
    table.Columns.Add("Surname", Type.GetType("System.String"))
    table.Columns.Add("Food", Type.GetType("System.String"))
    checkBoxList = New List(Of CheckBox) From {CheckBox1, CheckBox2, CheckBox3, CheckBox4}


End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim currentDataSet As DataSet = FlipDataSet(ds) ' Flip the DataSet
    Dim values As String = "" &
    String.Join(" & ", checkBoxList _
    .Where(Function(cb) cb.Checked).Select(Function(cb) cb.Text))

    ' use values for placing into your DataGridView
    CheckBox1.Text = values
    CheckBox2.Text = values
    CheckBox3.Text = values
    CheckBox4.Text = values


    table.Rows.Add(TextBox1.Text, TextBox2.Text, values.ToString)
    DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
    DataGridView1.RowTemplate.Height = 100
    DataGridView1.AllowUserToAddRows = False
    DataGridView1.DataSource = table

    'Save to excel with headers
    Dim ExcelApp As Object, ExcelBook As Object
    Dim ExcelSheet As Object
    Dim i As Integer
    Dim j As Integer

    'create object of excel
    ExcelApp = CreateObject("Excel.Application")
    ExcelBook = ExcelApp.WorkBooks.Add
    ExcelSheet = ExcelBook.WorkSheets(1)

    With ExcelSheet
        For Each column As DataGridViewColumn In DataGridView1.Columns
            .cells(1, column.Index + 1) = column.HeaderText
        Next
        For i = 1 To Me.DataGridView1.RowCount
            .cells(i + 1, 1) = Me.DataGridView1.Rows(i - 1).Cells("Forename").Value
            For j = 1 To DataGridView1.Columns.Count - 1
                .cells(i + 1, j + 1) = DataGridView1.Rows(i - 1).Cells(j).Value
            Next
        Next

    End With

    ExcelApp.Visible = True
    '
    ExcelSheet = Nothing
    ExcelBook = Nothing
    ExcelApp = Nothing
End Sub

Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick

End Sub
Public Function FlipDataSet(ByVal my_DataSet As DataSet) As DataSet
    Dim ds As New DataSet()

    For Each dt As DataTable In my_DataSet.Tables
        Dim table As New DataTable()

        For i As Integer = 0 To dt.Rows.Count
            table.Columns.Add(Convert.ToString(i))
        Next
        Dim r As DataRow
        For k As Integer = 0 To dt.Columns.Count - 1
            r = table.NewRow()
            r(0) = dt.Columns(k).ToString()
            For j As Integer = 1 To dt.Rows.Count
                r(j) = dt.Rows(j - 1)(k)
            Next
            table.Rows.Add(r)
        Next

        ds.Tables.Add(table)
    Next

    Return ds
End Function

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim currentDataSet As DataSet = FlipDataSet(ds) ' Flip the DataSet
    Dim currentDataView As DataView = currentDataSet.Tables(0).DefaultView
    DataGridView1.DataSource = currentDataView

    Button2.Enabled = False

End Sub
End Class

單擊button2時,應使用以下內容翻轉數據;

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles 
    Button2.Click
    Dim currentDataSet As DataSet = FlipDataSet(ds) ' Flip the DataSet
    Dim currentDataView As DataView = currentDataSet.Tables(0).DefaultView
    DataGridView1.DataSource = currentDataView

    Button2.Enabled = False

    End Sub
    End Class

我嘗試調試,但似乎找不到任何錯誤? 這將允許我在選擇復選框的同時在文本框的插入數據,並且在單擊按鈕1導出時可以正常工作,但是不會翻轉數據。

請問有人可以建議如何解決此問題,因為我在6月8日有一個演示文稿,並且此數據需要自動翻轉

源代碼: 下載Myproject

目標形象

回答:

Imports Microsoft.Office.Interop
Imports System.Runtime.InteropServices

Public Class Form1
Private ds As DataSet = Nothing
Private dt As DataTable = Nothing

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    DataGridView1.AllowUserToAddRows = False

    dt = New DataTable("MyTable")
    dt.Columns.Add("Forename", Type.GetType("System.String"))
    dt.Columns.Add("Surname", Type.GetType("System.String"))
    dt.Columns.Add("Food", Type.GetType("System.String"))

    ds = New DataSet
    ds.Tables.Add(dt)

    Dim my_DataView As DataView = ds.Tables("MyTable").DefaultView
    DataGridView1.DataSource = my_DataView
End Sub

Private Sub Button_AddRowData_Click(sender As Object, e As EventArgs) Handles Button_AddRowData.Click
    Dim foods As String = String.Join(" & ", CheckedListBox1.CheckedItems.Cast(Of String))
    dt.Rows.Add(New Object() {TextBox_Forename.Text, TextBox_Surname.Text, foods})
End Sub

Private Sub Button_FlipAndSave_Click(sender As Object, e As EventArgs) Handles Button_FlipAndSave.Click
    FlipAndSave(ds.Tables("MyTable"))
End Sub

Private Sub FlipAndSave(table As DataTable)
    Dim ExcelApp As New Excel.Application
    Dim WrkBk As Excel.Workbook = ExcelApp.Workbooks.Add()
    Dim WrkSht As Excel.Worksheet = CType(WrkBk.Worksheets(1), Excel.Worksheet)

    With WrkSht
        For ci As Integer = 0 To table.Columns.Count - 1
            .Cells(ci + 1, 1) = table.Columns(ci).ColumnName
        Next
        For ri As Integer = 0 To table.Rows.Count - 1
            For ci As Integer = 0 To table.Columns.Count - 1
                .Cells(ci + 1, ri + 2) = table.Rows(ri).Item(ci).ToString
            Next
        Next
    End With

    ExcelApp.Visible = True

    'use this lines if you want to automatically save the WorkBook
    'WrkBk.SaveAs("C:\Some Folder\My Workbook.xlsx") '(.xls) if you have an old version of Excel

    'ExcelApp.Quit() 'use this line if you want to close the Excel Application

    ReleaseObject(ExcelApp)
    ReleaseObject(WrkBk)
    ReleaseObject(WrkSht)
End Sub

Private Sub ReleaseObject(obj As Object)
    Marshal.ReleaseComObject(obj)
    obj = Nothing
End Sub
End Class

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM