2009-07-26 5 views
1

ハッシュテーブルを使用してキーと値のペアを格納していて、CreateDropDownLists()メソッドでこのハッシュテーブル(ddl_ht)を初期化しています。しかし、SelectedIndexChangedメソッドで "currentItem"の値をチェックすると、この値はnullになります。私は私のウォッチウィンドウにC#Hashtableに値が保持されない

(文字列)ddl_ht [キー[1]]

の値をチェックし、それは、値(nullではない)を示しているにもかかわらず。なぜこのcurrentItemがnullであるのか理解していますか?

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での静的変数のライフサイクルは、アプリケーションドメインの生活の中にあるので、それはセッション間で共有されますので、あなたは、あなたのページクラスの静的フィールドとして、あなたのハッシュテーブルを保存しないでください、 ViewStateに格納することを検討してください。

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

ハッシュテーブルが作成されている場合は、このコードを変更する必要があります。 – sisve

+0

@Simon:あなたはそうですが、オブジェクトがViewStateにない場合はnullを返し、セッターを提供します...編集を確認してください... – CMS

+0

サンプルコードありがとうございました。このソリューションは、いくつかの調整を行いました!ここで私はかなり基本的なやり方があります。私のPageLoadでは、ddl_htを初期化し、次にSelectedIndexChangedメソッドでキーを整数型に変換しなければなりませんでした。これがcurrentItemがnullだった理由です。 – salvationishere

3

このセットアップでは、すべての種類のスレッドの問題が発生します。あなたのハッシュテーブルは静的であり、あなたのウェブサイトのすべてのヒットは、同じハッシュテーブルにアクセスしようとする新しいスレッド上にあなたのクラスの新しいインスタンスを作成するでしょう - そして、ページへの新しいヒットが最初にCreateDropDownListsを呼び出すので、ページへの新規ユーザーごとに再初期化する必要があります。

関連する問題