2011-01-21 14 views
0

ドロップダウンメニューがあり、選択されている項目に基づいてWebサービスを呼び出していくつかのテキストボックスを動的に作成します。プログラムで作成されたASP.NET TextBoxは、コントロールがクリアされてもポストバック後のテキスト値を保持します

初めてメニューをドロップして項目を選択すると、完全に機能し、テキストボックスが作成され、動的に取り込まれます。しかし、次回(最初のポストバックの後に)メニューをドロップダウンし、別のものを選択します... 2回目のポストバックの後、元の値はテキストボックスに残ります。

プレースホルダからすべてのテキストボックスを消去してから再作成し、NEW値を設定すると、OLD値をどのように保持できますか? ?

注:2回目の作成時に、テキストボックスIDは同じになります。それはそれと関係がありますか?この重複ID機能をサポートする必要があります。 Page_Loadから呼び出さ

私のコード、次のとおりです。

Private Sub RefreshEntity() 

     Dim XmlRecords As New XmlDocument 
     Dim XmlRecordsNode As XmlNode 
     Dim EntityType As String = EntityTypes.SelectedValue 
     Dim Entity As String = RecordValue.Value 
     Dim FieldName As String 
     Dim FieldValue As String 

     FieldPlaceHolder.Controls.Clear() 

     If RecordList.SelectedValue <> "Select..." Then 
      Try 
       XmlRecordsNode = LoginInfo.SharePointConnectWebService.GetMetaData(LoginInfo.WSUser, LoginInfo.WSPass, _ 
                        EntityType, Entity) 
       XmlRecords.LoadXml(XmlRecordsNode.OuterXml) 
      Catch ex As Exception 
       ConfirmLabel.Text = "<b>Error:</b><br>" & ex.Message.ToString 
       Return 
      End Try 
     Else 
      SetProperties.Visible = False 
      Return 
     End If 

     For Each OneNode As XmlNode In XmlRecords.SelectNodes("Fields").Item(0).ChildNodes 

      FieldName = OneNode.Name 
      FieldValue = OneNode.InnerText 

      Dim newLabel As Label = New Label() 
      newLabel.Text = FieldName & ": " 

      Dim newTextBox As TextBox = New TextBox() 
      newTextBox.ID = "Field-" & FieldName 
      newTextBox.Text = FieldValue 

      Dim newLine As Label = New Label() 
      newLine.Text = "<br><br>" 

      FieldPlaceHolder.Controls.Add(newLabel) 
      FieldPlaceHolder.Controls.Add(newTextBox) 
      FieldPlaceHolder.Controls.Add(newLine) 

     Next 

     SetProperties.Visible = True 

    End Sub 

(より多くのコードを追加するために編集した)とRecordValue.Valueは、すべてをPage_Loadに移入されます隠しフィールドです:

   RecordValue.Value = RecordList.SelectedValue 

ここでRecordListは私のドロップダウンメニューです。

+1

このコードをPage_Initイベントに移動すると、同じ動作が発生しますか? – TheGeekYouNeed

+0

これはドロップダウンリストの選択された項目に依存する場所がわかりません。なぜ選択項目に基づいてこれが異なるのかわかりません...何が欠けていますか? – David

+0

@ TheGeekこれをPage_Initに入れた場合、コントロールは表示されません – Dave

答えて

0

これは、おそらく、ViewStateまたは投稿された値が値を破っているためです。

コントロールがコントロールコレクションに動的に追加されると、既に起動されたすべてのページライフサイクルイベントに追いつく必要があります。ポストバックの場合、これは、コントロールのコレクションにダイナミックコントロールを追加し、.textプロパティを設定する順序に基づいて、ViewStateおよび/またはポストされたフォームの値がTextBoxの.textプロパティを壊すことを意味します。

これを修正するには、動的に生成するコントロールで.EnableViewStateプロパティをfalseに設定してViewStateを無効にすることができます。また、プロパティを設定する前にコントロールをコントロールコレクションに追加します。

For Each OneNode As XmlNode In XmlRecords.SelectNodes("Fields").Item(0).ChildNodes 

    FieldName = OneNode.Name 
    FieldValue = OneNode.InnerText 

    Dim newLabel As Label = New Label() 
    Dim newTextBox As TextBox = New TextBox() 
    Dim newLine As Label = New Label() 

    newTextBox.ID = "Field-" & FieldName 

    newLabel.EnableViewState = False 
    newTextBox.EnableViewState = False 
    newLine.EnableViewState = False 

    FieldPlaceHolder.Controls.Add(newLabel) 
    FieldPlaceHolder.Controls.Add(newTextBox) 
    FieldPlaceHolder.Controls.Add(newLine) 

    newLabel.Text = FieldName & ": " 
    newTextBox.Text = FieldValue 
    newLine.Text = "<br><br>" 

Next 
+0

Aaron、以前はEnableViewStateをfalseに設定しようとしましたが、注文を切り替えることはしませんでした。残念ながら、上記のコードは同じ結果をもたらします。 TextBoxが同じIDを取得しても問題ありませんか?私が紛失しているものがある必要があります... – Dave

+0

プレポストバックのTextBoxがFieldPlaceHolderに再追加され、.Textの更新が固執していないようです。 – Dave

+0

また、 FieldPlaceHolderも...幸運はありません。 – Dave

-1

セッション変数に値を格納しておらず、コードの後ろのテキストボックスに戻していませんか?

+0

いいえ、セッション変数に値を格納しません。 – Dave

+0

私はドロップダウンの値を隠しフィールドに格納します。これは、ページが読み込まれるときにドロップダウンも動的に読み込まれるためです。 – Dave

関連する問題