Обновить сетку в соответствии с флажком

1

У меня есть gridview. Он содержит флажки против всех значений. Как только я нажму на флажок и нажимаю кнопку отправки, выбранные элементы вставляются в другую базу данных. Я хочу, чтобы эти выбранные элементы не отображались в текущем gridview, если они загружаются в следующий раз. Для этого я планировал, что в текущей базе данных должен быть столбец, чтобы указать, был ли флажок установлен или нет. Столбец будет заполнен да/нет соответственно. А затем отобразите строки, в которых есть только "Нет".

Однако это, кажется, длительное время. Есть ли другие средства для достижения этого.

  • 1
    Что значит «в следующий раз»? В любое время когда-либо?
  • 0
    после нажатия кнопки «Отправить» страница перезагружается. И в этот момент, вид сетки должен быть обновлен, т.е. проверенные элементы должны исчезнуть из вида сетки
Теги:
web-services

4 ответа

1
Лучший ответ

Поскольку я считаю, что это продолжение вашей проблемы отсюда,

Я просто копирую свой ответ оттуда.

Извините, если он не написан в С#, я только что заметил этот тег только сейчас.

Вам нужно включить первичный ключ или столбец, который сделает вашу запись уникальной в ее таблице. Я просто возьму столбец "ImageID".

Поместите его в скрытое поле в первом столбце.

Для этого вам понадобится выдать инструкцию SQL DELETE или UPDATE для этих строк после вставки в целевой БД. Хотя, используя последний, вам нужно будет иметь новый столбец в таблице, скажем - "TRANSFER_STATUS" tinyint, переключатель, который вы можете обновить 1 или 0.

<Columns>
    <asp:TemplateField>
        <HeaderTemplate>
            <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" 
                OnCheckedChanged="CheckUncheckAll"/>
        </HeaderTemplate>
        <ItemTemplate>
            <asp:CheckBox ID ="CheckBox2" runat="server" />
            <asp:HiddenField ID="hfImgID" runat="server" 
                Value=<%# Eval("ImageID") %> />
        </ItemTemplate>
    </asp:TemplateField>

Код позади:

Dim cbSelect As CheckBox, imgToInsert As Image
Dim ddlStatus As DropDownList, hfImgID As HiddenField

For Each r As GridViewRow In gvDetails.Rows
    cbSelect = r.Cells(0).FindControl("CheckBox2")

    If cbSelect.Checked Then
        hfImgID = r.Cells(0).FindControl("hfImgID")
        imgToInsert = r.Cells(1).FindControl("imgPreview")
        ddlStatus = r.Cells(2).FindControl("dpdListEstatus")

        /*Insert statement goes here...
        DELETE or UPDATE statement goes here, 
        passing the ID of the image from hfImgID.Value*/
    End If
Next r

**EDIT**

/*Call your SELECT statement again here to refresh your GridView.
  If you used UPDATE, you need to include 
  your toggle switch in the WHERE clause. TRANSFER_STATUS = 0*/
  • 0
    спасибо за ответ, но я использовал точно такой же метод, используя скрытое поле. Это то же самое, что я имел в виду в своем вопросе. Мне просто нужен какой-то другой метод. Кстати, я закончил это и использовал точно такой же подход, поэтому я отмечу это как ответ.
  • 0
    Использование классов и хранимых процедур может помочь вам сократить ваши коды.
0

Я не совсем уверен, какова ваша цель, но если вы пытаетесь скрыть элементы, которые проверяются непосредственно из сетки, что возможно.

Запрос: SELECT * FROM [db] WHERE ([Checked] = 0);

Таким образом, предпосылка заключается в том, что если значение равно нулю, оно появляется в сетке. Если он станет другим значением, он не появится в сетке.

сетка

<asp:TemplateField HeaderText="Active">
     <ItemTemplate>
          <asp:CheckBox Id="CustomerCheck" runat="server"
               Checked='<%# Eval("Active") %>'
               Enabled="false" />

          <asp:LinkButton Id="lbCustomerActive" runat="server"
               Text="Activate" CommandName="OnActivate" 
               ToolTip='<%# "Activate or Deactivate Course: " + Eval("CourseId") %>'
               OnClick="CustomerCheck_Click" CssClass="Activator" />
     </ItemTemplate>
</asp:TemplateField>

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

protected void CustomerCheck_Click(object sender, EventArgs e)
{
     // Logic to modify column in database.
}
0

Я не знаю, какую базу данных вы используете, поэтому она ограничена, но она получит значение ячейки на основе флажка - это предполагает, что chkbox находится в третьей ячейке (индекс 2) и что есть другой текст в ячейках 0 и 1 (я не знаю, как выглядит ваш DGV). он затем помещает значения ячейки проверенных строк в набор данных - оттуда вы можете сбросить набор данных в db по вашему выбору (не знаете, что у вас есть). Что касается не показания строки при следующей загрузке, вы можете изменить текст ячейки 4 (например, ay/n cell), а затем обновить текущую базу данных. В следующий раз, когда вы загружаете DGV, включите в свой вызов, чтобы показывать только строки с "y" в столбце X (используете ли вы SQL?)

 'get checked items and add to dataset
    Dim i As Integer = 0
    For i = 0 To Outdgv.RowCount - 1
        If Outdgv.Rows(i).Cells(2).Value = True Then
            Dim dsNewRow As DataRow
            dsNewRow = dataset.Tables("report").NewRow()
            Dim val1 As String = Outdgv.Rows(i).Cells(0).Value
            Dim val2 As String = Outdgv.Rows(i).Cells(1).Value
            dsNewRow.Item(1) = val1
            dsNewRow.Item(2) = val2
            dataset.Tables("report").Rows.Add(dsNewRow)
            Outdgv.Rows(i).Cells(3).Value = 'n'
        End If
    Next
0

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

Например, если ваши строки имеют идентификатор целого числа, вы можете сохранить List<int> в сеансе и добавить идентификаторы в список каждый раз, когда будет отправлена проверочная строка. Затем обратитесь к переменной сеанса при обновлении сетки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню