我有一个gridview。它包含针对所有值的复选框。单击复选框并按提交后,所选项目将插入另一个数据库中。我希望那些选定的项目不会出现在当前网格视图中,如果下次加载的话。 为此,我计划的是当前数据库中必须有一列来指示是否已选中该复选框。该列将相应地填充是/否。然后显示只有" No"的行。在他们中间。
然而,这似乎很漫长。有没有其他办法来实现这一目标。
答案 0 :(得分:1)
因为我认为这是here,
的问题的延续我只是从那里复制我的答案。
很抱歉,如果它不是用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*/
答案 1 :(得分:0)
我不知道你正在使用什么数据库,所以这是有限的,但它会根据复选框得到一个单元格的值 - 这假设chkbox在第三个单元格(索引2)和单元格0和1中还有其他文本(我不知道您的DGV是什么样的)。然后它将已检查行的单元格值放入数据集中 - 从那里您可以将数据集转储到您选择的数据集中(不确定您拥有的数据集)。就未在下次加载时显示行而言,您可以更改单元格4的文本(例如,y / n单元格),然后更新当前数据库。下次加载DGV时,请在通话中加入以显示“&#39; y&#39;在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
答案 2 :(得分:0)
从您对我的评论的回复中,似乎在当前会话期间的限制是足够的。因此,您可以跟踪会话变量。
例如,如果您的行具有整数id,则可以在会话中存储List<int>
,并在每次提交选中的行时将ID添加到列表中。然后在刷新网格时参考会话变量。
答案 3 :(得分: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.
}