2009-05-29 3 views
2

リピーターがあるページがあります。ユーザーが自分のWebControlボタンをクリックすると、そのボタンのイベントハンドラがFindControlを使用してリピータ内のアイテムを繰り返し、コントロールの値の一部が使用されるように、イベントハンドラを作成しています。しかし、ページがロードされた後、リピーターアイテムが入力されたように見えますが、ボタンをクリックしてこれをポストすると、リピーターアイテムを反復すると、それらはすべて空であることがわかります。私はシーケンシングを完全に理解していませんが、私の反復コードがまだ設定されていないRepeaterItemにアクセスしようとしていると仮定しています。EventHandler内のRepeaterItemコントロールへのアクセス

リピータコードは、私のOnLoadメソッドにあります。それ以外では、イベントハンドラをクリックしてそれらのアイテムを繰り返し処理しようとしています。

protected void MyButton_Click(object sender, EventArgs e) 
{ 
    foreach(RepeaterItem item in MyRepeater.Items) 
    { 
     MyLabel = (Label)item.FindControl("MyLabel"); 
    } 
} 

ボタンがリピータのFooterTemplateの中に位置しています:これは私が何をしようとしていたものを、本質的です。

<asp:Button runat="server" OnClick="SubmitChecklist_Click" cssclass="BlueSubmit" id="SubmitChecklist" text="Submit" /> 

ありがとうございます。

編集:明確にするために、私は取得しています正確なエラーがあるとNullReferenceException、私は、例えば、何かをしようとすると、Response.Writeを(MyLabel.Text)

編集:より今日に探した後、これは私が起こっていることを理解しているものです:リピータはポストバックでデータバインドされています。生成されたドロップダウンリストから選択してボタンを押すと、再びポストバックされます。この時点で、リピータは初期値に再びデータバインドされます。したがって、ユーザーの選択を得るためにポストバックする必要がある場合、ボタンのイベントハンドラーでこれを実行して、リピーターが再びデータバインドされる前に選択した値を取得できるようにするにはどうすればよいですか?

+0

イベントハンドラを配線する場所はどこですか?投稿したコードは問題ありません。設定されていない項目の問題です。 –

+0

オブジェクトの送信者から情報を取得できますか? – jrcs3

+0

私はResponse.Writeハッシュコードを送信者からできるようになったので、私はそう仮定します。 –

答えて

0

私のOnLoadでIsPostBackに頼るのではなく、ユーザーが最初のオプションを選択した後で、OnLoadのIsPostBackに頼るのではなく、リピーターのデータバインディングを入れて、 。これはちょっと複雑でしたが、私は今度はこれを正しい方法でやっていると思います。

3

問題は、負荷のあるリピータにデータをバインドしている可能性がありますが、最初にポストバックではないことを確認することはできません。

例:

  1. あなたがページを要求します。負荷発火時。リピータにデータをバインドします。
  2. あなたは、レパートリーのデータを操作して、あなたのボタンをクリックします。
  3. ページは、ポストバックでリフレッシュされ、onloadイベントを発生させます。データはリピータにリバウンドされ、入力された以前のすべてのデータは無効になりました。
  4. onclickイベントがトリガされ、コードはもはや存在しない値を取得しようとします。

必ずあなたのonLoadイベントで、あなたのデータバインディングコードが、私は同じことを見てきましたポストバックチェック

if (!Page.IsPostBack) 
{ 
    Repeater.DataSource = Datatable; 
    Repeater.DataBind(); 
} 
+0

これは問題がどこにあるのかと思う。 if(Page.IsPostBack){}でデータバインディングが発生しています。ページがポストバックでない場合、私はドロップダウンリストを表示します。ユーザーはアイテムを選択し、送信を押してポストバックを送ります。ポストバックの中で、私はリピータをユーザの選択に基づいてデータバインドしています。リピーターには入力項目が含まれているため、footeremplateにasp:Buttonがあり、そのボタンのイベントハンドラーでは、リピーターから入力された値を使用したいと考えています。 –

+0

アイテムを繰り返し処理するときに、ヘッダーまたはフッターにアクセスしようとしていないことを確認していますか。各アイテムのItemTypeプロパティをチェックして、ListItemまたはAlternateItemであり、HeaderItemまたはFooterItemではないことを確認します(この例ではオブジェクト名をビットオフにしてもかまいません)。 –

0

内にネストされていることを確認。私は理由を理解していませんが、実際にすべてのイベントが発生するまでデータは実際にバインドされません。私はクラスレベルでデータソースを利用できるようにしてからインデックスを作成しました。

private DataTable myTable; 
protected void Page_Load(object sender, EventArgs e) 
{ 
    //populate dataTable 
    if (!IsPostBack) 
    { 
     //databind to repeater 
    } 
} 

protected void Submit_Click(object sender, EventArgs e) 
{ 
    foreach (RepeaterItem item in repeater1.Items) 
    { 
     DataRow row = myTable.Rows[item.ItemIndex]; 
    } 
} 

理想?確かに動作しませんが動作します。

+0

実際には機能しています。 OnLoad内でIsPostBackに頼るのではなく、月を選択した後の2つの異なる州の2つの別々のイベントハンドラーを作成しました。 –