根据复选框更新网格视图

本文关键字:网格 视图 更新 复选框 | 更新日期: 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.
}