Member 13019612 Ответов: 1

Найдите datakey selectedrow и отправьте его в виде строки запроса


привет , у меня есть сетка-представление с полем шаблона, которое содержит кнопку изображения, и вы можете увидеть ее на скриншоте ниже
Мой Gridview
хорошо, я хочу, чтобы, когда пользователь нажмет на эту кнопку изображения(кнопка редактирования), пользователь будет перенаправлен на страницу редактирования с именем : EditUser.aspx и отправит DataKey выбранной строки в виде строки запроса с именем : stcode
поэтому я пишу этот код для этой работы
int selectedRow;
protected void imgBtnEdit_Click(object sender, ImageClickEventArgs e)
{
    GridViewRow row = this.GridStudent.SelectedRow;
    selectedRow = int.Parse(GridStudent.DataKeys[row.RowIndex].Value.ToString());
    Response.Redirect("~/Admin/EditUser.aspx?" +
        "stcode=" + selectedRow);
}


на главной странице и напишите этот код в файле EditUser.aspx
protected void Page_Load(object sender, EventArgs e)
{
   usercode = Request.QueryString["stcode"];
   GetData();
}


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

private void GetData()
{
    DataTable dt = new DataTable();
    con.Open();
    SqlCommand sqlCmd = new SqlCommand("SELECT count(*) from Student where St_Code='" + usercode + "'", con);
    SqlDataAdapter sqldata = new SqlDataAdapter();
    sqldata.Fill(dt);

    if (dt.Rows.Count > 0)
    {
        lblName.Text = dt.Rows[0]["St_Name"].ToString(); //Where ColumnName is the Field from the DB that you want to display
        lblFamily.Text = dt.Rows[0]["St_Family"].ToString();
        lblStcode.Text = dt.Rows[0]["St_Code"].ToString();
        tbPassword.Text = dt.Rows[0]["St_Password"].ToString();
    }
    con.Close();
}


но каждый раз он будет возвращать stcode=0 :(
я знаю, что проблема заключается в главной странице, но я не знаю, как ее решить

FranzBe

Вы заполняете свою таблицу данных только количеством студентов, так что в ней будет только одна строка с одним столбцом. Код после if (dt.Rows.Count > 0) не имеет, следовательно, никакого смысла. Попробуйте заменить ' count(*)' на '*', 'sqlCmd' должен быть передан конструктору SqlDataAdapter, в вашем коде нет никакой связи между ними.

Member 13019612

Вы правы, но моя проблема все еще stcode=0

1 Ответов

Рейтинг:
5

Karthik_Mahalingam

попробовать это

protected void imgBtnEdit_Click(object sender, ImageClickEventArgs e)
      {
          GridViewRow row = ((Control)sender).Parent.NamingContainer as GridViewRow;
          string key = GridStudent.DataKeys[row.RowIndex].Value.ToString();
          Response.Redirect("~/Admin/EditUser.aspx?stcode=" +  key);
      }



Форматирование строки sql запроса таково уязвимый к SQL-инъекция[^] атаки
всегда использовать Параметризованные запросы для предотвращения атак SQL-инъекций в SQL Server[^]

SqlCommand sqlCmd = new SqlCommand("SELECT *  from Student where St_Code=@code", con);
sqlCmd.Parameters.AddWithValue("@code", usercode);


согласно комментариям, нет смысла получать счетчик из таблицы и пытаться заполнить его в текстовом поле, он выбросит столбец not found error, заменит его нужными столбцами или просто добавит * к выделению .