网格视图 search/filter 使用 sql

Gridview search/filter using sql

我在 c# webform 中得到了一个 gridview,它包含来自 SQL 服务器数据库的数据库,通过 sqlDataSource。 SqlDataSource 包含一个 SQL 字符串

SELECT * FROM [MaterialView] WHERE (([MaterialName] LIKE '%' + @MaterialName + '%') AND ([SupplierID] = @SupplierID))    

SQL 字符串按 SupplierID 和 MaterialName 过滤数据两次。

首先用户在上一页确定SupplierID(@SupplierID参数),当加载gridview页面时,它执行([SupplierID] = @SupplierID))。

然后,我得到一个 "search box" + "button",它使用户能够再次过滤 gridview,方法是在 "search box"(@MaterialName 参数)中输入文本,执行([MaterialName] LIKE '%' + @MaterialName + '%')。

我的问题是,当加载 gridview 页面时,由于 "search box" 最初是 EMPTY(没有 @MaterialName 参数),gridview return 0 记录 ()。

我的修复方法是创建 2 个相似的 Gridview,一个只包含 supplierID 过滤器,另一个包含两者。

<body>
    <form id="form1" runat="server">
        <div>
            <asp:TextBox ID="TextBox1" runat="server" Height="40px" Width="289px"></asp:TextBox>
            <asp:Button ID="Button1" runat="server" Text="搜尋" OnClick="Button1_Click" />
            <!--初始表單-->
            <asp:Panel ID="Panel1" runat="server">
                <asp:GridView ID="GridView1" runat="server" onrowcommand="GridView1_RowCommand" AllowPaging="True" AutoGenerateColumns="False" DataSourceID="SqlDataSource2" Height="498px" Width="712px" CellPadding="4" ForeColor="#333333" GridLines="None" CssClass="auto-style1">          
            <AlternatingRowStyle BackColor="White" />
            <Columns>
                <asp:TemplateField HeaderText="ClassType"   SortExpression="ClassType">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("ClassType") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Bind("ClassType") %>'></asp:Label>
                    </ItemTemplate>
                    <ItemStyle HorizontalAlign="Center" />
                </asp:TemplateField>
                <asp:TemplateField HeaderText="MaterialName" SortExpression="MaterialName">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("MaterialName") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Button ID="Button2" runat="server" commandname="choose" CommandArgument='<%# Eval("MaterialID") %>' Text='<%# Eval("MaterialName") %>' />
                    </ItemTemplate>
                    <ItemStyle HorizontalAlign="Center" />
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Quantity" SortExpression="Quantity">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("Quantity") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label4" runat="server" Text='<%# Bind("Quantity") %>'></asp:Label>
                    </ItemTemplate>
                    <ItemStyle HorizontalAlign="Center" />
                </asp:TemplateField>
                <asp:TemplateField HeaderText="MeasureUnit" HeaderStyle-width="10%" SortExpression="MeasureUnit">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox5" runat="server" Text='<%# Bind("MeasureUnit") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label5" runat="server" Text='<%# Bind("MeasureUnit") %>'></asp:Label>
                    </ItemTemplate>
                    <HeaderStyle Width="10%" />
                    <ItemStyle HorizontalAlign="Center" />
                </asp:TemplateField>
                <asp:BoundField DataField="CreateDate" HeaderText="CreateDate" SortExpression="CreateDate" Visible="False" />
                <asp:BoundField DataField="SupplierID" HeaderText="SupplierID" SortExpression="SupplierID" Visible="False" />
                <asp:BoundField DataField="MaterialID" HeaderText="MaterialID" SortExpression="MaterialID" Visible="False" />
                <asp:TemplateField HeaderText="SupplierName" SortExpression="SupplierName" Visible="False">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("SupplierName") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label3" runat="server" Text='<%# Bind("SupplierName") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
            <EditRowStyle BackColor="#7C6F57" />
            <FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" />
            <RowStyle BackColor="#E3EAEB" />
            <SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" />
            <SortedAscendingCellStyle BackColor="#F8FAFA" />
            <SortedAscendingHeaderStyle BackColor="#246B61" />
            <SortedDescendingCellStyle BackColor="#D4DFE1" />
            <SortedDescendingHeaderStyle BackColor="#15524A" />
        </asp:GridView>
            </asp:Panel>
            <!--過濾表單-->
            <asp:Panel ID="Panel2" runat="server">
                <asp:GridView ID="GridView2" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataSourceID="SqlDataSource3" Height="498px" Width="710px" CellPadding="4" ForeColor="#333333" GridLines="None" CssClass="auto-style1">          
            <AlternatingRowStyle BackColor="White" />
            <Columns>
                <asp:BoundField DataField="ClassType" HeaderText="ClassType" SortExpression="ClassType" />
                <asp:BoundField DataField="MaterialName" HeaderText="MaterialName" SortExpression="MaterialName" />
                <asp:BoundField DataField="Quantity" HeaderText="Quantity" SortExpression="Quantity" />
                <asp:BoundField DataField="MeasureUnit" HeaderText="MeasureUnit" SortExpression="MeasureUnit" />
                <asp:BoundField DataField="CreateDate" HeaderText="CreateDate" SortExpression="CreateDate" Visible="False" />
                <asp:BoundField DataField="MaterialID" HeaderText="MaterialID" SortExpression="MaterialID" Visible="False" />
                <asp:BoundField DataField="SupplierID" HeaderText="SupplierID" SortExpression="SupplierID" Visible="False" />
                <asp:BoundField DataField="SupplierName" HeaderText="SupplierName" SortExpression="SupplierName" Visible="False" />
            </Columns>
            <EditRowStyle BackColor="#7C6F57" />
            <FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" />
            <RowStyle BackColor="#E3EAEB" />
            <SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" />
            <SortedAscendingCellStyle BackColor="#F8FAFA" />
            <SortedAscendingHeaderStyle BackColor="#246B61" />
            <SortedDescendingCellStyle BackColor="#D4DFE1" />
            <SortedDescendingHeaderStyle BackColor="#15524A" />
        </asp:GridView>
            </asp:Panel>
        </div>

        <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:CompanyConnectionString2 %>" SelectCommand="SELECT * FROM [MaterialView] WHERE ([SupplierID] = @SupplierID)">
            <SelectParameters>
                <asp:SessionParameter Name="SupplierID" SessionField="Gsuply" Type="Int32" />
            </SelectParameters>
        </asp:SqlDataSource>
        <asp:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="<%$ ConnectionStrings:CompanyConnectionString2 %>" SelectCommand="SELECT * FROM [MaterialView] WHERE (([MaterialName] LIKE '%' + @MaterialName + '%') AND ([SupplierID] = @SupplierID))">
            <SelectParameters>
                <asp:ControlParameter ControlID="TextBox1" Name="MaterialName" PropertyName="Text" Type="String" />
                <asp:SessionParameter Name="SupplierID" SessionField="Gsuply" Type="Int32" />
            </SelectParameters>
</asp:SqlDataSource>
    </form>

我期待一个单一的 gridview 解决方案。当文本框为空时(@MaterialName parameter = ""),gridview return ALL @MaterialName 而不是没有@MaterialName。 谢谢。

您需要检查您的查询参数是否为 null 或它的长度是否为 0 或者它是否包含某个值然后使用 Like

进行过滤
SELECT * FROM [MaterialView] 
WHERE 
((
 @MaterialName IS NULL 
 OR LEN(@MaterialName) = 0 
 OR ([MaterialName] LIKE '%' + @MaterialName + '%')
)
AND ([SupplierID] = @SupplierID));

当我设置文本框默认文本= 0(@MaterialName参数来源)并将@er-sho SQL修改为

时它起作用
SELECT * FROM [MaterialView] 
WHERE 
((
 @MaterialName = 0 
 OR ([MaterialName] LIKE '%' + @MaterialName + '%')
 )
 AND ([SupplierID] = @SupplierID));

所以我猜问题是 textbox.text 默认值(如果未设置)既不是 NULL 也不是 LEN 0。 我知道这是一个草率的解决方案,但我对此很满意,再次感谢@er-sho