根据复选框更新网格视图
本文关键字:网格 视图 更新 复选框 | 更新日期: 2023-09-27 18:17:59
我有一个gridview。它包含针对所有值的复选框。单击复选框并按submit后,所选的项就会插入到另一个数据库中。我希望那些选定的项目不应该出现在当前的网格视图,如果下次加载。为此,我计划的是在当前数据库中必须有一列来指示复选框是否已被选中。这一栏将相应地用是/否填满。然后显示只有"No"的行。
然而,这似乎很长。还有其他方法吗?
因为我相信这是你的问题的延续,
我就从那里抄我的答案。
抱歉,如果它不是用c#写的,我刚刚注意到这个标签。
您需要包含主键或使记录在其表中唯一的列。我将假设一个"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*/
我不知道你在使用什么DB,所以这是有限的,但它会根据复选框获得单元格的值——这假设复选框在第三个单元格(索引2)中,并且在单元格0和1中还有其他文本(我不知道你的DGV看起来像什么)。然后,它将选中行的单元格值放入一个数据集——从那里您可以将数据集转储到您选择的数据库中(不确定您有什么)。至于下次加载时不显示该行,您可以更改单元格4(例如y/n单元格)的文本,然后更新当前数据库。下次加载DGV时,在调用中包括只显示X列中带有'y'的行(您是否使用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
从您对我的评论的回复来看,当前会话期间的限制似乎已经足够了。因此,您可以在会话变量中进行跟踪。
例如,如果您的行具有整数id,则可以在会话中存储List<int>
,并在每次提交检查的行时向列表添加id。然后在刷新网格时引用会话变量。
我不完全确定您的目标是什么,但如果您试图隐藏直接从网格中选中的项目,这是可能的。
查询: 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.
}