【问题标题】:Filter Data before it is loaded in the GridView在将数据加载到 GridView 之前过滤数据
【发布时间】:2015-12-17 15:15:08
【问题描述】:

我正致力于在 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 之前已经实现的那样,然后只加载与特定部门相关的数据。有人建议如何在不重写我的大部分代码的情况下最有效地做到这一点吗?

【问题讨论】:

  • 所以你想在页面加载时在下拉菜单中预先选择一个部门?
  • 不会有一个包含不同部门的下拉列表,然后用户将选择其中一个部门并显示相关数据

标签: c# asp.net gridview


【解决方案1】:

我认为您必须创建第二个DropDownList,以便在加载页面时使用数据库中的部门填充。在 DropDownListSelectedIndexChanged 事件中,您将当前控件的可见性设置为 true 并相应地更改 SQL 查询以仅选择所选部门中的那些员工。

【讨论】:

    【解决方案2】:

    我有点想念你想避免的事情,但让我从我之前的项目中提出一些解决方案:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-05-02
        • 2017-09-13
        • 1970-01-01
        • 1970-01-01
        • 2013-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多