繁体   English   中英

DropDownList作为SqlDataSource的筛选器

[英]DropDownList as Filter for SqlDataSource

我正在尝试向我的gridview添加搜索功能。 我已经成功添加两个文本框,并正在按预期运行所有的事情,但是当我尝试添加一个下拉列表它在某种程度上不工作,我不明白为什么。 这是我的代码:

<form id="form1" runat="server">
    <div>
    </div>
    <div>
        <asp:Label ID="LabelSearchTitle" runat="server" Text="Search Title"></asp:Label>
        <asp:TextBox ID="TextBoxSearchTitle" MaxLength="50" runat="server" Width="16%"></asp:TextBox>
        <asp:Label ID="LabelSearchArtist" runat="server" Text="Search Artist"></asp:Label>
        <asp:TextBox ID="TextBoxSearchArtist" MaxLength="50" runat="server" Width="16%"></asp:TextBox>
        <asp:DropDownList ID="DDLSearch" runat="server" Width="16%">
            <asp:ListItem Selected="True" Value="0">select Genre</asp:ListItem>
            <asp:ListItem Value="1">Pop</asp:ListItem>
            <asp:ListItem Value="2">Rock</asp:ListItem>
            <asp:ListItem Value="3">Dance</asp:ListItem>
            <asp:ListItem Value="4">Latin</asp:ListItem>
        </asp:DropDownList>
        <asp:Button ID="ButtonSearch" runat="server" Text="Search" Width="18%" OnClick="ButtonSearch_Click" />
    </div>
    <asp:GridView Width="80%" ID="myGridView" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" AutoGenerateDeleteButton="True" AutoGenerateEditButton="True" CellPadding="4" DataKeyNames="ID" DataSourceID="SqlDataSource1" ForeColor="#333333" GridLines="None" ShowFooter="True" OnRowDeleting="grv_Delete" OnRowUpdating="grv_Update">
        <AlternatingRowStyle BackColor="White" />
        <Columns>
            <asp:TemplateField HeaderText="ID" InsertVisible="False" SortExpression="ID">
                <EditItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Eval("ID") %>'></asp:Label>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("ID") %>'></asp:Label>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:LinkButton ValidationGroup="Insert" ID="linkButtonInsert" OnClick="linkButtonInsert_Click" runat="server">Insert</asp:LinkButton>
                </FooterTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Title" SortExpression="Title">
                <EditItemTemplate>
                    <asp:TextBox ID="textBoxEditTitle" MaxLength="50" runat="server" Text='<%# Bind("Title") %>'></asp:TextBox>
                    <asp:RequiredFieldValidator ID="rfvEditTitle" runat="server" ErrorMessage="Title is required"
                        Text="*" ForeColor="Red" ControlToValidate="textBoxEditTitle"></asp:RequiredFieldValidator>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label2" runat="server" Text='<%# Bind("Title") %>'></asp:Label>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:TextBox ID="textBoxInsertTitle" MaxLength="50" runat="server"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="rfvInsertTitle" runat="server" ErrorMessage="Title is required"
                        Text="*" ForeColor="Red" ValidationGroup="Insert" ControlToValidate="textBoxInsertTitle"></asp:RequiredFieldValidator>
                </FooterTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Artist" SortExpression="Artist">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBoxEditArtist" MaxLength="50" runat="server" Text='<%# Bind("Artist") %>'></asp:TextBox>
                    <asp:RequiredFieldValidator ID="rfvEditArtist" runat="server" ErrorMessage="Artist is required"
                        Text="*" ForeColor="Red" ControlToValidate="TextBoxEditArtist"></asp:RequiredFieldValidator>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label3" runat="server" Text='<%# Bind("Artist") %>'></asp:Label>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:TextBox ID="textBoxInsertArtist" MaxLength="50" runat="server"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="rfvInsertArtist" runat="server" ErrorMessage="Artist is required"
                        Text="*" ForeColor="Red" ValidationGroup="Insert" ControlToValidate="textBoxInsertArtist"></asp:RequiredFieldValidator>
                </FooterTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Genre" SortExpression="Genre">
                <EditItemTemplate>
                    <asp:DropDownList ID="ddlEditGenre" runat="server" SelectedValue='<%# Bind("Genre") %>'>
                        <asp:ListItem>select Genre</asp:ListItem>
                        <asp:ListItem>Pop</asp:ListItem>
                        <asp:ListItem>Rock</asp:ListItem>
                        <asp:ListItem>Dance</asp:ListItem>
                        <asp:ListItem>Latin</asp:ListItem>
                    </asp:DropDownList>
                    <asp:RequiredFieldValidator ID="rfvEditGenre" runat="server" ErrorMessage="Genre is required"
                        Text="*" ForeColor="Red" ControlToValidate="ddlEditGenre" InitialValue="select Genre"></asp:RequiredFieldValidator>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label4" runat="server" Text='<%# Bind("Genre") %>'></asp:Label>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:DropDownList ID="ddlInsertGenre" runat="server">
                        <asp:ListItem>select Genre</asp:ListItem>
                        <asp:ListItem>Pop</asp:ListItem>
                        <asp:ListItem>Rock</asp:ListItem>
                        <asp:ListItem>Dance</asp:ListItem>
                        <asp:ListItem>Latin</asp:ListItem>
                    </asp:DropDownList>
                    <asp:RequiredFieldValidator ID="rfvInsertGenre" runat="server" ErrorMessage="Genre is required" InitialValue="select Genre"
                        Text="*" ForeColor="Red" ValidationGroup="Insert" ControlToValidate="ddlInsertGenre"></asp:RequiredFieldValidator>
                </FooterTemplate>
            </asp:TemplateField>
        </Columns>
        <EditRowStyle BackColor="#2461BF" />
        <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
        <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
        <RowStyle BackColor="#EFF3FB" />
        <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
        <SortedAscendingCellStyle BackColor="#F5F7FB" />
        <SortedAscendingHeaderStyle BackColor="#6D95E1" />
        <SortedDescendingCellStyle BackColor="#E9EBEF" />
        <SortedDescendingHeaderStyle BackColor="#4870BE" />
    </asp:GridView>
    <asp:Label ID="LabelAlreadyExists" runat="server" Text=""></asp:Label>
    <asp:ValidationSummary ValidationGroup="Insert" runat="server" ForeColor="Red"></asp:ValidationSummary>
    <asp:ValidationSummary runat="server" ForeColor="Red"></asp:ValidationSummary>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DBCS %>" SelectCommand="select tblSong.ID ,Title, Artist, Genre from tblSong JOIN tblArtist on ArtistId = tblArtist.ID
        JOIN tblGenre on GenreId = tblGenre.ID;"
        UpdateCommand="select tblSong.ID ,Title, Artist, Genre from tblSong JOIN tblArtist on ArtistId = tblArtist.ID JOIN tblGenre on GenreId = tblGenre.ID;"
        DeleteCommand="select tblSong.ID ,Title, Artist, Genre from tblSong JOIN tblArtist on ArtistId = tblArtist.ID JOIN tblGenre on GenreId = tblGenre.ID;"
        FilterExpression="Title LIKE '%{0}%' AND Artist LIKE '%{1}%' AND Genre LIKE '{2}'">
        <FilterParameters>
            <asp:ControlParameter ConvertEmptyStringToNull="false" ControlID="TextBoxSearchTitle" DefaultValue="" Name="Title" PropertyName="Text" />
            <asp:ControlParameter ConvertEmptyStringToNull="false" ControlID="TextBoxSearchArtist" DefaultValue="" Name="Artist" PropertyName="Text" />
            <asp:ControlParameter ControlID="DDLSearch" Type="String" Name="Genre" PropertyName="SelectedValue" />
        </FilterParameters>
    </asp:SqlDataSource>
</form>

当我运行此代码时,gridview不可见。 我所看到的只是两个标签,两个文本框和第二个中的下拉列表。 谁能向我解释为什么?

提前致谢!

编辑:

    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DBCS %>" SelectCommand="select tblSong.ID ,Title, Artist, Genre from tblSong JOIN tblArtist on ArtistId = tblArtist.ID
        JOIN tblGenre on GenreId = tblGenre.ID;"
        UpdateCommand="select tblSong.ID ,Title, Artist, Genre from tblSong JOIN tblArtist on ArtistId = tblArtist.ID JOIN tblGenre on GenreId = tblGenre.ID;"
        DeleteCommand="select tblSong.ID ,Title, Artist, Genre from tblSong JOIN tblArtist on ArtistId = tblArtist.ID JOIN tblGenre on GenreId = tblGenre.ID;"
        FilterExpression="Title LIKE '%{0}%' AND Artist LIKE '%{1}%' AND GenreId ={2}">
        <FilterParameters>
            <asp:ControlParameter ConvertEmptyStringToNull="false" ControlID="TextBoxSearchTitle" DefaultValue="" Name="Title" PropertyName="Text" />
            <asp:ControlParameter ConvertEmptyStringToNull="false" ControlID="TextBoxSearchArtist" DefaultValue="" Name="Artist" PropertyName="Text" />
            <asp:ControlParameter ControlID="DDLSearch" Type="Int16" Name="Genre" PropertyName="SelectedValue" />
        </FilterParameters>
    </asp:SqlDataSource>

DDLSearch筛选器基于SelectedValue ,后者使用GenreIDs {1,2,3,4}而不是Genre名称进行筛选。 更改您的FilterExpression以使用ID代替名称:

AND GenreID ='{2}'

而且,如果GenreID是数据库中的整数,则将DDLSearch ControlParameter更改为使用整数数据类型而不是String,并更改FilterExpression以删除单个刻度,以便SQL Server不会执行从int到varchar的隐式转换。查找GenreID时。

AND GenreID ={2}

还要注意,如果您计划在tblSong表中包含大量数据,那么最好改用SelectParameters 将结果返回到ASP.NET(msdn.microsoft.com/en-us/library/z72eefad.aspx)之前, SelectParameters将在SQL Server端进行筛选。 另一方面, FilterExpressions将从SQL Server获取所有记录,然后缓存结果并在ASP.NET端进行过滤。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM