Combox省市县三级联动求代码,请教高手.有图

颓废的无房户 2011-09-12 06:06:18
数据库是Access的,名字和结构如下:


三个Combox


网上找了半天,好多都是ASP.net的,虚心求vb.net+Access的标准代码。

...全文
388 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
机器人 2011-09-17
  • 打赏
  • 举报
回复
参考
Imports System.Data.OleDb

Public Class Form1

Private Const ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DB\Database.mdb;Persist Security Info=True"

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
QueryData()
BindData()
End Sub

Private mobjDataSet As DataSet

Private Sub QueryData()
Using objConn As OleDbConnection = New OleDbConnection(ConnectionString)

mobjDataSet = New DataSet("Data")

Dim strSql As String = "select * from user_sheng"
Dim objDbAdapter As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(strSql, objConn)
objDbAdapter.Fill(mobjDataSet, "user_sheng")
Dim emptyRow = mobjDataSet.Tables("user_sheng").NewRow
mobjDataSet.Tables("user_sheng").Rows.InsertAt(emptyRow, 0)

objDbAdapter.SelectCommand.CommandText = "select * from user_shi"
objDbAdapter.Fill(mobjDataSet, "user_shi")

objDbAdapter.SelectCommand.CommandText = "select district_name, district_id, b.city_id as city_id from user_qu a, user_shi b where a.city_id = b.city_id"
objDbAdapter.Fill(mobjDataSet, "user_qu")

mobjDataSet.Relations.Add("省市关系",
mobjDataSet.Tables("user_sheng").Columns("province_id"),
mobjDataSet.Tables("user_shi").Columns("provice_id"))
mobjDataSet.Relations.Add("市区关系",
mobjDataSet.Tables("user_shi").Columns("city_id"),
mobjDataSet.Tables("user_qu").Columns("city_id"))
End Using

End Sub

Private Sub BindData()
If mobjDataSet Is Nothing Then Return
BindingSourceSheng.DataSource = mobjDataSet
BindingSourceSheng.DataMember = "user_sheng"

BindingSourceShi.DataSource = BindingSourceSheng
BindingSourceShi.DataMember = "省市关系"

BindingSourceQu.DataSource = BindingSourceShi
BindingSourceQu.DataMember = "市区关系"

ComboBox1.DataSource = BindingSourceSheng
ComboBox1.DisplayMember = "province_name"
ComboBox1.ValueMember = "province_id"

ComboBox2.DataSource = BindingSourceShi
ComboBox2.DisplayMember = "city_name"
ComboBox2.ValueMember = "city_id"

ComboBox3.DataSource = BindingSourceQu
ComboBox3.DisplayMember = "district_name"
ComboBox3.ValueMember = "district_id"
End Sub

End Class
颓废的无房户 2011-09-17
  • 打赏
  • 举报
回复
补充两点,免得误导大家:

一是最上面这个图片中控件名 CboPovince 更改成 CboProvince 为了跟数据库好对印点,特此说明一下



二是 [澳门特别行政区] 在数据库中 [市]和[区/县] 都是没有数据的.
我当用户选择[澳门特别行政区]后,希望[市]和[区/县]这两个Combox中不显示出任何东西。
颓废的无房户 2011-09-17
  • 打赏
  • 举报
回复
感谢大家帮忙,结贴后也算是写出来了。
先把代码贴出来供有需要的人使用,我是新手,完全自学的,代码不规范和不简洁请见谅


Private Sub frmclient_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim ConnString As String = "provider=microsoft.jet.oledb.4.0;data source=|DataDirectory|\XinqiData.mdb"
Dim SQLString1 As String = "Select * From 列表_省"
Dim oledbconn1 As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection(ConnString) '创建一个oledbconnection对象
Dim DataSet1 As New DataSet() '创建一个dataset对象
Dim OleDbDataAdapter1 As System.Data.OleDb.OleDbDataAdapter = New System.Data.OleDb.OleDbDataAdapter(SQLString1, oledbconn1) '创建一个OleDbDataAdapter对象
oledbconn1.Open() '打开连接
OleDbDataAdapter1.Fill(DataSet1, "列表_省") '通过OleDbDataAdapter对象填充数据集

Dim DataTable1 As New DataTable()
DataTable1 = DataSet1.Tables("列表_省")


Me.CboProvince.DataSource = DataTable1
Me.CboProvince.ValueMember = "provinceID"
Me.CboProvince.DisplayMember = "province"

End Sub



'省下拉列表
Private Sub CboProvince_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles CboProvince.SelectedIndexChanged

If CboProvince.SelectedIndex > -1 Then
Dim ConnString As String = "provider=microsoft.jet.oledb.4.0;data source=|DataDirectory|\XinqiData.mdb"
Dim oledbconn1 As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection(ConnString)
Dim DataSet1 As New DataSet()

Dim drv As DataRowView = CType(Me.CboProvince.SelectedItem, DataRowView)
Dim ID As String = drv.Row("provinceID").ToString()

Dim SQLString1 As String = "select * from 列表_市 where father like '%" & ID & "%'"
Dim OleDbDataAdapter1 As System.Data.OleDb.OleDbDataAdapter = New System.Data.OleDb.OleDbDataAdapter(SQLString1, oledbconn1)
oledbconn1.Open()
OleDbDataAdapter1.Fill(DataSet1, "列表_市")


Dim DataTable1 As New DataTable()
DataTable1 = DataSet1.Tables("列表_市")



CboCity.DataSource = DataTable1
CboCity.DisplayMember = "city"
CboCity.ValueMember = "cityID"
Else
Me.CboCity.Text = ""
Me.CboArea.Text = ""
End If
End Sub




'市下拉列表
Private Sub CboCity_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles CboCity.SelectedIndexChanged

If CboCity.SelectedIndex > -1 Then
Dim ConnString As String = "provider=microsoft.jet.oledb.4.0;data source=|DataDirectory|\XinqiData.mdb"
Dim oledbconn1 As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection(ConnString)
Dim DataSet1 As New DataSet()

Dim drv As DataRowView = CType(Me.CboCity.SelectedItem, DataRowView)
Dim ID As String = drv.Row("cityID").ToString()

Dim SQLString1 As String = "select * from 列表_县 where father like '%" & ID & "%'"
Dim OleDbDataAdapter1 As System.Data.OleDb.OleDbDataAdapter = New System.Data.OleDb.OleDbDataAdapter(SQLString1, oledbconn1)
oledbconn1.Open()
OleDbDataAdapter1.Fill(DataSet1, "列表_县")


Dim DataTable1 As New DataTable()
DataTable1 = DataSet1.Tables("列表_县")

CboArea.DataSource = DataTable1
CboArea.DisplayMember = "area"
CboArea.ValueMember = "areaID"
Else
Me.CboArea.Text = ""
End If
End Sub



但是还是有一点小问题,见下图

这是正常的


但是如果在上面选择完[四川省]后,再到省列表框里选择[澳门特别行政区]就会出现下面的情况。


[市]和[区/县]这两个Combox没有根着联动,百度查了后,加了如下代码发现没用。


CboCity.DataSource = DBNull.Value
CboCity.Items.Clear()
CboCity.DataSource = DBNull.Value
CboArea.Items.Clear()


出错原因是:设置DataSource属性后无法修改项集合

请问高手我这代码该怎么改。
颓废的无房户 2011-09-14
  • 打赏
  • 举报
回复
先把贴结了,再学习。
a67472323 2011-09-14
  • 打赏
  • 举报
回复
求代码,顶上去
颓废的无房户 2011-09-13
  • 打赏
  • 举报
回复
楼上纯爷们,感谢。我去测试一下
zj_zwl 2011-09-13
  • 打赏
  • 举报
回复
带一个简化的MDB文件操作类,代码没有调试,也许有错误
zj_zwl 2011-09-13
  • 打赏
  • 举报
回复
Imports System.Data.OleDb

Public Class Form1

Private Const FindPovince As String = "select povince from 列表_省"
Private Const FindCity As String = "select city from 列表_市 where father={0}"
Private Const FindArea As String = "select area from 列表_县 where father={0}"
Private Const FindPovinceID As String = "select povinceid from 列表_省 where povince='{0}'"
Private Const FindCityID As String = "select cityid from 列表_市 where father={0} and city='{1}'"

Private opdata As OperatData
Private povinceid As Integer
Private cityid As Integer

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
opdata = New OperatData("文件路径", "密码")
opdata.OpenData()
Dim dt As DataTable = opdata.GetDataTable(Findpovince)
For i As Integer = 0 To dt.Rows.Count - 1
cbopovince.Items.Add(dt.Rows(i).Item("povince")) '加载省列表
Next
End Sub

Private Sub cbopovince_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cbopovince.SelectedIndexChanged
cbocity.Items.Clear()
cboarea.Items.Clear()
povinceid = opdata.GetResultScalar(String.Format(FindPovinceID, cbopovince.Text))
Dim dt As DataTable = opdata.GetDataTable(String.Format(FindCity, povinceid))
For i As Integer = 0 To dt.Rows.Count - 1
cbocity.Items.Add(dt.Rows(i).Item("city")) '加载指定省的市列表
Next
End Sub

Private Sub cbocity_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cbocity.SelectedIndexChanged
cboarea.Items.Clear()
cityid = opdata.GetResultScalar(String.Format(FindCityID, povinceid, cbocity.Text))
Dim dt As DataTable = opdata.GetDataTable(String.Format(FindArea, cityid))
For i As Integer = 0 To dt.Rows.Count - 1
cboarea.Items.Add(dt.Rows(i).Item("area")) '加载指定市的县列表
Next
End Sub


Public Class OperatData

Private Const linkstr As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Jet OLEDB:Database Password={1};"
Private olecon As OleDbConnection
Private olecomm As OleDbCommand

Private DataFilePath As String = ""
Private Password As String = ""

Public Sub New(ByVal DataFilePath As String, Optional ByVal Password As String = "")
Me.DataFilePath = DataFilePath
Me.Password = Password
End Sub

''' <summary>
''' 打开指定的数据库文件,成功返回true,否则为false
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Function OpenData() As Boolean
Try
olecon = New OleDbConnection
If olecon.State = ConnectionState.Open Then Return True
Dim str As String = String.Format(linkstr, DataFilePath, Password)
olecon.ConnectionString = str
olecon.Open()
Return True
Catch ex As Exception
Return False
End Try
End Function

''' <summary>
''' 根据命令返回数据表对象
''' </summary>
''' <param name="commandstr">命令文本</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function GetDataTable(ByVal commandstr As String) As DataTable
Try
If olecon.State <> ConnectionState.Open Then olecon.Open()
olecomm = New OleDbCommand(commandstr, olecon)
Dim da As New OleDbDataAdapter(olecomm)
Dim dt As New DataTable("data")
da.Fill(dt)
Return dt
Catch ex As Exception
Return Nothing
End Try
End Function

''' <summary>
''' 执行命令,返回第一行第一列的内容
''' </summary>
''' <param name="commandstr">命令文本</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function GetResultScalar(ByVal commandstr As String) As Object
Try
If olecon.State <> ConnectionState.Open Then olecon.Open()
olecomm = New OleDbCommand(commandstr, olecon)
Return olecomm.ExecuteScalar
Catch ex As Exception
Return Nothing
End Try

End Function

End Class

End Class
机器人 2011-09-13
  • 打赏
  • 举报
回复
做 DataRelation 绑定就简单了。Combobox 也直接用 DataSource 绑定。

http://blog.csdn.net/fangxinggood/article/details/2304047
ylly11111 2011-09-12
  • 打赏
  • 举报
回复
先将省表的数据绑定到省的combox,然后在省的combox的textChange事件中写代码,根据省的combox.text从市表中取出所有的相关的数据,放到数据集中,并绑定到市的combox,再在市的combox的textChange事件中写代码
颓废的无房户 2011-09-12
  • 打赏
  • 举报
回复
哪位高手能抽点点时间帮忙写一下这个教学贴吗,估计很多像我这样的新手都在求。
事实上这种联动关系在程序里经常使用,学到了这个很受用。
会的是小菜,不会的是高山。哎
miller0113 2011-09-12
  • 打赏
  • 举报
回复
sql select语句按father列检索一下不就可以了吗?
snlx200606 2011-09-12
  • 打赏
  • 举报
回复
我也需要,等待!

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧