asp.net 下拉列表根据第一个下拉地铁站颜色填充

bqujaahr  于 2022-12-20  发布在  .NET
关注(0)|答案(1)|浏览(141)

我知道如何使用OnSelectedIndexChange和第一个下拉列表上的事件来实现这一点,我正在尝试找出架构上实现这一点的最佳方法,因为在我的案例中,我处理的是地铁站,其中一个特定的车站将具有多种颜色。
例如,第一个下拉列表带有颜色(即红色、绿色、紫色)
第二个包含站点的下拉列表
“第一街-红色和绿色”
“鲜花大道-绿色”
“泰坦空间站-红紫色”
因此,如果用户在第一个下拉菜单上选择红色,则第二个下拉菜单应填充“1st Street”以及Titan Station”。如果用户选择绿色,则应仅显示“Bloom Ave”。
有许多站点具有颜色重叠(不止一种颜色)。
在我看来,正确的方法是创建一个表,表中包含加油站名称和数据类型为BIT的每种颜色的列。如果加油站有多种颜色,这些列将被设置为1或True。我将有一个存储过程,该过程将执行基于颜色的选择,然后显示所有适用的加油站,这些加油站将绑定到第二个下拉列表。
有没有其他方法可以完全实用地做到这一点,仅仅通过下拉列表本身。例如,您在DropDownList控件中编写此逻辑,它知道什么与什么相关联?

0x6upsns

0x6upsns1#

当然,您肯定不希望在项目中开始或引入某种位行方式的处理,因为它相当于解决方案的数据库中的一个相当简单的“类”关系模型。
我的意思是,如果你有一个客户,他们有很多发票,那么我们在这里不介绍一些逐位处理(因为sql server不这样工作)。
因此,如果您有一些客户,那么如果您需要“许多”发票,那么您就创建一个发票表。
如果你有几个站点,它们可以有1到10种不同的颜色,那么你就创建一个名为MyStationColors的表,这是所有数据库操作的工作方式。
实际上,唯一真实的的问题是您要存储颜色(作为文本名称),还是存储颜色的PK ID(来自颜色表)。
我倾向于它是一个客户,一个颜色,或什么?我存储的PK ID,我们可以自由地显示一些不错的用户友好的颜色描述,因为我们请。
因此,我们需要:

Colors - a simple table of all the colors we are going to use
Station - a simple table of all the stations
MyStationColors  - a table that lists out all the colors for a given station.

因此,一旦我们有了以上内容,那么这一切就变成了一个相当简单的SQL和数据库示例。
所以,我们有三张table。这样说:

现在,我还没有介绍颜色表之间的任何关系。毕竟,它实际上只是一个选择列表,或者我们的颜色主列表。但是,如果我们想要的话,我们可以添加一个关系到该表(这将防止我们删除当前由给定站点使用的颜色。但是,让我们保持简单。
因此,我们的第一个组合框将由一个简单的组合框驱动(填充),并向它提供颜色表。
如前所述,我们使用了“id”,但是组合框可以有两列,通常是PK(用于代码隐藏)和第二种颜色,用于向用户显示。
因此,放入一个组合框,如下所示:

<asp:DropDownList ID="DropDownList1"
            runat="server"
            DataValueField="ID"  
            DataTextField="Color" Width="141px"
            AutoPostBack="true" >

        </asp:DropDownList>

(don别忘了上面的自动帖子!!)
注意下拉列表的“两”列(值隐藏,文本显示)。
填充combo的代码如下:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        LoadCombo()
    End If

End Sub

Sub LoadCombo()

    Dim cmdSQL As New SqlCommand("SELECT ID, Color FROM Colors ORDER BY Color")

    DropDownList1.DataSource = MyrstP(cmdSQL)
    DropDownList1.DataBind()
    DropDownList1.Items.Insert(0, (New ListItem("Select Color", "0")))

End Sub

现在我们看到/得到这个:

把盒子放下,我们看到:

因此,现在我们要做的就是连接选定的索引更改事件。
但是,在我们这样做之前,我很懒,让我们使用sql studio,并创建一个视图(查询),将显示车站和他们的颜色。我们使用它来“显示”结果。
所以,在sql server中创建新视图,我们可以通过拖放和GUI来完成(毕竟,谁会手工编写sql,对吗???)
所以,我们有这个:

当我们在上面运行时,我们得到这个:

正如我们所看到的,一些站点有不止一种颜色,所以它们显示不止一次。但是,我们让SSMS中的查询构建器为我们构建上面的SQL-到目前为止,所有的操作都是拖放。
好,保存该视图(Vstations)。
现在,我们需要显示我们选择的结果。因此,让我们放入一个网格视图,如下所示:

<asp:DropDownList ID="DropDownList1"
            runat="server"
            DataValueField="ID"  
            DataTextField="Color" Width="141px" >

        </asp:DropDownList>

        <asp:GridView ID="GridView1" runat="server">

        </asp:GridView>

现在,在下拉列表的属性页中,我们添加选定的索引事件(双击此处:)

现在选择组合的代码如下:

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

    Dim strSQL As String =
        "SELECT * FROM StationsV WHERE COLOR_ID = @COLOR"
    Dim cmdSQL = New SqlCommand(strSQL)
    cmdSQL.Parameters.Add("@COLOR", SqlDbType.Int).Value = DropDownList1.SelectedItem.Value

    GridView1.DataSource = MyrstP(cmdSQL)
    GridView1.DataBind()

End Sub

因此,现在当我们选择一种颜色时,所有具有给定颜色的电台将显示如下:

现在,我们当然应该清理网格,删除“ID”,并从网格中删除color_id,但这只是螺母和螺栓。
当然还有一个额外的好处就是显示上面给定电台的所有颜色。我们可以做到。但是,正如你所看到的,解决这些问题的最佳方法是使用正确的数据模型来反映具有许多颜色的台站的真实的情况。因此,我们不会弄乱或引入某种复杂的逐位处理。我们肯定必须引入一个额外的表(跟踪给定站的颜色),但其他然后这一点额外的工作,一旦完成,然后我们可以自由地添加1或5种颜色到一个站,我们不必改变设计,甚至说假设或添加一些位颜色为给定的颜色。
无论是客户和发票,还是带有一些颜色的站点-关系数据模型方法往往会使此类问题变得相当容易。
最后但并非最不重要的是,我确实厌倦了一遍又一遍地键入连接和加载数据表,所以我还使用并拥有了这个方便的例程MyRstP来返回数据表。

Public Function MyrstP(sqlCmd As SqlCommand) As DataTable

    Dim rstData As New DataTable

    Using sqlCmd
        sqlCmd.Connection = New SqlConnection(My.Settings.TEST5)
        sqlCmd.Connection.Open()
        rstData.Load(sqlCmd.ExecuteReader)
    End Using

    Return rstData

End Function

相关问题