如何过滤asp:DataGrid

时间:2011-04-27 20:22:53

标签: asp.net datagrid filter

如何过滤asp.net Datagrid中显示的结果?

HTML

    <asp:TextBox ID="SearchText" runat="server" OnTextChanged="UpdateFilter" />
    <asp:DataGrid ID="gvProjList" runat="server" CellPadding="4" 
        ForeColor="#333333" GridLines="None" style="text-align: left" 
        Width="400px" AllowSorting="true">
        <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
        <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
    </asp:DataGrid>

C#

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            DataTable dt ....
            ....
            gvProjList.DataSource = dt;
            gvProjList.DataBind();
         }
     }


    protected void UpdateFilter(object sender, EventArgs e)
    {
        // ????
        // ViewState["LastFilter"] = SearchText.Text;
        // gvProjList.DataBind();

    }

3 个答案:

答案 0 :(得分:2)

这很简单,但这样的事情应该有效

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindGrid();
    }
}

protected void UpdateFilter(object sender, EventArgs e)
{
    BindGrid();
}

private void BindGrid()
{
    DataTable dt = new DataTable();
    //...
    dt.DefaultView.RowFilter = "SomeColumnInTheDataTable = '" + SearchText.Text + "'";
    gvProjList.DataSource = dt.DefaultView;
    gvProjList.DataBind();
}

答案 1 :(得分:1)

嗯,这都是关于DataTable的。

一般过滤

您可以通过更改用于将数据加载到DataTable中的SQL /存储过程/等来处理此问题,或者(并在此处小心)通过加载所有数据然后使用ADO来处理。 Net的内置过滤功能。

对于后一种情况,我会想到DataTable.Select(Article on DataTable.Select and Filtering in ADO.Net)。

在Particlar中搜索

但是,在搜索环境中,最佳做法是在数据库中进行工作,这在SQL中是有意义的。否则,每次搜索时都必须通过线路拉所有数据,然后在客户端上对其进行过滤。除非你的表总是非常小,否则这是一个非常真实的性能问题。即便如此,它闻起来也很糟糕,因为如果它足够大以至于需要搜索,那么你已经在处理可能增长的表格了。

最好只加载你需要的东西。这可能导致一些烦人的存储过程。这是ORM工具真正发挥作用的问题之一,因为它们可以很容易地进行非常动态的查询,而不必使用带有可选参数的大型sprocs等等。

希望有所帮助!

答案 2 :(得分:-1)

您是否有理由在Page_Load(...)中执行SQL查询?如果不是,我强烈建议使用配置了SQL语句的SqlDataSource控件,包括过滤器的参数和ControlParameter集合中的SqlDataSource.SelectParameters对象。所有这些都可以以声明方式完成,并且对SQL和ASP.NET服务器都更有效。

最重要的是,它可以在标记中完成:

<asp:TextBox ID="SearchText" runat="server" OnTextChanged="UpdateFilter" />
<asp:DataGrid ID="gvProjList" runat="server" CellPadding="4" ForeColor="#333333"
    GridLines="None" Style="text-align: left" Width="400px" AllowSorting="true" DataSourceID="SqlDataSource1">
    <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
    <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
    <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
</asp:DataGrid>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" SelectCommand="SELECT * FROM [Products] WHERE [Description] LIKE '%' + @SearchText + '%';">
    <SelectParameters>
        <asp:ControlParameter DbType="String" ControlID="SearchText" PropertyName="Text"
            DefaultValue="" />
    </SelectParameters>
</asp:SqlDataSource>