Как сделать файл Excel ресурсом VB.NET для формы dataGridview? - PullRequest
0 голосов
/ 05 декабря 2018

Я изучаю VB.NET, поэтому, пожалуйста, прости мое невежество ...

Я использую форму dataGridView для отображения файла Excel (.xls) в виде файла справки.Я использую формат Excel, потому что он очень хорошо форматирует, может обновляться в Excel и отлично выглядит в форме dataGridView ... намного проще и лучше, чем стандартный текстовый файл.

Но даже при том, что я могу получить доступ к файлус диска («C: \ DTC.XLS»), я хочу поместить файл в само приложение VB как ресурс. Я не смог сделать это успешно. Я перетащил файл в Solution Explorer> My Project>Ресурсы. Он отображается как «DTC» в файлах.

В моем коде, если я заменю путь к файлу ('C: \ DTC.XLS') на дескриптор ресурса (My.Resources.DTC),Я получаю исключение: «System.Data.OleDb.OleDbException:« Невозможно обновить. База данных или объект только для чтения »."

Я в порядке с« только для чтения »... это просто файл справки. Как я могу получить форму dataGridView, чтобы открыть этот ресурс без исключения?

Моя процедура:

Private Sub DTCinfo(sender As Object, e As EventArgs) Handles DTCdataGridView_button.Click

    If DTCdataGridView_button.Text = "CLOSE Info" Then
        DataGridView1.Hide()
        DTCdataGridView_button.Text = "DTC Info"
        DTCdataGridView_button.BackColor = SystemColors.ControlDarkDark

    Else
        DTCdataGridView_button.Text = "CLOSE Info"
        DTCdataGridView_button.BackColor = Color.Red

        Dim MyConnection As System.Data.OleDb.OleDbConnection
        Dim DtSet As System.Data.DataSet
        Dim MyCommand As System.Data.OleDb.OleDbDataAdapter

        ' ***** THE FOLLOWING LINE WORKS OK WITH THIS SUBROUTINE:
        ' MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source='c:\DTC.xls';Extended Properties=Excel 8.0;")

        ' ***** THE FOLLOWING LINE DOES NOT WORK WITH THIS SUBROUTINE (GENERATES AN EXCEPTION):
        MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source=My.Resources.DTC;Extended Properties=Excel 8.0;")

        MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection)
        MyCommand.TableMappings.Add("Table", "Net-informations.com")
        DtSet = New System.Data.DataSet
        MyCommand.Fill(DtSet)

        DataGridView1.DataSource = DtSet.Tables(0)
        DataGridView1.ReadOnly = True
        DataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.[True]

        AutoSizeColumnsMode = True
        AutoSizeRowsMode = True
        DataGridView1.Columns(0).AutoSizeMode = False

        DataGridView1.Columns(0).Width = 50
        DataGridView1.Columns(2).Width = 200
        DataGridView1.Columns(3).Width = 150

        DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells

        With DataGridView1
            .RowHeadersVisible = False
            .Columns(0).HeaderText = "DTC"
            .Columns(1).HeaderText = "Test Mode"
            .Columns(2).HeaderText = "Description"
            .Columns(3).HeaderText = "Action"
        End With

        MyConnection.Close()
        DataGridView1.Show()

    End If

End Sub

Я нашел другой пример того, как сделать это в Интернете. Его проще читать и легче понимать, но я все еще получаю то же исключение: «Не удается обновить: база данных или объект доступны только для чтения». Какисправить?

    ' here's another test....
Sub testDataGridView()

    Dim dt As New DataTable
    ' Note, you should use My.Settings rather than My.Resources for storing the data source
    '        Dim connectionString As String =
    '            $"provider=Microsoft.Jet.OLEDB.4.0;Data Source={My.Settings.gizmotest};Extended Properties=Excel 8.0;"
    Dim connectionString As String =
        $"provider=Microsoft.Jet.OLEDB.4.0;Data Source={My.Resources.DTC};Extended Properties=Excel 8.0;"
    ' Note, you should use import statements for these objects e.g.
    ' Place this as the first line in the code file
    ' Imports System.Data.OleDb

    Using cn As New OleDbConnection With {.connectionString = connectionString}
        Using cmd As New OleDbCommand With {.Connection = cn, .CommandText = "select * from [Sheet1$]"}
            Try
                cn.Open()
                dt.Load(cmd.ExecuteReader)
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try

        End Using
    End Using

End Sub

1 Ответ

0 голосов
/ 06 декабря 2018

ОК, кажется, что форма DataGridView не будет работать с источником только для чтения ... или, по крайней мере, не будет, если он использует формат ввода Excel ... верно?И я думаю, что ресурс может быть только для чтения ... Я думаю?Я не мог понять все это окончательно, но это мое лучшее предположение ...

Таким образом, я создал временный файл на диске при открытии формы, скопировал ресурс в файл, открыл файл в DataGridViewФорма, затем закрыли и удалили файл.Вуаля!Работает.Мне кажется немного глупым, но эй, это работает, выглядит хорошо, так что теперь перейдем к более крупным вещам ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...