2010-11-21 30 views
0

Je travaille sur l'extension d'une application ASP.NET 2.0 en utilisant une base de données InterBase. Mon expérience est en PHP/MySQL, donc ma familiarité avec ASP est actuellement dans la gamme de 2 semaines, et est reconstituée à partir de l'examen du code d'un collègue, les 90 premières pages de mon livre ASP, et Google. Dans l'application, j'ai un contrôle SqlDataSource qui se connecte à ma base de données et sélectionne les informations dont j'ai besoin. Ensuite, les résultats sont copiés dans un DataView où je modifie les données dans l'une des colonnes, puis je pousse cette DataView à un GridView pour la sortie. Le problème que j'ai est que je ne peux pas trier le GridView à ce stade. J'ai suivi les instructions ici: http://forums.asp.net/p/956540/1177923.aspx, mais en vain.Impossible de trier un GridView rempli par DataView dans ASP.NET 2.0 en utilisant C#

Voici le code de la page:

<form id="form1" runat="server"> 
<div> 
    <asp:SqlDataSource ID="Products" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString1 %>" 
     ProviderName="<%$ ConnectionStrings:ConnectionString1.ProviderName %>" OnLoad="ProductsDS_Load" 
     OnSelected="ProductsDS_Selected" DataSourceMode="DataSet"> 
    </asp:SqlDataSource> 

    <br /> 
    <asp:Label ID="testlabel" runat="server"></asp:Label> 
    <br /> 
    <asp:Label ID="testlabel2" runat="server"></asp:Label> 
    <br /><br /> 
    This table lists all 2000+ numbered projects which are at least partially in process.<br /> 
    The Project number link leads to a more detailed view of that project.<br /> 
    <br /> 
    <asp:Label runat="server" ID="numrows"></asp:Label> results returned. 
    <br /> 
    <asp:GridView ID="ProductsView" runat="server" EnableModelValidation="True" 
     AutoGenerateColumns="False" CellPadding="4" OnSorting="ProductsView_Sorting" 
     ForeColor="#333333" GridLines="None" AllowSorting="True"> 
     <AlternatingRowStyle BackColor="White" /> 
     <Columns> 
      <asp:HyperLinkField HeaderText="Project" SortExpression="PROJECT" 
       DataTextField="PROJECT" Target="subweeklyreport" DataNavigateUrlFields="PROJECT" 
       DataNavigateUrlFormatString="Products.aspx?p={0}" /> 
      <asp:BoundField Visible="false" DataField="PROJECTID" /> 
      <asp:BoundField DataField="PART" HeaderText="Part #" 
       SortExpression="PART" /> 
      <asp:BoundField DataField="DESCRIPTION" HeaderText="Description" 
       SortExpression="DESCRIPTION" /> 
      <asp:BoundField DataField="ENGMGR" HeaderText="Eng. Mgr." 
       SortExpression="ENGMGR" /> 
     </Columns> 
     <EditRowStyle BackColor="#7C6F57" /> 
     <FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" /> 
     <HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" /> 
     <PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" /> 
     <RowStyle BackColor="#E3EAEB" /> 
     <SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" /> 
    </asp:GridView> 
</div> 
</form> 

Et voici le code derrière:

protected void ProductsDS_Load(object sender, EventArgs e) 
{ 

    string SQLQuery = Query would go here; 

    testlabel2.Text = SQLQuery; 
    Products.SelectCommand = SQLQuery; 
    Products.DataBind(); 

    DataView dv = (DataView)Products.Select(new DataSourceSelectArguments()); 

    foreach (DataRow dr in dv.Table.Rows) 
    { 
     string name = dr["ENGMGR"].ToString(); 
     string[] explode = name.Split(' '); 
     string newname; 
     if (explode.Length == 3) 
     { 
      newname = explode[2] + ", " + explode[0]; 
     } 
     else 
     { 
      newname = explode[1] + ", " + explode[0]; 
     } 

     dr["ENGMGR"] = newname; 
     //testlabel.Text = dr["ENGMGR"].ToString(); 
    } 


    Products.DataBind(); 
    //ProductsView.DataSourceID = "Products"; 
    ProductsView.DataSource = dv; 
    ProductsView.DataBind(); 
    ProductsView.Enabled = true; 
    ProductsView.Visible = true; 

} 

protected void ProductsDS_Selected(object sender, SqlDataSourceStatusEventArgs e) 
{ 
    numrows.Text = e.AffectedRows.ToString(); 
} 

protected void ProductsView_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    DataTable dataTable = ProductsView.DataSource as DataTable; 

    if (dataTable != null) 
    { 
     DataView dataView = new DataView(dataTable); 
     dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection); 

     ProductsView.DataSource = dataView; 
     ProductsView.DataBind(); 
    } 
} 

private string ConvertSortDirectionToSql(SortDirection sortDirection) 
{ 
    string newSortDirection = String.Empty; 

    switch (sortDirection) 
    { 
     case SortDirection.Ascending: 
      newSortDirection = "ASC"; 
      break; 

     case SortDirection.Descending: 
      newSortDirection = "DESC"; 
      break; 
    } 

    return newSortDirection; 
} 

Ce que je pense qui se passe est que chaque fois que le GridView fait le postback pour le tri, il provoque la requête à exécuter à nouveau et écraser la tentative de trier les données existantes dans le GridView, mais je ne sais pas assez sur ASP maintenant pour empêcher ce comportement. Toute aide serait très appréciée.

Répondre

0

J'ai fini par résoudre mon propre problème. J'ai créé une variable de session pour stocker la vue de données entre les chargements de page, et vérifier si la vue de données est stockée avant d'exécuter la requête, et le trier si c'est le cas, et exécuter la requête régulière sinon. Comme je ne m'attends pas à ce que des données soient introduites entre la page initiale et le tri, je ne pense pas que l'utilisation d'une copie stockée des données serait un problème majeur.