级联下拉列表ASP.NET应用程序

问题描述

这是我的新手,但我正在尝试为我的公司创建数据库的Web应用程序,以简化我们的某些IT流程。我当前正在为新用户创建一个过程,该过程涉及输入员工用户名,名字,姓氏,部门和工作角色,然后单击添加用户按钮以将其添加数据库。使用以下代码,一切正常:

   Dim con As New System.Data.sqlClient.sqlConnection
    Dim cmd As New System.Data.sqlClient.sqlCommand


    con.ConnectionString = "Data Source=ID1350\sqlEXPRESS;Initial Catalog=IT Database;Integrated Security=True"

    cmd = New Data.sqlClient.sqlCommand("Insert Into Emp values ('" & TextBox1.Text & "','" & TextBox2.Text & "','" & TextBox3.Text & "','" & DropDownList1.Text & "','" & DropDownList2.Text & "')",con)

    If (TextBox1.Text = "" Or TextBox2.Text = "" Or TextBox3.Text = "") Then

        MsgBox("Please fill the fields")

    Else
        con.open()
        cmd.ExecuteNonQuery()
        con.Close()
        MsgBox("Successfully Added",MsgBoxStyle.information,"Success")
    End If

但是,现在,我希望工作角色下拉列表取决于上一个下拉列表中选择的部门。这样,我们就不必经历所有不同的工作角色。最简单的方法是什么?我曾尝试研究,但仍在努力。

谢谢!

解决方法

首先,强制性警告:

每当您接受用户输入时,您就不想对SQL使用内联字符串连接-这很危险,并且易于注入SQL。不要这样做。

好,接下来是层叠的组合框。

我们假设在页面加载时,您就可以加载第一个组合框。

DropDownList1.DataSource = Myrst("SELECT Department from tblDepartments ORDER BY DepartMent")
DropDownList1.DataBind()
DropDownList1.Items.Insert(0,New ListItem(""))

上面的注释:我还添加了一个空白行–这是可选的,但这将意味着组合框开始时是空白的。 (因此,是否需要则取决于您)

下一步: 您的两个下拉菜单(组合框)应以“通用”方式设置,第一列是PK ID,第二列是精美文字的显示。应该是用于良好的关系数据设置。

但是,您只使用文本值–放手吧。

因此将第一个组合框设置为自动回发= true(请不要忘记!!!)

在下拉式1索引更改事件中,我们具有以下要层叠的代码:

Protected Sub DropDownList1_SelectedIndexChanged(sender As Object,e As EventArgs) Handles DropDownList1.SelectedIndexChanged

   Dim cmdSQL As New SqlCommand("SELECT JobRole FROM tblJobRoles 
                             WHERE Department = @Department ORDER BY JobRole")

   cmdSQL.Parameters.Add("@Department",SqlDbType.NVarChar).Value = DropDownList1.Text

   DropDownList2.DataSource = MyrstP(cmdSQL) 
   DropDownList2.DataBind()
   DropDownList2.Items.Insert(0,New ListItem(""))

End Sub

再次,我有一个可选的选项,可以在组合中添加一个空白行–如果需要,这是您的选择。

并且在此期间,让我们用参数重新编写第一个示例,因为这只是一种很好的编码实践,而更好的是,我们可以进行数据输入,而我不必弄清楚:

For numbers – no quotes
For strings – surrounded with quotes
For dates – surround with quotes.

因此,使用参数可以获取上述所有规则的RID!

那么,“,”和“’”以及其他所有内容都那么长吗?很难阅读,很难维护,而且很容易出错。一个“”或“或”不正确,那么该代码将耗费大量时间。

此代码是几行额外的代码吗?

好吧,我输入第一个参数(添加),然后按ctrl-d 4次。那复制了代码,现在我只是向上/向下光标并将1更改为2,然后依此类推。因此,实际上,您要做的不是更多-实际上更少。结果更具可读性,但更重要的是FAR更易于编辑和维护。

所以,您会得到这样的东西:

Using cmd As New SqlCommand("Insert Into Emp values (@TB1,@TB2,@TB3,@Drop1,@Drop2")

    cmd.Parameters.Add("@TB1",SqlDbType.NVarChar).Value = TextBox1.Value
    cmd.Parameters.Add("@TB2",SqlDbType.NVarChar).Value = TextBox2.Value
    cmd.Parameters.Add("@TB3",SqlDbType.NVarChar).Value = TextBox3.Value
    cmd.Parameters.Add("@Drop1",SqlDbType.NVarChar).Value = DropDownList1.Text
    cmd.Parameters.Add("@Drop2",SqlDbType.NVarChar).Value = DropDownList2.Text

    cmd.Connection = New SqlConnection(GetConstr)
    cmd.Connection.Open()
    cmd.ExecuteNonQuery()

End Using

如果您需要/需要使用C#中的上述代码,请通过代码转换器运行上述代码。

拯救世界贫困。

因为在典型的应用程序中,您将要填充网格,组合框,并一遍又一遍地这样做?

然后构建一个2小助手例程。这将实现两个非常重要的目标:

首先,您不必一遍又一遍地编写相同的代码,从而节省了世界贫困。

下一步,这是最重要的:

您的连接字符串不是通用代码,并且只有一个位置。这样,您可以将整个应用程序指向一个不同的数据库,这在发布或从测试服务器更改为生产服务器时将是一个巨大的问题。

因此,该例程不仅节省了许多键入操作,而且更重要的是,您必须在整个应用程序中将连接字符串代码移至一个位置。不要到处都散布连接字符串-将来您会为之感到遗憾。

因此,您的更新代码现在变为:

我有3个辅助例程–我将它们放在所有应用程序中。

它们是:

Public Function Myrst(strSQL As String,Optional strCon As String = "") As DataTable

    If strCon = "" Then
        strCon = GetConstr()
    End If

    Dim rstData As New DataTable
    Using cmdSQL As New SqlCommand(strSQL,New SqlConnection(strCon))
        Try
            cmdSQL.Connection.Open()
            rstData.Load(cmdSQL.ExecuteReader)
        Catch
            rstData = Nothing
        End Try
    End Using

    Return rstData

End Function


Public Function MyrstP(cmdSQL As SqlCommand,Optional strCon As String = "") As DataTable

    If strCon = "" Then
        strCon = GetConstr()
    End If

    Dim rstData As New DataTable

    Using cmdSQL
        Try
            cmdSQL.Connection = New SqlConnection(strCon)
            cmdSQL.Connection.Open()
            rstData.Load(cmdSQL.ExecuteReader)
        Catch
            Debug.Print(Err.Description)
            rstData = Nothing
        End Try
    End Using

    Return rstData

End Function

Public Function GetConstr(Optional strPortal As String = "") As String

    Return ConfigurationManager.ConnectionStrings("Test3").ConnectionString

End Function

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...