Member 14207792 Ответов: 3

Как добавить новый столбец в элемент управления datagridview ?


У меня есть DataGridView с источником данных из текстового файла

Command     Article      Qte       PU
abcd        ab17        17        1.8


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

Command     Article     Qte       PU          Designation
abcd        ab17        17        1.8         AAAAAAAA


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

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

      Dim ouvrir As New OpenFileDialog
      If ouvrir.ShowDialog = DialogResult.OK Then

          Dim sr As New StreamReader(ouvrir.FileName)
          While Not sr.EndOfStream
              DataGridView1.Rows.Add(sr.ReadLine.Split(CChar(vbTab)))
          End While
      End If
  End Sub

  Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
      Dim cmd As New SqlCommand("select Numero from DetailReceptionFrs", cn)
      Dim da As New SqlDataAdapter(cmd)
      Dim dt As New DataTable
      da.Fill(dt)
      DataGridView1.DataSource = dt

  End Sub

Gerry Schmitz

Вы соединяете текст и данные базы данных перед загрузкой таблицы данных. Создайте две коллекции из источников данных и используйте LINQ.

Maciej Los

Исходя из какой логики вы хотите добавить этот столбец? Есть ли какие-либо связанные данные?

3 Ответов

Рейтинг:
2

Maciej Los

Пожалуйста, сначала прочтите мой комментарий к этому вопросу.

Есть несколько проблем с вашим кодом. Что ж...

Настоящий кодекс:

DataGridView1.Rows.Add(sr.ReadLine.Split(CChar(vbTab)))

добавляет строки в компонент datagridview.
А вот этот:
DataGridView1.DataSource = dt

удаляет предыдущие данные и связывает их с datatable.

Вы должны решить, какой метод вы хотите использовать для отображения данных: а) несвязанный или б) связанный DataGridView.
Объявления)
Вы добавляете данные вручную, строка за строкой. Вы делаете это в Button1_Click событие.
Для получения более подробной информации, пожалуйста, смотрите: Пошаговое руководство: создание несвязанного элемента управления Windows Forms DataGridView | Microsoft Docs[^]

Объявление b)
Вы создаете источник данных и связываете его с компонентом DataGridView. Вы делаете это в Button2_Click событие.
Больше: Как привязать данные к элементу управления Windows Forms DataGridView | Microsoft Docs[^]
Как выполнить автогенерацию столбцов в элементе управления DataGridView Windows Forms с привязкой к данным | Microsoft Docs[^]



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

      Using ouvrir As New OpenFileDialog
          If ouvrir.ShowDialog = DialogResult.OK Then BindData(ouvrir.FileName)
      End Using
End Sub


Не LINQ для решения:
Private Sub BindData(sFileName As String)

	'create a datatable object to bind data to DataGridView component
Dim dt As DataTable = New DataTable()
	'add columns 
	dt.Columns.AddRange(New DataColumn() _
		{
			New DataColumn("Command", Type.GetType("System.String")), _
			New DataColumn("Article", Type.GetType("System.String")), _
			New DataColumn("Qte", Type.GetType("System.String")), _
			New DataColumn("PU", Type.GetType("System.String")), _
			New DataColumn("Designation", Type.GetType("System.String")) _
		})
	'add data from file
	Using sr As New StreamReader(sFileName)
		While Not sr.EndOfStream
			dt.Rows.Add(sr.ReadLine.Split(New String(){vbTab}, StringSplitOptions.RemoveEmptyEntries))
		End While
	End Using
	'bind data
	With DataGridView1
		.AutoGenerateColumns = True
		.DataSource = dt
	End With
End Sub


Решение Linq:
Private Sub BindData(sFileName As String)

	Dim lines As String() = File.ReadAllLines(sFileName)
	'create a datatable object to bind data to DataGridView component
Dim dt As DataTable = New DataTable()
	'add columns 
	dt.Columns.AddRange(New DataColumn() _
		{
			New DataColumn("Command", Type.GetType("System.String")), _
			New DataColumn("Article", Type.GetType("System.String")), _
			New DataColumn("Qte", Type.GetType("System.String")), _
			New DataColumn("PU", Type.GetType("System.String")), _
			New DataColumn("Designation", Type.GetType("System.String")) _
		})
	'add data from file
	dt = lines _
		.Select(Function(x) dt.LoadDataRow(x.Split(New String(){vbTab}, StringSplitOptions.RemoveEmptyEntries), False)) _
		.CopyToDataTable()
	'bind data
	With DataGridView1
		.AutoGenerateColumns = True
		.DataSource = dt
	End With
End Sub



Примечание №1: я понятия не имею, как данные из Sql Server связаны с данными из текстового файла, поэтому - вы должны использовать свою логику для заполнения Designation колонка.

Примечание № 2: приведенный выше код не является оптимальным, но он должен предоставить вам способ достижения вашей цели.

Примечание №3: я бы настоятельно рекомендовал использовать Использование Оператора (Visual Basic) | Microsoft Docs[^Пожалуйста, прочтите соответствующую статью, чтобы узнать, почему...

Удачи вам!


Рейтинг:
1

Member 14207792

спасибо за помощь
я попробовал вчера, и это сработало, однако это действительно заполняет мою цель
он показывает данные но после последних строк из текстового файла а не из первой строки

dt.Columns.Add("Command")
       dt.Columns.Add("Article")
       dt.Columns.Add("Qte")
       dt.Columns.Add("PU")

       Dim ouvrir As New OpenFileDialog
       If ouvrir.ShowDialog = DialogResult.OK Then
           Dim sr As New StreamReader(ouvrir.FileName)
           While Not sr.EndOfStream
               dt.Rows.Add(sr.ReadLine.Split(CChar(vbTab)))
           End While
           Using cmd As New SqlCommand("select Designation from DetailReceptionFrs", cn)
               Dim da As SqlDataReader = cmd.ExecuteReader

               dt.Columns.Add("Designation")
               While da.Read
                   Dim newRows As DataRow = dt.NewRow
                   newRows("Designation") = da("Designation")
                   dt.Rows.Add(newRows)
               End While
           End Using

           DataGridView1.DataSource = dt
       End If


Рейтинг:
0

OriginalGriff

Когда вы устанавливаете источник данных, это обеспечивает схему для DGV - и это означает, что вы не должны просто "добавлять столбец" к самому DGV.
Вы можете, просто добавив его в DGV.Сбор колонны :

DataGridView1.Columns.Add("NameOfColumn", "Coulumn Heading Text")
Но это может вызвать проблемы, если вы добавите строки и попытаетесь сохранить их / обновить исходный код позже.
Вы также можете сделать это, добавив его в базовый DataTable:
Dim dt As DataTable = TryCast(DataGridView1.DataSource, DataTable)
dt.Columns.Add("Rating")
что может сработать лучше.