Столбцы CheckBoxField в ASP.NET GridView отключены, даже если для ReadOnly установлено значение false

Второй запрос должен использовать $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. : -)

23
задан THelper 21 May 2012 в 09:41
поделиться

1 ответ

Это сделано специально; строки в GridView по умолчанию не редактируются.

Есть два способа решить эту проблему:

1. Добавьте ссылку «Изменить»

В теге GridView добавьте AutoGenerateEditButton = "True" . Когда ваш GridView отображается в браузере, вы должны найти гиперссылку с надписью «Изменить». Если вы щелкнете по ней, поля в вашем GridView станут доступными для редактирования, а ссылка «Изменить» станет двумя ссылками: одна для сохранения ваших изменений в базе данных, а другая - для их отмены. Используя этот метод, можно сделать все, что связано с подключением изменений в GridView к базе данных, в зависимости от того, как вы выполняете привязку данных. В этом примере используется элемент управления SqlDataSource.
alt text
(источник: philippursglove.com )

alt text

2. Добавьте TemplateField с флажком внутри него

Внутри тега вы можете добавить TemplateField, которые вы устанавливаете привязку данных для себя, например

<asp:TemplateField HeaderText="Discontinued">  
    <ItemTemplate>  
        <asp:CheckBox runat="server" ID="DiscontinuedCheckBox" 
            Checked='<%# Eval("Discontinued")  %>' AutoPostback="true" 
            OnCheckedChanged="DiscontinuedCheckBox_CheckedChanged" />  
    </ItemTemplate>  
</asp:TemplateField>

alt text
(источник: 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;
    }
    ...
    }
40
ответ дан 28 November 2019 в 23:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: