【问题标题】:Filtered drop down list SQL Server & VB.NET [closed]过滤的下拉列表 SQL Server 和 VB.NET [关闭]
【发布时间】:2018-05-10 12:00:18
【问题描述】:

我不是程序员,只是想为自己制作一个小应用程序的爱好者。

我的查询是我有两个下拉列表(vb.net 表单),一个是“builder”,下一个是“projects”(均通过 MSSQL 中的“BuilderID”链接),我想过滤“Projects”列出链接到所选“Builder”的那些

我的“builder”下拉列表很好,我在想第二个“project List”的存储过程,基于选择的builder查询项目表的某种方式。

我正在尝试编辑这个问题,但不确定要添加什么,因为玛丽回答得很好,她一定明白我在问什么。

【问题讨论】:

  • 您好 Dare,您能描述/显示所涉及的表格吗?我认为你有两张表,一张是建设者,另一张是项目和一个 BuilderID / 类似的链接列?
  • 是的,嗨,所以它的三个表(只是用它来记录我在工作中所做的所有图纸的文档 ID 没什么特别的)所以一个构建器表,构建器 ID 链接到项目表,然后项目链接到图纸通过项目 ID。我在 excel 中这样做,但我认为 id 给 sql 和 vb 另一个去哈哈

标签: sql-server vb.net stored-procedures drop-down-menu filter


【解决方案1】:

我不确定你是如何填写你的第一个列表的,所以我从头开始。重要的是将 ValueMember 设置为 ID。然后使用 SelectedIndexChanged 事件,您可以获得下一个查询的构建器 ID。同样的理论也适用于填充网格。好可爱的宝贝!

Imports System.Data.SqlClient
Public Class DWGBrowse

    Public Property FinishedLoading As Boolean = False

    Private Sub DWGBrowse_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        FillBuildersList()
        FinishedLoading = True
    End Sub

    Private Sub FillBuildersList()
        Dim strSQL = "Select * From Builders;"
        Dim dt As New DataTable
        Using cn As New SqlConnection(My.Settings.BuildersConnection)
            Using cmd As New SqlCommand(strSQL, cn)
                Try
                    cn.Open()
                    Using dr As SqlDataReader = cmd.ExecuteReader
                        dt.Load(dr)
                    End Using
                Catch ex As Exception
                    MessageBox.Show(ex.Message)
                Finally
                    cn.Close()
                End Try
            End Using
        End Using
        BuilderBox.DataSource = dt
        BuilderBox.DisplayMember = "BuilderName" 'Whatever your column is called
        BuilderBox.ValueMember = "BuilderId" 'the name of your ID column
        BuilderBox.SelectedIndex = -1
    End Sub

    Private Sub BuilderBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles BuilderBox.SelectedIndexChanged
        If Not FinishedLoading Then Exit Sub
        Try
            Using sqlConnection As New System.Data.SqlClient.SqlConnection(My.Settings.BuildersConnection)
                Dim id As Integer = CInt(BuilderBox.SelectedValue)
                Dim dt As New DataTable
                Dim sqlString As String = "Select * From Projects Where BuilderID = @ID"
                Using cmd As New System.Data.SqlClient.SqlCommand(sqlString, sqlConnection)
                    cmd.Parameters.Add("@ID", SqlDbType.Int).Value = id
                    ProjectBox.DataSource = Nothing
                    sqlConnection.Open()
                    Using dr As System.Data.SqlClient.SqlDataReader = cmd.ExecuteReader
                        dt.Load(dr)
                        ProjectBox.DisplayMember = "ProjectName"
                        ProjectBox.ValueMember = "ProjectID"
                        ProjectBox.DataSource = dt
                    End Using
                End Using
            End Using
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Private Sub ProjectBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ProjectBox.SelectedIndexChanged
        Dim id As Integer = CInt(ProjectBox.SelectedValue)
        Dim dt As New DataTable
        Dim strSQL As String = "Select * From Drawings Where ProjectID = @ID"
        Using cn As New SqlConnection(My.Settings.BuildersConnection)
            Using cmd As New SqlCommand(strSQL, cn)
                cmd.Parameters.Add("@ID", SqlDbType.Int).Value = CInt(ProjectBox.SelectedValue)
                cn.Open()
                Using dr As SqlDataReader = cmd.ExecuteReader
                    dt.Load(dr)
                End Using
            End Using
        End Using
        DataGridView1.DataSource = dt
    End Sub

End Class

【讨论】:

  • aahh 好的,所以 selectindexchange 是我想不到的。我真的很感激你给了我什么。我将剖析并放入我的程序中,看看我是怎么做的。这是一个忙碌的周末,如果我不立即回复,请原谅我。真的,虽然谢谢你这么详细。 -达伦
  • 很高兴为您提供帮助。当您想在设计视图中查看控件的所有事件时,请选择该控件。然后在属性窗口中,单击闪电,您将看到一个事件列表。双击任何事件,它将在代码窗口中为该事件生成存根。
  • 嗯,我正在慢慢地但肯定地得到一些地方。我需要回去清理一些东西,但到目前为止它正在做我想要的。关于这部分的一个问题 Catch ex As Exception MessageBox.Show(ex.Message) 每次我在运行时关闭窗口/表单时,我都会收到一条关于@ID 没有值以及选择语句的消息(如果我记得正确的话)。当我回到家时,屏幕截图。
  • 我想我知道问题出在哪里。在 Form.Load 期间,Builders 组合索引可能会随着组合的填充而改变。它应设置为 -1(未选择任何内容)。如果您从 Form.Load 调用 FillBuildersList(),则将类级别(表单级别)布尔变量设置为 false。调用填充 Builders 组合后重置为 true 并检查 Selected Index 中 bool 的值已更改,False - Exit sub,True 继续。
  • 玛丽,我想我有点明白你在说什么,但我想我对如何实现它感到困惑。即使我在构建器中选择其他值并更新项目列表,也只是为了澄清;当我关闭时,我仍然会收到味精。这仍然是您认为的问题吗?我将什么设置为-1,或者将类级别的布尔变量设置为false?这部分我不确定。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
相关资源
最近更新 更多