如何过滤gridview

问题描述

| 我有一个通过sqldatasource连接到数据库的gridview。我有多个下拉列表和一个表,用户可以在其中选择不同的数据来过滤gridview。 我知道如何为一个控件设置此功能,但不知道如何为多个控件设置此功能。理想情况下,我想做的是将代码“ 0”连接到数据库中的存储过程。参数将取决于用户选择的过滤器选项。我只是不知道如何编写存储过程。 (我不是sql方面的佼佼者) 但是我愿意提出更好的方法建议。我正在使用C#Visual Studios 2010和sql Server 2008。 我已经在这个问题上停留了一个多星期,所以实际上任何实际的帮助都将受到欢迎。     

解决方法

编写一个存储过程,并将DropDownList值作为参数传递,如下所示:
 CREATE PROC CUST_Details
 (
 @CustomerID INT,@CompanyID INT
 )
 AS
 BEGIN

    SELECT
               Customer.CustomerName,Company.CompanyName
    FROM
       Customer INNER JOIN
       Company ON Customer.CompanyID = Company.CompanyID
        WHERE
       (@CompanyID = -1 OR Customer.CompanyID = @CompanyID) AND
       (@CustomerID = -1 OR Customer.CustomerID = @CustomerID)

 END
在此之前,在您的DropDownList中添加诸如\“ <----- Select -----> \”作为DataTextField和\“-1 \”作为DataValueField的项目。 在两个DropDownList SelectedIndexChanged事件中,传递DropDownList \的SelectedValue作为参数,然后再次调用数据库并将其与Grid进行数据绑定。     ,如果您不太擅长编写
SP\'s
,则可以使用
FilterExpression
属性直接过滤SQL
DataSource
sql.FilterExpression = \"Filteration Expression\";
GridView1.DataBind();
编辑:对您有用的东西:
if (DropDownList1.SelectedItem.Text != \"All\")
    {
        SqlDataSource1.FilterExpression = \"Title like \'\" + textbox1.Text + \"\' and Category like \" + DropDownList1.SelectedValue;
    }
    else
    {
        SqlDataSource1.FilterExpression = \"Title like \'\" + textbox1.Text + \"\'\";
    }

 GridView1.DataBind();
    ,下面可能会告诉您这是如何工作的,请检查:
<html xmlns=\"http://www.w3.org/1999/xhtml\" >
    <head runat=\"server\">
    <title>ASP.NET Example</title>
</head>
<body>
        <form id=\"FORM1\" runat=\"server\">

            <p>Show all employees with the following title:
            <asp:DropDownList
                id=\"DropDownList1\"
                runat=\"server\"
                AutoPostBack=\"True\">
                <asp:ListItem>Sales Representative</asp:ListItem>
                <asp:ListItem>Sales Manager</asp:ListItem>
                <asp:ListItem>Vice President,Sales</asp:ListItem>
            </asp:DropDownList></p>

            <asp:SqlDataSource
                id=\"SqlDataSource1\"
                runat=\"server\"
                ConnectionString=\"<%$ ConnectionStrings:NorthwindConnection %>\"
                SelectCommand=\"SELECT EmployeeID,FirstName,LastName,Title FROM Employees\"
                FilterExpression=\"Title=\'{0}\'\" OnFiltering=\"SqlDataSource1_Filtering\">
                <FilterParameters>
                    <asp:ControlParameter Name=\"Title\" ControlId=\"DropDownList1\" PropertyName=\"SelectedValue\"/>
                </FilterParameters>
            </asp:SqlDataSource><br />

            <asp:GridView
                id=\"GridView1\"
                runat=\"server\"
                DataSourceID=\"SqlDataSource1\"
                AutoGenerateColumns=\"False\">
                <columns>
                    <asp:BoundField Visible=\"False\" DataField=\"EmployeeID\" />
                    <asp:BoundField HeaderText=\"First Name\" DataField=\"FirstName\" />
                    <asp:BoundField HeaderText=\"Last Name\" DataField=\"LastName\" />
                </columns>
            </asp:GridView>
                <asp:Label ID=\"Label1\" runat=\"server\" Text=\"Label\"></asp:Label>

        </form>
    </body>
</html> 
服务器端:
protected void SqlDataSource1_Filtering(object sender,SqlDataSourceFilteringEventArgs e)
    {
        Label1.Text = e.ParameterValues[0].ToString();
    }
    ,您的存储过程将声明您的所有参数,如下所示:
CREATE PROCEDURE GetData
 @parameter1 varchar(50),@parameter2 int    
etc...
然后,您将使用以下参数来调用存储过程:
GetData(dropdownlist1.SelectedItem.Value,dropdownlist2.SelectedItem.Value);
那是你的意思吗? 更新: 对于选择“全部”选项的情况,您仍然可以将该值作为空参数传递,并且在存储过程中,您可以将其声明为“可选”:
CREATE PROCEDURE GetData
     @parameter1 varchar(50) = NULL,@parameter2 int 
因此,存储过程中的查询将如下所示:
SELECT *
FROM Table
WHERE  ((@parameter1 IS NULL) OR (column1 = @parameter1 )) 
AND column2 = @parameter2