2 votes

Besoin d'aide pour accéder à une liste déroulante par le biais d'une classe.

J'essaie de comprendre comment accéder et stocker la sélection d'une liste déroulante pour l'utiliser dans une commande SELECT dans la classe mainSQL.

voici les détails.

La DropDownList (sur une page appelée Page.aspx) :

    <asp:DropDownList 
    ID="selectInfo1" 
    runat="server" 
    AutoPostBack="True"
    DataTextField="Info1"
    DataValueField="Info1Key"
    DataSourceID="SqlDB" >
    </asp:DropDownList>

La fonction où j'essaie d'accéder à la DDL (dans un fichier de classe séparé) :

public List<ListInfo> getList()
{
List<ListInfo> sList = new List<ListInfo>();
ListInfo objList = null;
    //This is where I need to declare a variable called Info1Key and set it to the value of the ddl!
string queryString = "SELECT [UniqueID], [Date], [Info1], [Info2], [Info3] FROM [ReportedSales] WHERE ([Info1] = ' " + Info1Key + "') ORDER BY [Date]";
using (SqlConnection connection = new SqlConnection(sqlConString))
{
    using (SqlCommand command = new SqlCommand(queryString, connection))
    {
        command.Connection.Open();
        using (SqlDataReader dataReader = command.ExecuteReader())
        {
            while (dataReader.Read())
            {
                objList = new ListInfo();
                objList.ID = Convert.ToInt16(dataReader["UniqueID"]);
                objList.Date = Convert.ToDateTime(dataReader["Date"]);
                objList.Info1 = (dataReader["Info1"] as int?) ?? 0;
                objList.Info2 = (dataReader["Info2"] as int?) ?? 0;
                objList.Info3 = (dataReader["Info3"] as int?) ?? 0;
                sList.Add(objList);
            }
        }
    }
}
return sList;
}

C'est la seule fonction (j'en suis presque sûr) qui appelle la méthode getList

    private void FillListActivity()
    {
        List<ListInfo> objList = new List<ListInfo>();
        objList = new mainSQL().getList();

        ReportingGV.DataSource = objList;
        ReportingGV.DataBind();
    }

NOUVEAU PROBLÈME : le GV ne change plus lorsque je modifie la DDL.

Une façon de résoudre ce problème a été de modifier le Page_Load dans Page.aspx.cs comme suit :

A l'origine :

 protected void Page_Load(object sender, EventArgs e)
{
    if(!isPostBack)
    {
        FillSalesActivity();
    }
}

Fonctionne, mais vais-je avoir des problèmes ?

    protected void Page_Load(object sender, EventArgs e)
    {
        FillSalesActivity();
    }

4voto

David Points 65209

Vous ne voulez pas que vos classes externes connaissent ou s'intéressent aux éléments de l'interface utilisateur (tels que les listes déroulantes). Elles doivent être aussi agnostiques que possible en matière d'interface utilisateur.

Dans ce cas, il s'agit plutôt de transmettre la valeur à la fonction. Vous devez donc modifier la signature de la fonction pour obtenir quelque chose comme ceci :

public List<ListInfo> getList(string Info1Key)
{
    // The code is the same, just use the Info1Key parameter that's been passed to the function.
}

Ensuite, vous appelez la fonction comme ceci :

private void FillSalesActivity()
{
    List<SalesInfo> objSalesList = new List<SalesInfo>();
    objSalesList = new mainSQL().getSalesList(selectInfo1.SelectedValue);

    SalesReportingGV.DataSource = objSalesList;
    SalesReportingGV.DataBind();
}

Quelques points à noter :

  • Vous devrez inclure un contrôle d'erreur dans votre page pour vous assurer qu'il existe une valeur SelectedValue avant de prendre la peine d'appeler la fonction.
  • Vous devez vraiment examiner les vulnérabilités liées à l'injection de code SQL, car votre code en comporte une. Jamais faire implicitement confiance à une valeur provenant du client, même si elle provient d'une liste déroulante et que vous pensez la contrôler. Ce n'est pas le cas. Le client peut envoyer n'importe quelle valeur s'il le souhaite, et cette valeur peut contenir du code SQL que votre fonction exécutera joyeusement contre votre base de données avec toutes les permissions dont elle a besoin. Il faut envisager l'utilisation de "requêtes paramétrées" ou, mieux encore, d'un cadre ORM. Quelque chose comme Linq To Sql a une configuration assez rapide et une courbe d'apprentissage faible et vous offre beaucoup de fonctionnalités.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X