Aqeel Shoukat Ответов: 1

Как показать данные из SQL-запроса в виде гиперссылки в datagridview


Я заполняю свой datagridview из своей базы данных следующим образом

con.Open();
            SqlCommand cmd = new SqlCommand("select consumerData01.consumerSubDivision as 'Sub-Division',COUNT (*) as TOTAL,"
    + "SUM(case when Office_AppStatus= 'Demand Notice Issued' then 1 else 0 end) as 'Demand Notice Issued',"
    + "SUM(case when Office_AppStatus= 'Survey Report' then 1 else 0 end)as 'Survey',"
    + "SUM(case when Office_AppStatus= 'Rejected' then 1 else 0 end)as 'Rejected',"
    + "SUM(case when Office_AppStatus= 'Submitted' then 1 else 0 end)as 'Submitted',"
    + "SUM(case when Office_AppStatus= 'Meter Installed' then 1 else 0 end)as 'Meter Installed'"
    + "from OfficeDat01 "
    + "inner join consumerData01 on consumerAppRegNo = OfficeDat01.Office_AutoCode "
    + "where consumerData01.consumerRegDate between '" + d1 + "' and '" + d2 + "'"
    + " and consumerSubDivision like '" + s + "%'"
    + "group by consumerSubDivision ", con);
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds);
            con.Close();
            if (ds.Tables[0].Rows.Count > 0)
            {
              
                GridView1.DataSource = ds;
                GridView1.DataBind();


            }
            else {

                 GridView1.DataSource = "";
                 GridView1.DataBind();
                 lblMsg.Font.Bold = true;
                 lblMsg.ForeColor = System.Drawing.Color.Red;
                 lblMsg.Text = "No Record Found";


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

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

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

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if(e.Row.RowType == DataControlRowType.DataRow)
    {
      // Get the value in the hyperlink column.
      string HyperLinkValue = e.Row.Cells[1].Text;
      
      HyperLink myLink = new HyperLink();
      myLink.NavigateUrl = HyperLinkValue;
      myLink.Text = HyperLinkValue;
      e.Row.Cells[1].Controls.Add(myLink);
    }
    }

1 Ответов

Рейтинг:
1

Richard Deeming

Начните с фиксации SQL-инъекция[^] уязвимость в вашем коде:

SqlCommand cmd = new SqlCommand("select consumerData01.consumerSubDivision as 'Sub-Division',COUNT (*) as TOTAL,"
    + "SUM(case when Office_AppStatus= 'Demand Notice Issued' then 1 else 0 end) as 'Demand Notice Issued',"
    + "SUM(case when Office_AppStatus= 'Survey Report' then 1 else 0 end)as 'Survey',"
    + "SUM(case when Office_AppStatus= 'Rejected' then 1 else 0 end)as 'Rejected',"
    + "SUM(case when Office_AppStatus= 'Submitted' then 1 else 0 end)as 'Submitted',"
    + "SUM(case when Office_AppStatus= 'Meter Installed' then 1 else 0 end)as 'Meter Installed'"
    + "from OfficeDat01 "
    + "inner join consumerData01 on consumerAppRegNo = OfficeDat01.Office_AutoCode "
    + "where consumerData01.consumerRegDate between @d1 and @d2"
    + " and consumerSubDivision like @s + '%' "
    + "group by consumerSubDivision ", con);

cmd.Parameters.AddWithValue("@d1", d1);
cmd.Parameters.AddWithValue("@d2", d2);
cmd.Parameters.AddWithValue("@s", s);


Затем измените необходимые столбцы на гиперссылки. Если вы используете то GridView контроль[^], использовать один HyperLinkField[^]. Если вы используете то DataGrid контроль[^], использовать один HyperLinkColumn[^].

NB: В нем нет элемента управления "DataGridView". ASP.NET, так что из вашего вопроса не ясно, какой элемент управления вы используете.

Напр.:
<asp:HyperLinkField
    HeaderText="Demand Notice Issued"
    DataTextField="Demand Notice Issued"
    DataNavigateUrlFields="Sub-Division"
    DataNavigateUrlFormatString="~/ViewSubDivision.aspx?id={0}"
/>

При этом будет сгенерирована гиперссылка с текстом, равным значению поля "выдано уведомление о требовании", и URL-адресом, равным ~/ViewSubDivision.aspx?id=..., ставя значение поля "подразделение" после " id=".


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


Maciej Los

Мне действительно нравятся ссылки под строкой ;)

Aqeel Shoukat

Извините, что перепутал GridView с DataGridView. Я использую GridView, и представление сетки заполняется во время выполнения. Все числовые значения, возвращаемые из запроса, преобразуются в гиперссылку. Теперь я хочу перейти на новую страницу и передать значение заголовка строки этого столбца и самого правого столбца гиперссылки, на которую нажал пользователь.

Richard Deeming

Так что используйте HyperLinkField как я и предполагал. Если вы хотите передать несколько значений полей, укажите разделенный запятыми список имен полей в поле DataNavigateUrlFields свойство, а также использовать несколько заполнителей в DataNavigateUrlFormatString собственность.

<asp:HyperLinkField
    ...
    DataNavigateUrlFields="Field0,Field1,Field2"
    DataNavigateUrlFormatString="~/path.aspx?a={0}&b={1}&c={2}"
/>