Второй запрос должен использовать $thelist
не $row
, и он должен быть вне цикла while
. Цикл foreach
не нужен при обработке одной строки. Вы можете получить доступ к имени в $row
с помощью простого $row[0]
. Что-то вроде этого (untested):
$query1 = "SELECT name FROM clients WHERE sector = '$sectorlink'";
$clientresult = mysql_query($query1, $connection) or trigger_error("SQL", E_USER_ERROR);
while($row = mysql_fetch_array($clientresult)){
$temp[] = '"'.$row[0].'"';
}
$thelist = implode(",",$temp);
$query = "SELECT count(*) FROM studies WHERE client IN ($thelist) ORDER BY (date) desc";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);
Внимание! Помните, что ваш код очень уязвим для SQL-инъекций . Это нормально для тестирования или внутреннего развития, но если этот код будет работать на веб-сайте Fort Knox, вы захотите его исправить совсем немного. Просто FYI. : -)
Это сделано специально; строки в GridView по умолчанию не редактируются.
Есть два способа решить эту проблему:
В теге GridView добавьте AutoGenerateEditButton = "True"
. Когда ваш GridView отображается в браузере, вы должны найти гиперссылку с надписью «Изменить». Если вы щелкнете по ней, поля в вашем GridView станут доступными для редактирования, а ссылка «Изменить» станет двумя ссылками: одна для сохранения ваших изменений в базе данных, а другая - для их отмены. Используя этот метод, можно сделать все, что связано с подключением изменений в GridView к базе данных, в зависимости от того, как вы выполняете привязку данных. В этом примере используется элемент управления SqlDataSource.
(источник: philippursglove.com )
Внутри тега
вы можете добавить TemplateField, которые вы устанавливаете привязку данных для себя, например
<asp:TemplateField HeaderText="Discontinued">
<ItemTemplate>
<asp:CheckBox runat="server" ID="DiscontinuedCheckBox"
Checked='<%# Eval("Discontinued") %>' AutoPostback="true"
OnCheckedChanged="DiscontinuedCheckBox_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
(источник: philippursglove.com )
Этот флажок будет установлен, но вам необходимо выполнить работу самостоятельно, чтобы отразить любые изменения в базе данных.Это просто, пока вы можете получить ключ базы данных, так как вам нужно будет запустить оператор UPDATE
в какой-то момент, и вы захотите запустить его в правой строке! Это можно сделать двумя способами:
В теге Gridview добавьте DataKeyNames = "MyDatabasePrimaryKey"
. Затем в обработчике событий CheckedChanged
вам нужно выяснить, в какой строке вы находитесь, и найти ее в массиве DataKeys
.
protected void DiscontinuedCheckBox_CheckedChanged(object sender, EventArgs e)
{
CheckBox DiscontinuedCheckBox;
SqlConnection conn;
SqlCommand cmd;
int productId;
GridViewRow selectedRow;
// Cast the sender object to a CheckBox
DiscontinuedCheckBox = (CheckBox)sender;
// We can find the row we clicked the checkbox in by walking up the control tree
selectedRow = (GridViewRow)DiscontinuedCheckBox.Parent.Parent;
// GridViewRow has a DataItemIndex property which we can use to look up the DataKeys array
productId = (int)ProductGridView.DataKeys[selectedRow.DataItemIndex].Value;
using (conn = new SqlConnection(ProductDataSource.ConnectionString))
{
cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
if (DiscontinuedCheckBox.Checked)
{
cmd.CommandText = "UPDATE Products SET Discontinued = 1 WHERE ProductId = " + ProductId.ToString();
}
else
{
cmd.CommandText = "UPDATE Products SET Discontinued = 0 WHERE ProductId = " + ProductId.ToString();
}
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
}
Или вы можете добавить ключ в элемент управления HiddenField:
<asp:TemplateField HeaderText="Discontinued">
<ItemTemplate>
<asp:hiddenfield runat="server" id="ProductIdHiddenField"
Value='<%# Eval("ProductID") %>' />
<asp:CheckBox runat="server" ID="DiscontinuedCheckBox"
Checked='<%# Eval("Discontinued") %>'
AutoPostback="true"
OnCheckedChanged="DiscontinuedCheckBox_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
Код:
protected void DiscontinuedCheckBox_CheckedChanged(object sender, EventArgs e)
{
CheckBox DiscontinuedCheckBox;
HiddenField ProductIdHiddenField;
DiscontinuedCheckBox = (CheckBox)sender;
ProductIdHiddenField = (HiddenField)DiscontinuedCheckBox.Parent.FindControl("ProductIdHiddenField");
using (conn = new SqlConnection(ProductDataSource.ConnectionString))
{
...
if (DiscontinuedCheckBox.Checked)
{
cmd.CommandText = "UPDATE Products SET Discontinued = 1 WHERE ProductId = " + ProductIdHiddenField.Value;
}
...
}