在将数据加载到GridView之前过滤数据

时间:2015-11-18 14:43:45

标签: c# asp.net gridview

我正在使用GridView显示一些数据并使用ObjectDataSource。我的代码看起来像这样

.aspx:

    <asp:DropDownList ID="DropDownList1" runat="server"  AutoPostBack="true">
               <asp:ListItem  Text="Employee" Value="Name"></asp:ListItem>
               <asp:ListItem Text="Department" Value="Department"></asp:ListItem>
           </asp:DropDownList>
             <asp:TextBox ID="TextBox1" runat="server" ></asp:TextBox>
             <asp:Button ID="Button1" runat="server" Text="Go" OnClick="Button1_Click" />
             <asp:Button ID="Button2" runat="server" Text="Clear" OnClick="Button2_Click" />

   <asp:GridView ID="GridView1" runat="server"  AutoGenerateColumns="False"  AllowPaging="true"  PageSize="30" EmptyDataText="No data available" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="3" DataSourceID="ObjectDataSource1" >
        <Columns>
            <asp:BoundField DataField="Employee" HeaderText="Employee" ReadOnly="True" SortExpression="" >
            <ItemStyle HorizontalAlign="Center" />
            </asp:BoundField>
            <asp:BoundField DataField="Department" HeaderText="Department" ReadOnly="True" SortExpression="" >
                <ItemStyle  HorizontalAlign="Center" />
                </asp:BoundField>
         </Columns>

  </asp:GridView>

         <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" TypeName="Employees" SelectMethod="EmployeesData" />

我正在使用下拉列表和搜索框过滤GridView中的数据。

aspx.cs:

protected void Button1_Click(object sender, EventArgs e)
{
    ViewState.Add("test", true);

    if (DropDownList1.SelectedValue.ToString() == "Employee")
    {

        ObjectDataSource1.FilterExpression = "Employee LIKE '%" + TextBox1.Text + "%' ";

    }
    else if (DropDownList1.SelectedValue.ToString() == "Department")
    {

        ObjectDataSource1.FilterExpression = "Department LIKE '%" + TextBox1.Text + "%' ";

    }
 }

我正在从数据库中加载我的数据 .cs:

public static class Employees
{
    public static DataTable EmployeesData()
    {

        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["db.vw_EmployeesConnectionString"].ConnectionString))
        using (SqlCommand command = new SqlCommand("SELECT Employee, Department FROM vw__Employees WHERE ....", conn))
        {
            DataTable data = new DataTable();
            SqlDataAdapter adapter = new SqlDataAdapter(command);
            adapter.Fill(data);
            return data;

        }

    }
}

现在一切都很好。但是,我现在有客户来找我说在显示任何数据之前他们想要按部门过滤它(可能早就想到了......)。所以基本上他们想要一个带有下拉列表的过滤器函数,就像我已经实现的那样,在任何数据实际加载到GridView之前,然后只加载与特定部门相关的数据。没有重写我的大部分代码,有人建议如何最有效地做到这一点?

3 个答案:

答案 0 :(得分:0)

我认为你必须创建第二个session_start(); $success = true; $errors = []; $datacode = $_SESSION["6_letters_code"]; $datacaptcha = $_POST['6_letters_code']; if(!$datacode == $datacaptcha){ $success = false; $errors[]= 'Captcha is wrong'; } //the rest of your form handling code here. //you can add other errors such as missing fields etc to the errors array //then send response header('Content-Type: application/json'); echo json_encode(['success'=> $success, 'errors'=>$errors]); ,当你加载页面时,你要从数据库填充Departments。在DropDownList的{​​{1}}事件中,您将当前控件的可见性设置为SelectedIndexChanged,并相应地更改SQL查询,以便仅选择所选部门中的员工。

答案 1 :(得分:0)

我有点想念您想要避免的内容,但让我再提出我之前项目的一些解决方案:

1)如何避免修改服务器逻辑 - 简短的回答是将其置于数据库层。因此,使用一些表函数(或存储过程)并从中进行选择,而不是在代码中指定SELECT

2)请参阅Microsoft示例以处理OnFilter事件https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.filterexpression(v=vs.110).aspx

答案 2 :(得分:0)

如果你有一个下拉列表和一个搜索框,可以使用Javascript在下面的URL中定义一个解决方案,这个解决方案非常快,并且可以快速完成过滤。

请参阅http://www.codescratcher.com/javascript/search-gridview-using-javascript/。我希望它可以为您提供所需的解决方案。