我有一个ASP.NET超文本标记语言网站,我想使用下拉菜单更新我的SQLDataSource SELECT命令。用户可以选择按日期、持续时间或玩家进行排序,GridView将更新,显示我的mdf数据库中新的排序结果。我真的不确定如何处理这个问题,因为我对ASP.NET还很陌生,我只需要一些关于如何处理它以及使用什么方法的指导。我可以谷歌教程,问题是知道谷歌什么。非常感谢任何建议:)我的代码:
<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>发布于 2021-11-16 20:52:31
好的,首先,我认为滤镜最好放在网格的顶部(上面),而不是下面?(只是一个想法)。
事实上,更好的想法是将两个组合框直接放到网格标题中-更好!
但是,让我们一步一步来。
首先,我建议我们转储(删除)网页中的数据源。这可能很方便,向导会生成它们-非常感谢-一切都很好。然而,即使我经常使用向导来创建GV,我也会清除数据源,并使用代码。什么时候使用代码填充GV是个好主意?
当然,当你想过滤它的时候!
所以,让我们这样做:
删除/移除Sqldata源-我们不打算使用它。
将其从GV - DataSourceID="RunsData“中删除
另外,您清除了使用向导来创建和设置GV,但现在使用select html?为什么不使用DropDown列表?向导不仅可以为您构建它们(就像GV一样,它们还具有丰富的.net事件模型。你可以像GV一样推动和驱动下拉列表(它们是数据源友好的)。
所以,我们现在假设这个标记:
<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的标题中(这是允许的!)。但是,嘿,一步一步来。
我也不明白,看到页面上需要两个表单了吗?(再说一次,这可能是一个原因,但你最好有一个好的和很好的选择的理由)。
所以,我们现在有了这个:
<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/有一个空白选项。
好的,现在我们加载网格的代码如下:
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,我们在这里有两个事件存根。
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中。因此,您不仅限于连接字符串,而是所有类型的常量设置,如公司名称,可能公司地址等。
https://stackoverflow.com/questions/69990717
复制相似问题