как отфильтровать сетку - PullRequest
1 голос
/ 26 мая 2011

У меня есть gridview, связанный с базой данных sqldatasource.У меня есть несколько выпадающих списков и таблица, в которой пользователи могут выбирать разные данные для фильтрации вида сетки.

Я знаю, как настроить это для одного элемента управления, но не знаю, как это сделать для нескольких элементов.В идеале я хотел бы, чтобы onfilterButton_Click код подключался к хранимой процедуре в базе данных.Параметры будут зависеть от параметров фильтра, выбранных пользователем.Я просто не знаю, как написать хранимую процедуру.(Я не лучший в SQL)

Но я открыт для предложений о лучших способах сделать это.Я использую C # Visual Studio 2010 и SQL Server 2008.

Я застрял на этом более недели, так что на самом деле любая практическая помощь будет приветствоваться.

Ответы [ 4 ]

1 голос
/ 26 мая 2011

Запишите одну хранимую процедуру и передайте значения 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 передайте SelectedValue DropDownList в качестве параметров и еще раз вызовите базу данных и свяжите ее с сеткой.

1 голос
/ 26 мая 2011

Если вы плохо пишете SP's, тогда вы можете напрямую фильтровать ваш SQL DataSource, используя свойство FilterExpression.

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();
0 голосов
/ 26 мая 2011

Ниже может дать вам представление о том, как это работает, пожалуйста, проверьте:

<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();
    }
0 голосов
/ 26 мая 2011

Ваша хранимая процедура объявляет все ваши параметры следующим образом:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...