Choroid Ответов: 2

Vb.net datagridview добавляет пустые строки ?


Я бы назвал это скорее напыщенной тирадой, чем вопросом.

Чтобы пропустить разглагольствования перейдите к ок давайте перейдем к вопросам
VS 2019 DataGridView (DGV) - это как та старая поговорка: "Вы можете иметь свой торт и есть, чтобы"

За исключением того что с DGV вы получаете только торт не едите его

После долгих поисков и проб и ошибок играя с DGV это так замечательно просто писать
dgvOne.DataSource = dt
и у вас есть отображаемые данные


Моя проблема заключается в том, что при использовании этой техники нет ручного добавления в DGV>br/>
Почему ОКР разглагольствует если вы не заполняете его данными у DGV есть это уродливое серое пространство под моей записью раз в месяц действительно не очень хороший пользователь LOOING EX


Хорошо давайте перейдем к вопросам

Я знаю, как вручную добавить заголовки столбцов с кодом и свойствами

Я предполагаю, что могу выбрать из таблицы поместить эти значения в StringArray

Я редко обнимаю массивы я всегда думал о них как о БД которые исчезают


Итак, как мне выполнить цикл через массив строк и добавить значения в виде строк в DGB

И есть ли у DGV предварительно заполненные 12 пустых строк?

Код ниже-это то, что я пробовал


Что я уже пробовал:

'Private Sub aA(getListOfMotonum() As List(Of String))
Public Sub aA()
    'Code Below makes empty ROWS in DGV
    ''dgvOne.Columns.AddRange(Enumerable.Range(0, 2).Select(Function(x) New DataGridViewTextBoxColumn).ToArray)
    ''dgvOne.Rows.AddRange(Enumerable.Range(0, 10).Select(Function(x) New DataGridViewRow).ToArray)
    Dim SQL As String = "Select * FROM ParentTable"
    'Dim SQL As String = "SELECT COUNT(*) FROM ParentTable"
    Dim output As New List(Of String)()
    Dim dbName As String = "Word.db"
    'Dim cmd As New SQLiteCommand


    ' Set the connection string in the Solutions Explorer/Properties/Settings object (double-click)
    Using conn = New SQLiteConnection("Data Source =" & dbName & ";Version=3;")
        Using cmd = New SQLiteCommand(SQL, conn)
            conn.Open()

            Try
                Dim dr = cmd.ExecuteReader()
                While dr.Read()

                    output.Add(dr("NAME").ToString())
                    'Dim output As New List(Of String)()
                    rtbEnter.Text = dr("NAME").ToString()
                    'rtbEnter.Text = output.ToArray()

                End While
            Catch e As SqlClient.SqlException
                ' Do some logging or something.
                MessageBox.Show("There was an error accessing your data. DETAIL: " & e.ToString())
            End Try
        End Using
    End Using
    Dim str1 As String, str2 As String
    Dim L As Integer
    For Each item As String In output
        lbOne.Items.Add(item)
        L = Len(item)
        str1 = CStr(L)
        str2 = output(0)
    Next
    'dgvOne.ColumnCount = 3
    'dgvOne.Columns(0).Name = "PID"
    'dgvOne.Columns(1).Name = "Entry Data"
    Dim dt As New DataTable
    dt.Columns.Add("ID")
    dt.Columns.Add("Name")
    dt.Columns(0).AutoIncrement = True
    Dim R As DataRow = dt.NewRow
    R("Name") = str1 & " " & str2
    dt.Rows.Add(R)
    dgvOne.DataSource = dt

    'Return output
End Sub

Richard MacCutchan

Я не уверен, что понимаю, на что вы жалуетесь, но заполнение элементов управления DataGridView вручную или через источник привязки работает нормально. Но пытаться делать и то и другое не имеет смысла, так как одно перехитрит другое.

2 Ответов

Рейтинг:
15

CHill60

В вашем примере кода Вы, по-видимому, пытаетесь выполнить оба метода. Выбрать одно. Смотрите комментарий от @Richard-MacCutchan.

Если вы идете по маршруту datatable

dgvOne.DataSource = dt
затем добавьте 12 пустых строк к объект DataTable до присвоение его источнику данных.

Если вы идете по пути ручного добавления строк в datagridview, то просто добавьте еще 12 пустых строк в отдельный цикл после добавления ваших данных.

То одно, то другое. Но не оба.

Прочие комментарии
- если вы собираетесь пройти через каждую запись в вашем наборе результатов, то сделайте всю работу в этом цикле. Не знаю, почему у вас есть еще один цикл для каждого.

- В том, что для-каждой петли
For Each item As String In output
вы постоянно переписываете L, str1 и str2- Я подозреваю, что вы хотели ...
R("Name") = str1 & " " & str2
dt.Rows.Add(R)
на самом деле внутри эта петля

- В этом нет никакой необходимости в массивах. И вы никогда им не пользовались.

Напоследок - небольшой совет для получения более быстрых и качественных ответов ... избавьтесь от закомментированных строк в коде, который вы представляете нам здесь. Особенно если вы используете не правильный lang="VB" в ваших сообщениях. Это просто загромождает ваш вопрос, делая его более трудным для людей, чтобы читать. Многие участники просто перейдут к следующему вопросу, который вам не очень поможет.


Choroid

@Richard-MacCutchan Спасибо я согласен, что менее закомментированный код был бы идеальным предположением, что я стал жалобой стесняться использования StackOverflow, где вы не показали нам достаточно того, что вы пробовали. Я опубликую свой завершенный код ниже для других, которые могут захотеть увидеть готовый продукт мое разочарование в этой проблеме заключается в том, что я сделал это в JavaFX примерно за 10 минут в качестве novas

Рейтинг:
0

Choroid

Вот завершенный код из приведенного выше решения


Private Sub PopulateDGV()

    Dim str2 As String
    Dim s1 As Integer
    Dim dbName As String = "Word.db"
    Dim conn As New SQLiteConnection("Data Source =" & dbName & ";Version=3;")
    Dim valuesList As ArrayList = New ArrayList()
    conn.Open()

    'Read from the database
    Dim cmd As SQLiteCommand = New SQLiteCommand("Select * FROM ParentTable", conn)
    Dim rdr As SQLite.SQLiteDataReader = cmd.ExecuteReader

    'Set Design of the DataGridView
    dgvOne.DefaultCellStyle.Font = New Font("Tahoma", 10)
    dgvOne.ColumnCount = 2
    dgvOne.Columns(0).Width = 60
    dgvOne.Columns(1).Width = 420

    'DGV Header Names
    dgvOne.Columns(0).Name = "PID"
    dgvOne.Columns(1).Name = "Entry Data"

    'Read from DB Table add to DGV row
    While rdr.Read()
        valuesList.Add(rdr(1)).ToString()
        lbOne.Items.Add(rdr(1)).ToString()
        s1 = rdr(0).ToString
        str2 = rdr(1)
        dgvOne.Rows.Add(s1, str2)
    End While

    'Add Blank rows to DGV
    For iA = 1 To 4
        dgvOne.Rows.Add(" ")
    Next

    conn.Close()

End Sub