У меня есть gridview. Он содержит флажки против всех значений. Как только я нажму на флажок и нажимаю кнопку отправки, выбранные элементы вставляются в другую базу данных. Я хочу, чтобы эти выбранные элементы не отображались в текущем gridview, если они загружаются в следующий раз. Для этого я планировал, что в текущей базе данных должен быть столбец, чтобы указать, был ли флажок установлен или нет. Столбец будет заполнен да/нет соответственно. А затем отобразите строки, в которых есть только "Нет".
Однако это, кажется, длительное время. Есть ли другие средства для достижения этого.
Поскольку я считаю, что это продолжение вашей проблемы отсюда,
Я просто копирую свой ответ оттуда.
Извините, если он не написан в С#, я только что заметил этот тег только сейчас.
Вам нужно включить первичный ключ или столбец, который сделает вашу запись уникальной в ее таблице. Я просто возьму столбец "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*/
Я не совсем уверен, какова ваша цель, но если вы пытаетесь скрыть элементы, которые проверяются непосредственно из сетки, что возможно.
Запрос: 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.
}
Я не знаю, какую базу данных вы используете, поэтому она ограничена, но она получит значение ячейки на основе флажка - это предполагает, что 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
Из вашего ответа на мой комментарий кажется, что ограничение во время текущей сессии является достаточным. Поэтому вы можете отслеживать переменную сеанса.
Например, если ваши строки имеют идентификатор целого числа, вы можете сохранить List<int>
в сеансе и добавить идентификаторы в список каждый раз, когда будет отправлена проверочная строка. Затем обратитесь к переменной сеанса при обновлении сетки.