2011-10-05 24 views
8

GridViewには、BoundFieldsと2つのTemplateFieldsがあります。この2つのTemplateFieldsでは、ユーザーが変更できるDropDownListTextBoxを含むUserControlsを動的に作成します。ポストバック後に動的列が消える

PostBackの後にコントロールの値を取得しようとすると、BoundFieldsの値はそのまま残りますが、ダイナミックコントロールが表示されなくなります。私は再びそれらを作成することができますが、それはユーザーの値を取得しません...どのようにそれらが失われる前にこれらの値を得ることができますか? RowDataBoundイベントで

:ここ

は私のコードの一部です私のボタンのクリックイベントで

Select Case type 
    Case "BooleanBis" 
     e.Row.Cells(2).Controls.Clear() 
     Dim list1 As BooleanBisList = New BooleanBisList(avant, False) 
     e.Row.Cells(2).Controls.Add(list1) 

     e.Row.Cells(4).Controls.Clear() 
     Dim list2 As BooleanBisList = New BooleanBisList(apres, True) 
     e.Row.Cells(4).Controls.Add(list2) 
    Case "Boolean" 
     e.Row.Cells(2).Controls.Clear() 
     Dim list3 As BooleanList = New BooleanList(avant, False) 
     e.Row.Cells(2).Controls.Add(list3) 

     e.Row.Cells(4).Controls.Clear() 
     Dim list4 As BooleanList = New BooleanList(apres, True) 
     e.Row.Cells(4).Controls.Add(list4) 
End Select 

、私は、ユーザーコントロールを取得しよう:

Case "String" 
    temp.ChampValeurApres = DirectCast(Tableau1.Rows(i).Cells(selectedColumn).Controls(1), TextBox).Text 

が、私はそれが存在しないというエラーを得る。

答えて

8

GridViewが、それはDataSourceだバウンドますときRowDataBoundにのみ発動するのに対し、このイベントは、すべてのポストバックにトリガーされますので、あなたはRowCreatedの代わりRowDataBoundでダイナミックなコントロールを作成する必要があります。

ダイナミックに作成されたコントロールは、以前と同じIDを持つすべてのポストバックで再作成する必要があり、その値はViewStateに保持され、イベントは正しく発生します(例:DropDownListのSelectedIndexChangedイベント)。

だから、RowCreatedでそれらを作成し、(DropDownListデータソース/アイテムまたはTextBox -Textをf.e.)RowDataBoundでそれらを「埋める」必要があります。

+0

ありがとうございます!私はまだ問題がある、私は読み取り専用のコントロールを持つ列を持っています。これらのコントロールの値はポストバック後には取得されません。何か案が ? – user874854

+0

@ user874854: 'readonly'コントロールは、ViewStateのclientsideの変更を維持しません(serversideの変更のみ)。 [Attributes](http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.webcontrol.attributes.aspx)-collectionを介してそれらを 'readonly'にします。たとえば、' TextBox1.Attributes .Add( "readonly"、 "readonly"); '。この方法で、あなたはASP.NETをだます。詳細はこちら[こちら](http://www.codeproject.com/KB/aspnet/Readonly.aspx)をご覧ください。 –

0

私が使用していました:GridView属性で

EnableViewState="false" 

を。それを取り除くことは私の問題を解決しました!

関連する問題