2011-02-01 16 views
0

SharePoint WebコントロールLookupFieldコントロールを使用してVS2010(LayoutsPageBaseから継承)で単純なaspxページとしてカスタム編集フォームを作成しました。カスタム型SharePoint 2010のWebコントロール - ポストバック時にLookupFieldの値が設定されていない

からの値ControlModeが

(私は編集するには、この設定を明示的試みているが)FormContextと同じに設定された値

の予想される範囲を含むドロップダウンボックスで正しくフォームが表示されます

ポストバックでは、ドロップダウンリストの値が設定されていません - 選択した項目インデックスが-1に設定されています

LookupFieldコントロールを使用して、ユーザーから選択した値を正しく取得するにはどうすればよいですか?

aspxでコントロールのdeclaritivlyを追加してから、ページのロードイベントのSPContextからリストのIDなどを設定することができますか?で

<SharePoint:FileField ID="FileNameText" InputFieldLabel="Name" runat="server" ControlMode="Display"/><br /> 
<SharePoint:LookupField ID="FeedType" runat="server" /> 
<SharePoint:TextField ID="FeedStatus" runat="server" /> 

....:

ASPXから: - (きれいしかし、ちょうどそれがこの時点で動作するように取得しようとしていない)以下のコードを参照してくださいページのロードの背後にあるコード:

if (!IsPostBack) 
      { 
       SPItem feedFileItem = SPContext.Current.Item; 
       FileNameText.ControlMode = SPContext.Current.FormContext.FormMode; 
       FileNameText.ListId = SPContext.Current.ListId; 
       FileNameText.ItemId = SPContext.Current.ItemId; 
       FileNameText.FieldName = "Name"; 

       FeedType.ControlMode = SPControlMode.Edit; 

       FeedType.ListId = SPContext.Current.ListId; 
       FeedType.ItemId = SPContext.Current.ItemId; 
       FeedType.FieldName = "FeedType"; 

       FeedStatus.ItemContext = SPContext.Current; 
       FeedStatus.RenderContext = SPContext.Current; 
       FeedStatus.ControlMode = SPControlMode.Edit; 
       FeedStatus.ListId = SPContext.Current.ListId; 
       FeedStatus.ItemId = SPContext.Current.ItemId; 
       FeedStatus.FieldName = "FeedStatus"; 
      } 

UPDATE

私はフォームコントロールをCreateChildControlsのオーバーライドのコードの背後に追加することでフォームを取得できました。これはネット上で見たサンプルの大部分と一致しています。

しかし、誰かが私のアプローチがうまくいかなかった理由と、これをaspxの宣言的な方法ですべて実行できるかどうかを説明することができますか?

+0

ポストバックのような音はリストを再バインドしていますが、コードを投稿できますか? – djeeg

+0

サンプルコードが追加されました – Richard

答えて

2

リストコントロールで選択された値は、リストコントロールに値が設定されていないと単純に無視されます。したがって、アイテム2を選択してリストアイテムがnullの場合、レスポンスパラメータは無視され、Valueプロパティは設定されません。これは、ProcessPostDataがLoadDataの前に発生するためです。 !IsPostBackをLoadDataメソッドで削除したとしても、ProcessDataがまだLoadDataより前に発生していて、ポストバックを処理する前にリストをロードしていないため、IsPostBackを削除することはできません。

これを簡単に修正するには、初期化コードをアプリケーションページのEnsureChildControlsメソッドに移動します。

protected override void EnsureChildControls() 
{ 
    base.EnsureChildControls(); 

    ... 
    FeedType.ControlMode = SPControlMode.Edit; 

    FeedType.ListId = SPContext.Current.ListId; 
    FeedType.ItemId = SPContext.Current.ItemId; 
    FeedType.FieldName = "FeedType"; 
    ... 
} 
関連する問題