2010-04-10 6 views
0

C'est probablement une question simple mais je développe une application web en C# avec DropDownList. Actuellement, il fonctionne pour une seule DropDownList. Mais maintenant que j'ai modifié le code pour que le nombre de DropDownLists qui devrait apparaître soit dynamique, cela me donne une erreur;Comment faire pour renvoyer des sélections DropDownList dynamiquement dans ASP.NET?

"Le nom 'ddl' n'existe pas dans le contexte actuel ."

La raison de cette erreur est qu'il existe plusieurs instances de 'ddl' = nombre de compteurs. Alors, comment puis-je retourner plus d'un 'ddl'? Comme quel type de retour devrait avoir cette méthode à la place? Et comment puis-je retourner ces valeurs?

Raison J'en ai besoin dynamique Je dois créer un DropDownList pour chaque colonne de la table Adventureworks qu'ils sélectionnent.

 private DropDownList CreateDropDownLists() 
    { 
     for (int counter = 0; counter < NumberOfControls; counter++) 
     { 
      DropDownList ddl = new DropDownList(); 
      SqlDataReader dr2 = ADONET_methods.DisplayTableColumns(targettable); 
      ddl.ID = "DropDownListID" + (counter + 1).ToString(); 

      int NumControls = targettable.Length; 
      DataTable dt = new DataTable(); 
      dt.Load(dr2); 

      ddl.DataValueField = "COLUMN_NAME"; 
      ddl.DataTextField = "COLUMN_NAME"; 
      ddl.DataSource = dt; 
      ddl.ID = "DropDownListID 1"; 
      ddl.SelectedIndexChanged += new EventHandler(ddlList_SelectedIndexChanged); 
      ddl.DataBind(); 

      ddl.AutoPostBack = true; 
      ddl.EnableViewState = true; //Preserves View State info on Postbacks 
      //ddlList.Style["position"] = "absolute"; 
      //ddl.Style["top"] = 80 + "px"; 
      //ddl.Style["left"] = 0 + "px"; 
      dr2.Close(); 
     } 
     return ddl; 
    } 

Répondre

1

On dirait que vous essayez de retourner le menu déroulant à la fin de la fonction, mais son déclarée dans le cadre de la boucle. Essayez de créer un tableau de listes déroulantes au début de la fonction (avant la boucle for), et définissez le tableau dans les boucles, puis retournez-le. Vous devrez également modifier votre déclaration de fonction pour prendre en charge un tableau de listes déroulantes.

private DropDownList[] CreateDropDownLists() 
{ 
    DropDownList[] dropDowns = new DropDownList[NumberOfControls]; 

    for (int counter = 0; counter < NumberOfControls; counter++) 
    { 
     DropDownList ddl = new DropDownList(); 
     SqlDataReader dr2 = ADONET_methods.DisplayTableColumns(targettable); 
     ddl.ID = "DropDownListID" + (counter + 1).ToString(); 

     int NumControls = targettable.Length; 
     DataTable dt = new DataTable(); 
     dt.Load(dr2); 

     ddl.DataValueField = "COLUMN_NAME"; 
     ddl.DataTextField = "COLUMN_NAME"; 
     ddl.DataSource = dt; 
     ddl.ID = "DropDownListID 1"; 
     ddl.SelectedIndexChanged += new EventHandler(ddlList_SelectedIndexChanged); 
     ddl.DataBind(); 

     ddl.AutoPostBack = true; 
     ddl.EnableViewState = true; //Preserves View State info on Postbacks 
     //ddlList.Style["position"] = "absolute"; 
     //ddl.Style["top"] = 80 + "px"; 
     //ddl.Style["left"] = 0 + "px"; 
     dr2.Close(); 

     dropDowns[counter] = ddl; 
    } 
    return dropDowns; 
} 
+0

Bonne réponse! J'ai utilisé cette solution, Kevin! – salvationishere

1

Pourquoi ne pas simplement retourner une liste de DropDownList?

private List<DropDownList> CreateDropDownLists() 
{ 
    List<DropDownList> listDDL = new List<DropDownList>(); 
    for (int counter = 0; counter < NumberOfControls; counter++) 
    { 
     DropDownList ddl = new DropDownList(); 

     SqlDataReader dr2 = ADONET_methods.DisplayTableColumns(targettable); 
     ddl.ID = "DropDownListID" + (counter + 1).ToString(); 

     int NumControls = targettable.Length; 
     DataTable dt = new DataTable(); 
     dt.Load(dr2); 

     ddl.DataValueField = "COLUMN_NAME"; 
     ddl.DataTextField = "COLUMN_NAME"; 
     ddl.DataSource = dt; 
     ddl.ID = "DropDownListID 1"; 
     ddl.SelectedIndexChanged += new EventHandler(ddlList_SelectedIndexChanged); 
     ddl.DataBind(); 

     ddl.AutoPostBack = true; 
     ddl.EnableViewState = true; //Preserves View State info on Postbacks 
     //ddlList.Style["position"] = "absolute"; 
     //ddl.Style["top"] = 80 + "px"; 
     //ddl.Style["left"] = 0 + "px"; 
     dr2.Close(); 

     listDDL.Add(ddl); 
    } 
    return listDDL; 
} 
+0

Vous pouvez placer DataReader dans un bloc d'utilisation comme bonne pratique. –

+0

Bonne réponse, John. Mieux que ce que j'avais! – salvationishere

+0

@salvationishere techniquement le mien, John simplement nettoyé le formatage. @Ashish bon point, je voulais juste faire remarquer qu'une liste pourrait être utilisée à la place. – spong

Questions connexes