【问题标题】:Update gridview according to checkbox根据复选框更新gridview
【发布时间】:2026-01-19 12:10:02
【问题描述】:

我有一个网格视图。它包含针对所有值的复选框。单击复选框并按提交后,所选项目将插入另一个数据库。如果下次加载,我希望那些选定的项目不应该出现在当前的 gridview 上。 为此,我计划的是当前数据库中必须有一个列来指示复选框是否已被选中。该列将相应地填写是/否。然后显示其中只有“No”的行。

但是,这似乎很长。有没有其他方法可以实现这一点。

【问题讨论】:

  • “下次”是什么意思?任何时候?
  • 基本上,点击提交按钮后,页面会重新加载。此时,网格视图必须更新,即选中的项目必须从网格视图中消失

标签: c# asp.net vb.net web-services


【解决方案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*/

【讨论】:

  • 感谢您的回复,但我使用了完全相同的方法,使用了隐藏字段。这与我在我的问题中暗示的相同。我只是需要一些其他的方法。顺便说一句,我已经完成了这个并使用了完全相同的方法,所以我将它标记为答案。
  • 使用类和存储过程可能会帮助您缩短代码。
【解决方案2】:

我不知道您使用的是什么数据库,所以这是有限的,但它会根据复选框获取单元格的值——假设 chkbox 在第三个单元格(索引 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

【讨论】:

    【解决方案3】:

    从您对我的评论的回复来看,当前会话期间的限制似乎就足够了。因此,您可以跟踪会话变量。

    例如,如果您的行有一个整数 id,您可以在会话中存储一个 List&lt;int&gt;,并在每次提交选中的行时将 id 添加到列表中。然后在刷新网格时引用会话变量。

    【讨论】:

      【解决方案4】:

      我不完全确定您的目标是什么,但如果您试图隐藏直接从网格中检查的项目,那是可能的。

      查询: 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.
      }
      

      【讨论】:

        最近更新 更多