heyitsPJ Ответов: 4

Как заполнить datagrid без изменения имени заголовка.


Я хочу повторно использовать datagrid с фиксированным именем заголовка и свойствами, чтобы уменьшить мои формы windows, так как функция будет почти такой же.

Что я должен добавить для отображения данных?
Или есть способ отобразить данные без изменения имен заголовков?


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

	sql = "Select col1,col2,col3 from tbl_detailrec WHERE tc_no ='" & txtgetData.Text & "' order by col1"
	OpenConnection()
	Dim sqlReader As SqlDataReader = command.ExecuteReader()

        If sqlReader.HasRows Then
		Dim dt = New DataTable()
            	dt.Load(sqlReader)
            	DataGridView1.AutoGenerateColumns = False
            	DataGridView1.DataSource = dt
		DataGridView1.Refresh()
	End If

        sqlReader.Close()
 	connection.Close()
End Sub


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

Я попытался удалить столбцы, а затем установить AutoGenerateColumns к Правда но это также приведет к удалению свойств.

4 Ответов

Рейтинг:
4

heyitsPJ

Вышеприведенное решение (Мацей Лос) не работает для меня, но дало мне идею, поэтому я немного изменил его.
Вместо

For Each r As DataRow in dt.Rows
    DataGridView1.Rows.Add(r)
Next


Я использую это:

While sqlReader.Read
           Dim values(sqlReader.VisibleFieldCount) As Object
           sqlReader.GetValues(values)

           DataGridView1.Rows.Add(values)
 End While


И это дает мне результат, который я хотел.


Maciej Los

Я написал вышеописанный код прямо из своего разума (не тестировал его). Возможно, вам следует использовать литье типов, например:

For Each r As DataRow in dt.Rows
    DataGridView1.Rows.Add(DirectCast(r, Object))
Next

heyitsPJ

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

Рейтинг:
26

Maciej Los

Как говорится в документации MSDN Практическое руководство.Свойство AutoGenerateColumns[^] возвращает или задает значение указание на то, создаются ли столбцы автоматически когда заданы свойства DataSource или DataMember.

Таким образом, если вы хотите сохранить свою пользовательскую коллекцию столбцов с их свойствами, вы должны использовать пользовательский метод для полного заполнения компонента DataGridView.
Вы можете использовать: Строки.Добавить[^] метод.

Что касается вашего комментария к ответу OriginalGrif:

Цитата:
Привет, да, я знаю это, этот запрос предназначен только для примера. Мой исходный запрос длиннее и безопасен от SQL-инъекций. Но моя проблема здесь заключается в отображении данных из моего запроса в datagrid без изменения имен/свойств заголовка. Ну, спасибо за это в любом случае, поможет и другим тоже.

Нет, ваш запрос небезопасен и уязвим для атак SqlInjection. Пожалуйста, внимательно прочтите ответ OG.


Правильный способ-использовать параметры! Видеть:
Function GetMyData(sql As String, parameters As List<SqlParameter>)
dt As DataTable = New DataTable()

Using connection As SqlConnection = New SqlConnection(connectionstring)
    connection.Open()
    Using command As SqlCommand = New SqlCommand(sql, connection)
        For Each p As SqlParameter
            command.Parameters.Add(p);
        Next 'p
        Using sqlReader As SqlDataReader = command.ExecuteReader()
            dt.Load(sqlReader)
        End Using 'reader
    End Using 'command
End Using 'connection


Использование:
sql = "Select col1,col2,col3 from tbl_detailrec WHERE tc_no =@tc_no order by col1"
Dim parameters As List<SqlParameter> = New List<SqlParameter>()
parameters.Add(New SqlParameter("@tc_no", SqlDbType.VarChar).Value="some_value")
'or: Dim parameters As List<SqlParameter> = New List<SqlParameter>(){New SqlParameter("@tc_no", SqlDbType.VarChar).Value="some_value"}
 

'clear rows
DataGridView1.Rows.Clear()

Dim dt As DataTable = GetMyData(sql, parameters)
For Each r As DataRow in dt.Rows
    DataGridView1.Rows.Add(r)
Next


heyitsPJ

Привет. Как я уже сказал, мой первоначальный запрос не похож на тот, который я опубликовал, он почти похож на ваш, но мой немного длиннее, так что, вероятно, я мог бы использовать вашу версию. А также вместо FOR EACH-NEXT я использую WHILE-END WHILE. Я не знаю, почему он не работает, поэтому я заменил его. Спасибо, что подал мне идею.

Maciej Los

".. запрос есть ... почти схожий за твое ...- Это слово-материя! Что касается меня, то это звучит так, как будто вы все еще используете сцепленные строки...

Если мой ответ был полезен (вы сами это сказали), то лучший способ сказать "спасибо"-это принять ценный naswer в качестве решения и проголосовать за него. Используйте кнопку grenn, чтобы принять ответ и систему голосования (звезды в правом верхнем углу ответа), чтобы проголосовать вверх.

heyitsPJ

Не волнуйтесь, я не использую конкатенированные строки :D разница заключается в том, как я прошел свои параметры, потому что в исходном коде у меня есть много параметров. Кроме того, я нажимаю кнопку Принять решение и голосую вверх. Спасибо снова :)

Maciej Los

Всегда пожалуйста.
И спасибо тебе.

Рейтинг:
2

OriginalGriff

Только не это! Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?


heyitsPJ

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

Рейтинг:
0

Gerry Schmitz

Вы говорите, что два набора "строк данных" совместимы.

В этом случае просто добавьте / замените / объедините / что угодно строки в первой "таблице данных" (привязанной к сетке) со строками из второй таблицы данных / запроса.