2011-04-27 4 views
2

Comment filtrer les résultats affichés dans une base de données asp.net?Comment filtrer un ASP: 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(); 

    } 

Répondre

2

le chemin facile, mais quelque chose comme cela devrait fonctionner

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(); 
} 
+0

Bien sûr, vous allez être charger toutes les données - potentiellement très mauvais. –

+0

En effet, pas idéal mais en fonction de la situation c'est l'itinéraire rapide et facile – MikeM

+0

Oui oui. Vous avez répondu à la question littérale avec précision - je veux juste m'assurer que quelqu'un ne finit pas sur un serveur quelque part. ;) –

1

Eh bien, il est tout au sujet de la DataTable.

Filtrage en général

Vous pouvez gérer cela en changeant la procédure SQL/stockage/etc que vous utilisez pour charger des données dans le DataTable, ou (et faites attention ici) en chargeant tous les données puis en utilisant les capacités de filtrage intégrées d'ADO.Net.

Pour le dernier cas, DataTable.Select pense (Article on DataTable.Select and Filtering in ADO.Net).

Rechercher dans particlar

Cependant, dans le cadre d'une recherche, la meilleure pratique est de faire le travail dans la base de données, ce qui signifie dans votre SQL. Autrement vous devez tirer tous les les données à travers le fil chaque fois qu'une recherche se produit, puis filtrez-le sur le client. À moins que votre table ne soit toujours très petite, c'est un problème de performance très réel. Et même alors, ça sent très mauvais, car si c'est assez grand pour avoir besoin d'une recherche, vous avez déjà affaire au type de table qui pourrait grandir.

Il est préférable de charger exactement ce dont vous avez besoin. Cela peut conduire à des procédures stockées ennuyeuses. C'est l'un des problèmes où les outils ORM brillent vraiment parce qu'ils rendent si facile de faire des requêtes très dynamiques sans nécessairement avoir à jouer avec de gros sprocs avec des paramètres optionnels et ainsi de suite.

Espérons que ça aide!

-1

Y at-il une raison que vous exécutez votre requête SQL dans Page_Load(...)? Sinon, je recommande fortement d'utiliser un contrôle SqlDataSource configuré avec une instruction SQL incluant un paramètre pour votre filtre et un objet ControlParameter dans la collection SqlDataSource.SelectParameters. Tout ceci peut être fait de manière déclarative et est beaucoup plus efficace pour les serveurs SQL et ASP.NET.

La meilleure partie est, il peut être fait dans le balisage:

<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> 
+0

Leçon apprise avec le -1: ne répond pas à une question qui n'a pas été posée, n'est-ce pas? – pseudocoder

+0

La principale raison pour laquelle je vous ai rejeté était parce que j'ai une forte réaction négative à avoir concaténé SQL mélangé avec le balisage.Je déteste être critique car je sais qu'il y a des gens qui penseraient certainement que certaines de mes/mes/pratiques sont trop légères, mais pour moi c'est un problème d'entretien et je ne pense pas que cela devrait être présenté comme un bon moyen de faire des choses. Je sais que vous essayez d'être utile - désolé. :) –

+0

Pour vous donner un peu de contexte, dans mon magasin en ligne/concaténé SQL n'est pas autorisé du tout, et tous les accès aux données est censé se produire dans une couche d'accès aux données (un projet séparé). Voilà d'où vient ma réaction réflexe. –

Questions connexes