2009-07-26 18 views
1

J'utilise une hashtable pour stocker les paires clé-valeur et j'initialise cette hashtable (ddl_ht) dans la méthode CreateDropDownLists(). Toutefois, lorsque je vérifie la valeur de "currentItem" dans ma méthode SelectedIndexChanged, cette valeur est null. Même si j'ai vérifié la valeur deC# Hashtable ne conserve pas les valeurs

(string) ddl_ht [touche [1]]

dans ma fenêtre Espion et affiche une valeur (non nulle). Comprenez-vous pourquoi ce currentItem est nul?

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.SqlClient; 
using System.Diagnostics; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using ADONET_namespace; 

namespace AddFileToSQL 
{ 
    public partial class DataMatch : _Default 
    { 
     protected System.Web.UI.WebControls.PlaceHolder phTextBoxes; 
     protected System.Web.UI.WebControls.PlaceHolder phDropDownLists; 
     protected System.Web.UI.WebControls.Button btnAnotherRequest; 
     protected System.Web.UI.WebControls.Panel pnlCreateData; 
     protected System.Web.UI.WebControls.Literal lTextData; 
     protected System.Web.UI.WebControls.Panel pnlDisplayData; 

     protected static string inputfile2; 
     static string[] headers = null; 
     static string[] data = null; 
     static string[] data2 = null; 
     static DataTable myInputFile = new DataTable("MyInputFile"); 
     static string[] myUserSelections; 
     static Hashtable ddl_ht = new Hashtable(); 

     // Page Load 
     private void Page_Load(object sender, System.EventArgs e) 
     { 
      if (!Page.IsPostBack) 
      { 
       this.NumberOfControls = 0; 
      } 
     } 

     // Add DropDownList Control to Placeholder 
     private void CreateDropDownLists() 
     { 
      for (int counter = 0; counter < NumberOfControls; counter++) 
      { 
       DropDownList ddl = new DropDownList(); 
       SqlDataReader dr = ADONET_methods.DisplayTableColumns(targettable); 
       ddl.ID = "DropDownListID " + (counter + 1).ToString(); 
       ddl.DataTextField = "COLUMN_NAME"; 
       ddl.DataValueField = "COLUMN_NAME"; 
       ddl.DataSource = dr; 
       ddl.DataBind(); 

       //myUserSelections[counter] = ""; 

       ddl.AutoPostBack = true; 
       ddl.EnableViewState = true; //Preserves View State info on Postbacks 
       ddl.Style["position"] = "absolute"; 
       ddl.Style["top"] = 100 * counter + 80 + "px"; 
       ddl.Style["left"] = 250 + "px"; 
       ddl.SelectedIndexChanged += new EventHandler(SelectedIndexChanged); 
       ddl_ht.Add(counter, ddl.SelectedValue); 

       pnlDisplayData.Controls.Add(ddl); 
       pnlDisplayData.Controls.Add(new LiteralControl("<br><br><br>")); 
       pnlDisplayData.Visible = true; 
       pnlDisplayData.FindControl(ddl.ID); 
       // pnlDropDownList.FindControl(ddl.ID); 
       dr.Close(); 
      } 
     } 

     protected void SelectedIndexChanged(object sender, EventArgs e) 
     { 
      DropDownList ddl = (DropDownList)sender; 
      string[] value=(ddl.SelectedValue).Split(' '); 
      string[] key = ddl.ID.Split(' '); 
      string currentItem=(string)ddl_ht[key[1]]; 
      //if (String.IsNullOrEmpty(currentItem)) 
      //{ 
      // ddl_ht.Add(key[1], value[0]); 
      //} 
      if (currentItem != ddl.SelectedValue) 
      { 
       ddl_ht.Remove(key[1]); 
       ddl_ht.Add(key[1], ddl.SelectedValue); 
      } 
     } 

     // Add TextBoxes Control to Placeholder 
     private void RecreateDropDownLists() 
     { 
      for (int counter = 0; counter < NumberOfControls; counter++) 
      { 
       DropDownList ddl = new DropDownList(); 
       SqlDataReader dr = ADONET_methods.DisplayTableColumns(targettable); 

       ddl.ID = "DropDownListID " + (counter + 1).ToString(); 
       ddl.DataTextField = "COLUMN_NAME"; 
       ddl.DataValueField = "COLUMN_NAME"; 
       ddl.DataSource = dr; 
       ddl.DataBind(); 
       myUserSelections[counter] = ""; 
       dr.Close(); 

       ddl.AutoPostBack = true; 
       ddl.EnableViewState = true; //Preserves View State info on Postbacks 
       ddl.Style["position"] = "absolute"; 
       ddl.Style["top"] = 100 * counter + 80 + "px"; 
       ddl.Style["left"] = 250 + "px"; 
       ddl.SelectedIndexChanged += new EventHandler(SelectedIndexChanged); 
       pnlDisplayData.Controls.Add(ddl); 
       pnlDisplayData.Controls.Add(new LiteralControl("<br><br><br>")); 
      } 
     } 

     // Create TextBoxes and DropDownList data here on postback. 
     protected override void CreateChildControls() 
     { 
      // create the child controls if the server control does not contains child controls 
      this.EnsureChildControls(); 

      // Creates a new ControlCollection. 
      this.CreateControlCollection(); 

      // Here we are recreating controls to persist the ViewState on every post back 
      if (Page.IsPostBack) 
      { 
       RecreateDropDownLists(); 
       RecreateLabels(); 
      } 
      // Create these conrols when asp.net page is created 
      else 
      { 
       PopulateFileInputTable(); 
       CreateDropDownLists(); 
       CreateLabels(); 
      } 

      // Prevent child controls from being created again. 
      this.ChildControlsCreated = true; 
     } 

    } 
} 

Répondre

1

Vous ne devriez pas stocker votre Hashtable comme un champ statique de votre classe de page, car il sera partagé entre les sessions parce que le cycle de vie d'une variable statique dans ASP.NET est dans la vie de la appdomain, pensez à le stocker dans le ViewState:

private Hashtable ddl_ht 
{ 
    get 
    { 
     return ViewState["ddl_ht"] as HashTable; 
    } 
    set 
    { 
     ViewState["ddl_ht"] = value; 
    } 
} 
+0

Ce code devrait probablement être changé en stockage de la hashtable si elle est créée. – sisve

+0

@Simon: Vous avez raison, mais peut-être qu'il est plus facile de retourner null si l'objet n'est pas sur ViewState, et de fournir un setter ... vérifier l'édition ... – CMS

+0

Merci pour l'exemple de code. Cette solution a fonctionné avec quelques tweaks! Voici ce que je devais faire d'autre qui est assez basique. Dans mon PageLoad, j'ai initialisé ddl_ht puis dans la méthode SelectedIndexChanged j'ai dû convertir la clé en un type entier. C'était pourquoi currentItem était nul. – salvationishere

3

Vous allez avoir toutes sortes de problèmes de threading avec cette configuration. Votre hashtable est statique, et chaque hit sur votre site va créer une nouvelle instance de votre classe sur un nouveau thread qui essaiera d'accéder à la même hashtable - et puisque chaque nouveau hit de la page appellera initialement CreateDropDownLists, votre hashtable être réinitialisé pour chaque nouvel utilisateur de la page.

Questions connexes