根据复选框更新gridview

时间:2014-08-14 19:45:59

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

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

然而,这似乎很漫长。有没有其他办法来实现这一目标。

4 个答案:

答案 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.
}