【问题标题】:Removing a row from a datatable从数据表中删除一行
【发布时间】:2015-10-13 18:33:59
【问题描述】:

我有一个程序向用户询问一系列问题,这些问题从数据库中收集并存储在数据表中。

我有一个系统,它选择两个随机数,一个用于确定哪个问题,一个用于确定答案的显示顺序。我希望问题保留在数据表中,直到用户正确为止,之后该问题就不能再出现了。

我的数据表叫DT,有一行代码:

DT.Rows.RemoveAt(QNumber)

听起来应该删除选定的行。但是我对此有疑问。

例如,如果 QNumber 为 2,则删除第 2 行。然后这会将所有内容从第 3 行移到第 2 行,然后将所有内容从第 4 行移到第 3 行,依此类推,还是只会使第 2 行空白,从而破坏我的代码?

【问题讨论】:

  • Would this then move everything... 是的。删除 7 个中的 2 个后,现在有 6 个,但索引 2 处有所不同
  • @Plutonix 请提供答案作为答案,而不是评论(否则其他人可能会接受它,将其放入答案中,然后他们会得到代表)。
  • 天哪。那太可怕了
  • @Plutonix 你提供了他们问题的答案,如果它很短也没关系 - 如果你必须提供图表(否则我会为了其他人的利益而采纳你的答案谁找到了这个问题)。
  • @bob 根据我对 SO 的一点经验,这个网站是为了在复杂的事情上帮助别人,而不是主要是为了获得代表。

标签: vb.net datatable


【解决方案1】:

由于您没有发布任何上下文,因此是一些测试 sn-ps:

Button1_Click 加载表格

Button2_Click “处理”每一行并可选择删除该行。

在你的情况下,“过程”意味着:显示问题并循环,直到你得到答案。

在您的情况下,Button2 代码将确定要加载的记录,可能在返回要询问的“问题”的数据表上使用 .Select(),并最终删除。

Dim da As SqlDataAdapter
Dim ds As DataSet
Dim dt As DataTable
Dim con As New System.Data.SqlClient.SqlConnection()

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Try
        Using con As New System.Data.SqlClient.SqlConnection()
            con.ConnectionString = "Data Source=APCD03;Initial Catalog=OIStest;Integrated Security=True"
            Dim rdr As Data.SqlClient.SqlDataReader
            con.Open()
            Dim cmd As New SqlCommand("SELECT  [DBLinked] as PK ,[TEBackupDate] FROM [OISTest].[dbo].[_DBLink]", con)
            rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
            dt = New DataTable
            dt.Load(rdr)
            rdr.Close()
        End Using
    Catch ex As Exception
        MsgBox(ex, ex.Message)
    End Try
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    For Each row As DataRow In dt.Rows
        If Not row.RowState = DataRowState.Deleted Then
            If MsgBox("Delete this row, PK: " & row("PK"), vbYesNo) = MsgBoxResult.Yes Then
                row.Delete()
            End If
        End If
    Next
End Sub

Button3 演示选择要处理和删除的特定行:

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    Dim rows() As DataRow = dt.Select("PK='test row'")
    If rows.Length = 0 Then
        MsgBox("row was deleted already")
    Else
        MsgBox(rows(0)(0)) ' display PK
        If MsgBox("Delete " & rows(0)(0), vbYesNo) = MsgBoxResult.Yes Then
            rows(0).Delete()
        End If
    End If
End Sub

请注意,rows(0) 是选择结果的第一条记录,而不是整个表中的记录索引。

【讨论】:

  • 除非我将其编辑到帖子的末尾,或者将其放到 pastebin 中,否则我将无法以一种简单的方式向您展示我的代码。如果你愿意,我可以做任何一个。我只是询问具体功能,所以我觉得不需要示例。不过,感谢您的冗长回复,读起来很有趣,因为这与我的做法完全不同。即使你如何用 dt.load 填充数据表,我也不是这样做的。也许我应该向您展示我的代码,您可以告诉我如何/是否可以改进它?
  • 我填充 DT 的代码通常包含在返回数据表的 Function() 中 - 我只是传入 SQL。这样就很容易得到一张桌子。对于标量、数据视图和其他常见的 ADO.Net 任务,我有类似的函数。这与绑定控件完全不同。我只是碰巧有一些空闲时间来回复冗长的回复——并不是真的在寻找代码审查任务。如果您有问题,请随时发布代码。
  • 我通常把 - DT = RunSQL(SQL) 与 RunSQL 是一个返回数据库的函数,然后 SQL 是一个字符串。我特别好奇的一行代码在最后一个 sn-p 中。什么是“vbYesNo”?听起来它提供了一个带有是或否选项的消息框,而不仅仅是一个确定按钮?这听起来像是我需要确认删除代码中其他地方的东西
  • 第二个参数决定了哪些按钮出现,哪些是默认的,以及显示的图标。我作弊并使用了在某些情况下有效的简短常量。正确的语法应该是这样的:IF MsgBox("row was deleted already", MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2 + MsgBoxStyle.Exclamation ) THEN 这将显示两个按钮,默认为 No 和一个感叹号图标。
  • 仅供参考 MsgBox() 位于 WinForms(和 VBA)的 Visual.Basic 命名空间中。其他环境使用其他对象。 MessageBox 可在更多平台上使用,但从一个平台到另一个平台不一致。 MsgBox 是最简单的,MessageBox() 支持更多的东西——比如帮助文件。您可以根据需要混合搭配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多