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。它被删除了,因为它看起来像是你在问一个后续问题。这篇文章是否能回答你的问题还不够清楚。通常情况下,当人们在回答中向其他用户提问并提出后续问题时,这意味着他们并没有真正发布解决方案,但他们只是想对其他帖子发表评论。我建议从您的答案中删除后续问题,只保留实际解决方案。