Как сделать логический столбец редактируемым (asp.net VB gridView, заполненный объектом DataTable с логическим столбцом)? - PullRequest
0 голосов
/ 27 октября 2011

После заполнения таблицы данных в источнике данных GridView.Появляется столбец с флажком Тип, но он создается как столбец только для чтения, и я не могу включить его или сделать его редактируемым ... даже я пытался .readonly = false и все еще не может быть отредактирован, может кто-нибудь помочь, пожалуйста?*

1 Ответ

1 голос
/ 28 октября 2011

вы можете попробовать вот так ..

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

Существует два способа решения этой проблемы:

  1. Добавить ссылку редактирования
    В теге GridView добавьте AutoGenerateEditButton="True".Когда ваш GridView визуализируется в браузере, вы должны найти гиперссылку с надписью «Изменить».Если вы щелкнете по нему, поля в вашем GridView станут редактируемыми, и ссылка «Изменить» станет двумя ссылками: одна для сохранения ваших изменений в базе данных, а другая для их отмены.Используя этот метод, вы можете выполнить всю работу по подключению изменений в GridView к базе данных, в зависимости от того, как вы делаете привязку данных.В этом примере используется элемент управления SqlDataSource.
    альтернативный текст http://philippursglove.com/stackoverflow/checkboxgridview1.png альтернативный текст http://philippursglove.com/stackoverflow/checkboxgridview2.png

  2. Добавление TemplateField с CheckBox внутри него
    Внутри тега <columns>,Вы можете добавить TemplateFields, которые вы устанавливаете для себя, например,

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

alt text http://philippursglove.com/stackoverflow/checkboxgridview3.png

Этот флажок будет включен, но вам нужно сделать работу самостоятельно, чтобы отразить любые изменения обратно в базу данных.Это просто, если вы можете получить ключ базы данных, так как вам нужно будет запустить оператор UPDATE в какой-то момент, и вы захотите запустить его в правильном ряду!Вот два способа сделать это:

В своем теге Gridview добавьте DataKeyNames="MyDatabasePrimaryKey".Затем в обработчике событий CheckedChanged вам нужно выяснить, в какой строке вы находитесь, и найти это в массиве DataKeys.

   Protected Sub DiscontinuedCheckBox_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
    Dim DiscontinuedCheckBox As CheckBox
    Dim conn As SqlConnection
    Dim cmd As SqlCommand
    Dim productId As Integer
    Dim selectedRow As GridViewRow
    ' Cast the sender object to a CheckBox
    DiscontinuedCheckBox = CType(sender,CheckBox)
    ' We can find the row we clicked the checkbox in by walking up the control tree
    selectedRow = CType(DiscontinuedCheckBox.Parent.Parent,GridViewRow)
    ' GridViewRow has a DataItemIndex property which we can use to look up the DataKeys array
    productId = CType(ProductGridView.DataKeys(selectedRow.DataItemIndex).Value,Integer)
    conn = New SqlConnection(ProductDataSource.ConnectionString)
    cmd = New SqlCommand
    cmd.Connection = conn
    cmd.CommandType = CommandType.Text
    If DiscontinuedCheckBox.Checked Then
        cmd.CommandText = ("UPDATE Products SET Discontinued = 1 WHERE ProductId = " + ProductId.ToString)
    Else
        cmd.CommandText = ("UPDATE Products SET Discontinued = 0 WHERE ProductId = " + ProductId.ToString)
    End If
    conn.Open
    cmd.ExecuteNonQuery
    conn.Close
End Sub

Или же вы можете добавить ключ в элемент управления HiddenField.:

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

     Protected Sub DiscontinuedCheckBox_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
    Dim DiscontinuedCheckBox As CheckBox
    Dim ProductIdHiddenField As HiddenField
    DiscontinuedCheckBox = CType(sender,CheckBox)
    ProductIdHiddenField = CType(DiscontinuedCheckBox.Parent.FindControl("ProductIdHiddenField"),HiddenField)
    conn = New SqlConnection(ProductDataSource.ConnectionString)
 ..................
    If DiscontinuedCheckBox.Checked Then
        cmd.CommandText = ("UPDATE Products SET Discontinued = 1 WHERE ProductId = " + ProductIdHiddenField.Value)
    End If
...............
End Sub

Надеюсь, это поможет вам ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...