2009-07-26 78 views
1

我正在使用哈希表来存储键值对,并且我在方法CreateDropDownLists()中初始化此哈希表(ddl_ht)。但是,当我在我的SelectedIndexChanged方法中检查“currentItem”的值时,此值为null。虽然我在监视窗口中选中的C#哈希表不保留值

(串)ddl_ht [键[1]

值,并将其显示值(NOT NULL)。你明白为什么这个currentItem是空的吗?

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; 
     } 

    } 
} 

回答

1

你不应该将哈希表保存您的网页类的静态字段,因为它会在会话之间共享,因为在ASP.NET中的静态变量的生命周期是在AppDomain的生活中,考虑将其存储在ViewState中:

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

如果创建了该代码,可能应该将其更改为存储哈希表。 – sisve 2009-07-26 05:30:34

3

您将在此设置中遇到各种线程问题。你的散列表是静态的,并且你的网站上的每一个命中将会在一个新的线程上创建你的类的一个新实例,这个新线程将尝试访问相同的散列表 - 并且由于每个页面的新命中最初将调用CreateDropDownLists,你的散列表将会对每个新用户重新初始化到页面。