Cute Girly Geek Ответов: 1

Datagrid rowcommand показывает неверное значение после моего результата поиска


Всем привет,
Мой проект кажется простым. Моя форма заполняет datagrid при загрузке (из базы данных)
У меня есть кнопка поиска, которая работает, и теперь я могу фильтровать результаты.
У меня также есть onRowCommand, который на данный момент просто показывает детали выбранной строки.
Тем не менее, при загрузке страницы, кажется, все в порядке, я могу проверить детали без проблем. Но, когда я делаю поиск. это показывает мне другую ценность.
например.

Хината [Показать]
Сакура [Показать]
Тентен [Показать]

если поиск "n"
в результате получается


Хината [Показать]
Тентен [Показать]

но когда я нажимаю вид Тентен - он показывает сакуру :(

моя форма
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
             
        If Not Me.IsPostBack Then
            Me.BindGrid("")
        End If

        End Sub


Hello Again,
I kinda cleaned my code a bit. I also used a viewstate.. but I still get the error.
<pre lang="vb">
Protected Sub lnkSearch_Click(sender As Object, e As EventArgs) Handles lnkSearch.Click
        Dim strSearch As String
        
        strSearch = "SELECT Fid,RealName,Department FROM tblUsers" &
                                    " WHERE RealName LIKE '%" & txtName.Text & "%'"

        Dim constring As String = "Data Source=LOCALHOST\SQLEXPRESS;Initial Catalog=dbTOD_Sql;Integrated Security=True"
        Using con As New SqlConnection(constring)
            Using cmd As New SqlCommand(strSearch, con)
                cmd.CommandType = CommandType.Text
                Using sda As New SqlDataAdapter(cmd)
                    Using dt As New DataTable()
                        sda.Fill(dt)

                        'Set AutoGenerateColumns False
                        GridView1.AutoGenerateColumns = False

                        'First time knowing ViewState. HOpe this works
                        ViewState("vsTable") = dt
                        'Reading the viewstate values.
                        Dim dt2 As DataTable = DirectCast(ViewState("vsTable"), DataTable)
                        GridView1.DataSource = dt2
                        GridView1.DataBind()
                    End Using
                End Using
            End Using
        End Using
    End Sub
</pre>



Защищенный Sub GridView1_RowCommand(отправитель как объект, e Как GridViewCommandEventArgs)

Дим параметр rowindex как integer = конвертировать.ToInt32(e. CommandArgument)
Dim row As GridViewRow = GridView1. Rows(rowIndex)

- Доступ к значениям ячеек.
Dim customerId As Integer = целое число.Parse(row. Cells(0). Text)
Тусклое имя как строка = строка.Ячейки (1). Текст
MsgBox (имя) 'только для тестирования
Конец Подводной Лодки

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

Отредактировано: я попробовал Viewstate, как было предложено, но все равно получаю ошибку.

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

Richard Deeming

strSelectCmd = "SELECT Fid,Realname,,Department,Email FROM tblPerson" & " WHERE Department = '" & SelectedGroup & "'"

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]

Вы уже знаете, как использовать параметры-вы сделали все правильно. lnkSearch_Click. :)

Cute Girly Geek

Извините, что я вставил не тот lnkSearch_Click.. Это похоже на процедуру BindGrid (), но с str = " Select * FROM tblUsers WHERE Username LIKE '%" & txtName.txt &"%'"

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

Richard Deeming

Починка SQLi довольно проста:

Const strSearch As String = "SELECT Fid,RealName,Department FROM tblUsers WHERE RealName LIKE '%' + @Name + '%'"
...
Using cmd As New SqlCommand(strSearch, con)
   cmd.CommandType = CommandType.Text
   cmd.Parameters.AddWithValue("@Name", txtName.Text)
   ...


Нет необходимости хранить результаты в памяти. ViewState - этот GridView я уже позаботился об этом для тебя.

Что делает .aspx разметка выглядит как для сетки?

Cute Girly Geek

Спасибо, Мистер Ричард.. Извините за поздний ответ... это дизайн моей формы... Я думаю, что виноват.. Я старался все делать в одной форме. (Нилеш савардекар был прав).. Поэтому я просто создал новую форму для своего поиска,и она работала. Хотя мне бы очень хотелось получить пример viewstate. Спасибо снова. :)

Cute Girly Geek

Спасибо, Мистер Ричард.. Извините за поздний ответ... это дизайн моей формы... Я думаю, что виноват.. Я старался все делать в одной форме. (Нилеш савардекар был прав).. Поэтому я просто создал новую форму для своего поиска,и она работала. Хотя мне бы очень хотелось получить пример viewstate. Спасибо снова. :)

Richard Deeming

Вы уверены, что код, который Вы нам показали, дает вам результаты, которые вы показали?

Запрос в lnkSearch_Click не будет фильтровать сетку и не похоже, что она будет соответствовать двум записям, которые вы показали.

1 Ответов

Рейтинг:
2

nilesh sawardekar

Проверьте значение пользователя user1. если вы используете одну и ту же страницу для всех вещей, которые вы упомянули, то используйте viewstate[]