首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用<select><option>更新SQLDataSource?

如何使用<select><option>更新SQLDataSource?
EN

Stack Overflow用户
提问于 2021-11-16 14:14:11
回答 1查看 57关注 0票数 0

我有一个ASP.NET超文本标记语言网站,我想使用下拉菜单更新我的SQLDataSource SELECT命令。用户可以选择按日期、持续时间或玩家进行排序,GridView将更新,显示我的mdf数据库中新的排序结果。我真的不确定如何处理这个问题,因为我对ASP.NET还很陌生,我只需要一些关于如何处理它以及使用什么方法的指导。我可以谷歌教程,问题是知道谷歌什么。非常感谢任何建议:)我的代码:

代码语言:javascript
复制
    <form id="form1" runat="server">
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="RunsData">
            <Columns>
                <asp:BoundField DataField="PlayerId" HeaderText="PlayerId" SortExpression="PlayerId" />
                <asp:BoundField DataField="Duration" HeaderText="Duration" SortExpression="Duration" />
                <asp:BoundField DataField="VersionId" HeaderText="VersionId" SortExpression="VersionId" />
                <asp:BoundField DataField="DateUploaded" HeaderText="DateUploaded" SortExpression="DateUploaded" />
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="RunsData" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT [PlayerId], [Duration], [VersionId], [DateUploaded] FROM [Run] ORDER BY [Duration]"></asp:SqlDataSource>
    </form>
    <div>
        <label class="label" for="version">Version: </label>
        <select name="version" id="version">
            <option value="lev1">Level 1</option>
            <option value="lev1to3">Level 1-3</option>
            <option value="lev8">Level 8</option>
            <option value="lev17">Level 17</option>
        </select>
        <label class="label" for="sortby">Sort By: </label>
        <select name="sortby" id="sortby">
            <option value="duration">Duration</option>
            <option value="date">Date</option>
            <option value="player">Player</option>
        </select>
    </div>
</div>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-16 20:52:31

好的,首先,我认为滤镜最好放在网格的顶部(上面),而不是下面?(只是一个想法)。

事实上,更好的想法是将两个组合框直接放到网格标题中-更好!

但是,让我们一步一步来。

首先,我建议我们转储(删除)网页中的数据源。这可能很方便,向导会生成它们-非常感谢-一切都很好。然而,即使我经常使用向导来创建GV,我也会清除数据源,并使用代码。什么时候使用代码填充GV是个好主意?

当然,当你想过滤它的时候!

所以,让我们这样做:

删除/移除Sqldata源-我们不打算使用它。

将其从GV - DataSourceID="RunsData“中删除

另外,您清除了使用向导来创建和设置GV,但现在使用select html?为什么不使用DropDown列表?向导不仅可以为您构建它们(就像GV一样,它们还具有丰富的.net事件模型。你可以像GV一样推动和驱动下拉列表(它们是数据源友好的)。

所以,我们现在假设这个标记:

代码语言:javascript
复制
    <div style="float:left">
    <label class="label" for="version">Version: </label>
        <asp:DropDownList ID="cboVersion" runat="server" Width="150px">
            <asp:ListItem></asp:ListItem>
            <asp:ListItem Value="1">Level 1</asp:ListItem>
            <asp:ListItem Value="1-3">Level  1-3</asp:ListItem>
            <asp:ListItem Value="8">Level 8</asp:ListItem>
            <asp:ListItem Value="17">Level 17</asp:ListItem>
        </asp:DropDownList>
    </div>

    <div style="float:left;padding-left:25px">

        <label class="label" for="sortby">Sort By:</label>
        <asp:DropDownList ID="cboSortBy" runat="server" Width="150px">
            <asp:ListItem></asp:ListItem>
            <asp:ListItem Value="duration">Duration</asp:ListItem>
            <asp:ListItem Value="DateUploaded">Date</asp:ListItem>
            <asp:ListItem>Player</asp:ListItem>
        </asp:DropDownList>

    </div>
    <div style="clear:both;height:10px"></div>  <%-- Start new line for grid --%>

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="RunsData">
        <Columns>
            <asp:BoundField DataField="PlayerId"     HeaderText="PlayerId"  />
            <asp:BoundField DataField="Duration"     HeaderText="Duration"  />
            <asp:BoundField DataField="VersionId"    HeaderText="VersionId"  />
            <asp:BoundField DataField="DateUploaded" HeaderText="DateUploaded" />
        </Columns>
    </asp:GridView>
</form>

因此,请注意,就像GV一样,将下拉列表作为编辑项选项,如下所示:

然后你就会得到这个:

另外,当你想要level 1-3时,该列是number类型吗?

如上所述,我将过滤器放在网格的顶部。因为你把文件放在网格下面了?你必须解释这个目标--大约20年来没有在网格底部看到过过滤器--也许是一些桌面应用程序?但超级稀有。既然这个选择是超级稀有的?那么你可能有一个很好的理由,但我把过滤器放在了顶部。事实上,我们会/可以考虑将下拉框放在GV的标题中(这是允许的!)。但是,嘿,一步一步来。

我也不明白,看到页面上需要两个表单了吗?(再说一次,这可能是一个原因,但你最好有一个好的和很好的选择的理由)。

所以,我们现在有了这个:

代码语言:javascript
复制
    <div style="float:left">
    <label class="label" for="version">Version: </label>
        <asp:DropDownList ID="cboVersion" runat="server" Width="150px" AutoPostBack="true"> 
            <asp:ListItem></asp:ListItem>
            <asp:ListItem Value="1">Level 1</asp:ListItem>
            <asp:ListItem Value="1,3">Level  1-3</asp:ListItem>
            <asp:ListItem Value="8">Level 8</asp:ListItem>
            <asp:ListItem Value="17">Level 17</asp:ListItem>
        </asp:DropDownList>
    </div>

    <div style="float:left;padding-left:25px">

        <label class="label" for="sortby">Sort By:</label>
        <asp:DropDownList ID="cboSortBy" runat="server" Width="150px" AutoPostBack="true" >
            <asp:ListItem></asp:ListItem>
            <asp:ListItem Value="duration">Duration</asp:ListItem>
            <asp:ListItem Value="DateUploaded">Date</asp:ListItem>
            <asp:ListItem>Player</asp:ListItem>
        </asp:DropDownList>

    </div>
    <div style="clear:both;height:10px"></div>  <%-- Start new line for grid --%>

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
        Width="30%" CssClass="table">
        <Columns>
            <asp:BoundField DataField="PlayerId"     HeaderText="PlayerId"  />
            <asp:BoundField DataField="Duration"     HeaderText="Duration"  />
            <asp:BoundField DataField="VersionId"    HeaderText="VersionId"  />
            <asp:BoundField DataField="DateUploaded" HeaderText="DateUploaded" />
        </Columns>
    </asp:GridView>

请注意,我们为这两个组合框添加了/allow/有一个空白选项。

好的,现在我们加载网格的代码如下:

代码语言:javascript
复制
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        loadgrid()
    End If

End Sub
Sub loadgrid()

    Using conn As New SqlConnection(My.Settings.TEST4)
        Using cmdSQL As New SqlCommand("SELECT PlayerId, Duration, VersionId, DateUploaded FROM [Run]", conn)

            ' add filter
            Dim strWhere As String = ""
            If cboVersion.Text <> "" Then

                If InStr(cboVersion.SelectedItem.Value, "-") = 0 Then
                    ' one value
                    cmdSQL.CommandText &= " WHERE VersionID = @id"
                    cmdSQL.Parameters.Add("@id", SqlDbType.Int).Value = cboVersion.SelectedItem.Value
                Else
                    ' we have  range
                    Dim MyRnage() As String = Split(cboVersion.SelectedItem.Value, "-")
                    cmdSQL.CommandText &= " WHERE VersionID is between @lower and @upper"
                    cmdSQL.Parameters.Add("@lower", SqlDbType.Int).Value = MyRnage(0)
                    cmdSQL.Parameters.Add("@upper", SqlDbType.Int).Value = MyRnage(1)
                End If

            End If


            ' add order by
            If cboSortBy.Text = "" Then
                cmdSQL.CommandText &= " ORDER BY Duration"
            Else
                cmdSQL.CommandText &= " ORDER BY " & cboSortBy.SelectedItem.Value
            End If

            Dim rstData As New DataTable
            conn.Open
            rstData.Load(cmdSQL.ExecuteReader)
            GridView1.DataSource = rstData
            GridView1.DataBind()

        End Using
    End Using

End Sub

由于我们有自动回发,那么对于sort by combo和filter by,我们在这里有两个事件存根。

代码语言:javascript
复制
Protected Sub cboVersion_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboVersion.SelectedIndexChanged
    loadgrid()
End Sub

Protected Sub cboSortBy_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboSortBy.SelectedIndexChanged
    loadgrid()
End Sub

编辑:

接下来的问题是TEST4从哪里来?当然,这是我自己的设置。

在VS菜单中,项目->“我的项目”->settings。

在这里,我们转到设置,然后执行以下操作:

所以在上面点击...然后您将获得连接字符串构建器。

我的意思是,你可以手动编辑网页配置,但那是一种人类的折磨,使用上面的设置是非常容易的。因此,对于应用程序设置,您可以使用上面的设置来为您的应用程序创建设置。说出公司名称,或者连接字符串,或者其他任何东西。这些设置将放在web.config中。因此,您不仅限于连接字符串,而是所有类型的常量设置,如公司名称,可能公司地址等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69990717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档