Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何从连接到数据库的组合框中删除项目并自动刷新?_Vb.net_Combobox_Visual Studio 2019 - Fatal编程技术网

Vb.net 如何从连接到数据库的组合框中删除项目并自动刷新?

Vb.net 如何从连接到数据库的组合框中删除项目并自动刷新?,vb.net,combobox,visual-studio-2019,Vb.net,Combobox,Visual Studio 2019,我这里有点小麻烦。 我在这里试图做的是删除连接到数据库的组合框中的一个项目,删除后,它会自动刷新组合框的内容 Dim cons As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\athan\Documents\PAGEANT.accdb") Using cons Wit

我这里有点小麻烦。 我在这里试图做的是删除连接到数据库的组合框中的一个项目,删除后,它会自动刷新组合框的内容

        Dim cons As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\athan\Documents\PAGEANT.accdb")

        Using cons


            With cmd
                .Connection = cons
                .CommandText = "DELETE FROM  Judges Where Fullname = @FullName"
                .Parameters.AddWithValue("@FullName", cmbJudges.SelectedItem.ToString)
                .Connection.Open()
                .ExecuteNonQuery()
                .Connection.Close()

                MessageBox.Show("RECORD HAS BEEN DELETED", "DELETE", MessageBoxButtons.OK, MessageBoxIcon.Information)


                txtFullNameJudge.Text = Nothing
                txtContactJudge.Text = Nothing
                txtUserNameJudge.Text = Nothing
                txtPasswordJudge.Text = Nothing
                cmbJudges.Text = ""

            End With
        End Using


它正在删除一条记录,但不会刷新组合框的内容,因此无法删除其他数据。似乎我只能删除一个数据。然后我需要重新运行程序,以便在删除生效之前

第一种方法更多的是代码,但第二种方法可能会带来问题,我认为它更接近@jmcilhinney在评论中提出的方法。我认为
DataAdapte
r需要一个主键作为Select的一部分。如果
FullName
不是judgets表的主键,则此方法可能不起作用

您可能希望将
dt
Datatable
)设置为表单级变量,这样就不必从
.DataSource
属性提取和强制转换它。然后,它将可用于填充组合的方法和删除法官的方法。如果执行此操作,请确保删除局部变量

Private Sub FillJudgesCombo()
    Dim dt As New DataTable
    Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\athan\Documents\PAGEANT.accdb"),
            cmd As New OleDbCommand("Select FullName From Judges")
        cn.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
    cmbJudges.DisplayMember = "FullName"
    cmbJudges.DataSource = dt
End Sub

Private Sub DeleteJudge1()
    'I stored this in a local variable because we are using it more tha once in this method
    Dim NameToDelete = cmbJudges.Text
    'To update the database
    Using cons As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\athan\Documents\PAGEANT.accdb"),
            cmd As New OleDbCommand("DELETE FROM  Judges Where Fullname = @FullName", cons)
        'had to guess at the datatype and field size - check your database
        'The Add method is much preferred to the .AddWithValue
        cmd.Parameters.Add("@FullName", OleDbType.VarChar, 200).Value = NameToDelete
        cons.Open()
        cmd.ExecuteNonQuery()
    End Using
    'To update the combo box by editing DataTable
    Dim dt = DirectCast(ComboBox1.DataSource, DataTable)
    'This line uses and interpolated string indicated by the $ preceding the string.
    'This allows to insearch a variable in place in the string surronded by braces.
    Dim dr = dt.Select($"FullName = {NameToDelete}")
    dr(0).Delete()
    dt.AcceptChanges()
    ResetTextBoxesAndCombo()
    MessageBox.Show("RECORD HAS BEEN DELETED", "DELETE", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub

Private Sub ResetTextBoxesAndCombo()
    'Offloaded this because it really has nothing to do with deleting a judge.
    txtFullNameJudge.Text = Nothing
    txtContactJudge.Text = Nothing
    txtUserNameJudge.Text = Nothing
    txtPasswordJudge.Text = Nothing
    cmbJudges.SelectedIndex = -1
End Sub

Private Sub DeleteJudge2()
    Dim NameToDelete = cmdJudges.Text
    Dim dt = DirectCast(ComboBox1.DataSource, DataTable)
    'The Select method has no idea how many rows are returned
    'so it returns an array of DataRows
    Dim dr = dt.Select($"FullName = {NameToDelete}")
    'We are only interested in the first item in the array.
    'The array should only have one element.
    dr(0).Delete()
    Using con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\athan\Documents\PAGEANT.accdb"),
            da As New OleDbDataAdapter("Select FullName From PAGEANT", con)
        Dim cmdBuild As New OleDbCommandBuilder(da)
        da.Update(dt)
    End Using
    ResetTextBoxesAndCombo()
    MessageBox.Show("RECORD HAS BEEN DELETED", "DELETE", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub

它现在就像我想要的那样工作。每当我通过组合框删除数据时,它都会删除数据,然后使用
FullName
字段中的值重新加载组合框@玛丽和@jmcillhinney感谢所有的帮助

以下是“我的删除”按钮的工作代码:

 Private Sub btnJudgeDelete_Click(sender As Object, e As EventArgs) Handles btnJudgeDelete.Click


        Using cons As New OleDb.OleDbConnection(conSTR)
            Using com As New OleDb.OleDbCommand("DELETE FROM Judges WHERE FullName = @FullName")
                com.Parameters.AddWithValue("@FullName", cmbJudges.Text)
                com.Connection = cons
                cons.Open()
                com.ExecuteNonQuery()

                MessageBox.Show("DATA HAS BEEN DELETED")
            End Using
        End Using


        cmbJudges.Text = ""
        txtFullNameJudge.Text = Nothing
        txtContactJudge.Text = Nothing
        txtUserNameJudge.Text = Nothing
        txtPasswordJudge.Text = Nothing
        cmbJudges.Items.Clear()

        Dim rd As OleDb.OleDbDataReader
        Using cn As New OleDb.OleDbConnection(conSTR),
            cmd As New OleDb.OleDbCommand("Select FullName From Judges", cn)
            cn.Open()
            rd = cmd.ExecuteReader
            While rd.Read
                cmbJudges.Items.Add(rd.Item(0))
            End While
            rd.Close()
        End Using



    End Sub

我在另一个网站上回答了这个问题。最正确的解决办法是彻底抛弃你正在做的事情,让这个问题变得毫无意义。您不应该直接修改数据库,然后期望您的
组合框
自动或手动更新。您应该做的是填充
数据表
并将其绑定到
组合框
,然后首先修改该
数据表
,并将这些更改保存到数据库中。当绑定到它的
数据表
被修改时,
组合框
将自动更新。感谢您提供的信息。但我想做的是通过不使用绑定来实现这一点。我想写代码,这样我就能明白ado.net的重要性以及如何有效地使用它。这是错误的。ADO.NET和数据绑定是不相关的,尽管它们经常一起使用,这是应该的。我告诉过您应该使用数据适配器将数据检索到
DataTable
,并将更改保存回数据库。这是ADO.NET。您很可能会误以为数据绑定意味着向设计器中的表单添加
数据集
。这是一种方法,但肯定不是唯一的方法,也不是我所建议的方法。即使使用完全独立的数据访问层、业务逻辑层和表示层,您仍然应该使用数据绑定。哇,这是非常好的信息。你说的是真的。我认为使用数据绑定就是使用设计器。谢谢你澄清了事情。我只是想澄清一些事情@Mary说使用适配器需要主键?你能把它再扩展一点吗?我上面的删除命令没有主键@Mary是正确的字段
FullName
没有主键,因此无法使用数据适配器?对吗?无论如何,谢谢你最后的评论,它给了我更多的信息。嗨,谢谢你的帮助。但是有没有其他方法可以减少复杂的编码呢<代码>FillJudgesCombo()我试图将其放入表单加载事件中,但它无法检索数据。它显示
未找到任何数据
。我尝试了您的
删除判断1()
,出现了NullReferenceException。上面说圣路易斯什么都不是。它指向这一行
Dim dr=dt.Select($“FullName={NameToDelete}”)
请原谅我的问题,我刚刚开始成为一名开发人员。@lelouch您在
Dim dt=DirectCast(ComboBox1.DataSource,DataTable)中将
ComboBox1
更改为
cmbjudgets
我的错误。我使用带有默认名称的控件来测试代码。控件的正确行应该是
Dim dt=DirectCast(cmbJudges.DataSource,DataTable)
。对不起,是的。我将所有标签更改为我自己的标签,但仍然会发生异常。我真的无法理解你给我的代码,特别是对于direct cast部分,我很抱歉。我尝试使用我的代码进行删除,并从我的表单加载事件中添加我的代码,这样,在我删除后,它会像在表单加载时一样重新加载更新的数据库,但问题是在我删除数据后,它只是复制了组合框中的内容。所以我想这不是正确的做法。我可以知道我先前的答案被删除的原因吗@Martijn Pieters。它被删除了,因为它看起来像是你在问一个后续问题。这篇文章是否能回答你的问题还不够清楚。通常情况下,当人们在回答中向其他用户提问并提出后续问题时,这意味着他们并没有真正发布解决方案,但他们只是想对其他帖子发表评论。我建议从您的答案中删除后续问题,只保留实际解决方案。