2009-05-22 14 views
1

私は作業しているリピーターを利用してフォームを演奏していますが、現在はリピーター内の特定のコントロールの値を取得するイベントハンドラーを作成しようとしていますリピータを含むフォームが提出された後。私は最初のリピーターアイテムからラベルを取得したい場合は、これに似た何かがうまくいくことを想定し、その後、別のラベルのテキストにそのテキストを設定します。しかし、これを使用してFindControl関数のヘルプが必要

protected void SubmitMessage_Click(object sender, EventArgs e) 
{ 
    Label MyLabel = (Label)MyRepeater.Items[0].FindControl("MessageID"); 
    MyLabel2.Text = MyLabel.Text; 
} 

、それはと思われるmylabelという。テキストは空です。 MyLabelが設定された後にMyLabelがnullであるかどうかをテストすると、結果はfalseになります。なぜならMyLabelが設定しようとしているリピート項目にMyLabelの内容と同じ内容を持たない理由を理解しようとしています。 MyLabel2はすでにクラスの先頭に宣言されています。前もって感謝します。

EDIT:.aspxファイル内のラベルのテキストは、text属性内ではなく、ラベル自体のコンテナ内にデータバインドされていません。私は火曜日の朝に、ベンジャミンの提案で自分のコードの中に戻ってすぐに、他の方法を試してみるでしょう。

+0

Lush、HTML/ASPXのスニペットを投稿して、これをどのように生成しているかを表示できますか? –

+0

実際にURLや生のHTML出力を投稿できるのであれば、私は多くのことを伝えることができます。私はFireBugを使用して、情報が画面にどのように出力されたかを確認します。それとクイックウォッチの間に何かを見つけるのは簡単です –

+0

出力HTMLは空のスパンです。 –

答えて

2

バインド方法リピータのラベルにデータを保存します。

<asp:Repeater ID="Repeater1" runat="server"> 

<ItemTemplate> 

    <asp:Label ID="Label1" runat="server"><%# DataBinder.Eval(Container.DataItem,"CustomerName") %></asp:Label> 

    <asp:Label ID="Label2" runat="server" Text=<%# DataBinder.Eval(Container.DataItem,"Country") %>></asp:Label> 

    </ItemTemplate> 
</asp:Repeater> 

Label1のテキスト属性が設定されておらず、データ は、ラベルの体内のコントロールにクライアント側で拘束されています。 は、ラベルがページにレンダリングされた後にspanタグに書き込まれ、ラベルコントロールに直接関連付けられません。これは、Labelの本文でインラインスクリプトを使用する場合にのみ発生し、単なるテキストの場合は、ラベルの本文が常にLabelのText Attribute値を上書きします。 Label2をするために

テキスト属性は、その結合が、それはラベルのレンダリング終了し、したがって、あなたの他のコントロールによってアクセス可能である前に、インラインスクリプトを評価するためにそれを強制的にサーバー上で行われている に設定されています。

あなたのリピータを実際に見ることなく、私はあなたのデータがどのようにバインドされているか疑いがあります。

このケースをあなたに証明するためのテストコードです。

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      DataSet ds = new DataSet(); 
      DataTable dt = ds.Tables.Add("Customer"); 
      dt.Columns.Add("CustomerName", Type.GetType("System.String")); 
      dt.Columns.Add("Country", Type.GetType("System.String")); 

      DataRow dr = dt.NewRow(); 
      dr[0] = "Testcustomer1"; 
      dr[1] = "USA"; 
      dt.Rows.Add(dr); 

      dr = dt.NewRow(); 
      dr[0] = "Testcustomer2"; 
      dr[1] = "UK"; 
      dt.Rows.Add(dr); 

      dr = dt.NewRow(); 
      dr[0] = "Testcustomer3"; 
      dr[1] = "GERMANY"; 
      dt.Rows.Add(dr); 

      dr = dt.NewRow(); 
      dr[0] = "Testcustomer4"; 
      dr[1] = "FRANCE"; 
      dt.Rows.Add(dr); 

      //Bind the data to the Repeater 
      Repeater1.DataSource = ds; 
      Repeater1.DataMember = "Customer"; 
      Repeater1.DataBind(); 
     } 

    } 

    protected void SubmitMessage_Click(object sender, EventArgs e) 
    { 
     Label MyLabel = (Label)Repeater1.Items[0].FindControl("Label1"); 
     Label MyLabel2 = (Label)Repeater1.Items[0].FindControl("Label2"); 
     //Empty String Text was never set server side 
     Label3.Text = MyLabel.Text; 
     //String is found because Text was set 
     Label4.Text = MyLabel2.Text; 
    } 

プラグインして余分なラベルを追加すると、Label3が空のときにLabel4に探しているデータが表示されます。

+0

DataBindingは、Page_Load(またはその他)の後、次のPage_load(またはその他)の前に発生しています...? –

+0

データはリピータにあり、ページに表示されますが、ラベルテキスト属性が明示的に設定されておらず、ラベルの本文にデータが配置されている場合、ラベル自体は決して真にバインドされません。 ラベルはこのような方法で設定するものではありません。この場合、ラベルはその理由がわかります。 – benjamin

+0

しかし、(テキスト属性内ではなく)ラベル内のデータの設定は、サーバー側ではなくクライアント側でどのように行われますか。それはブラウザがこれを行うためにjavascriptなどを生成しなければならないことを暗示していませんか?私は私の前にコードを持っていないので、私は主張をしていないが、私が理解するように、すべてのインラインスクリプトはサーバー側で処理されます。 –

0

私はこれについてはわかりませんが、イベントが実行されると、リピータはまだ再投入されていない可能性があります。メソッドの呼び出しがByRefではなくByRefであるため、値が渡される可能性がありますが、元のオブジェクトにはまだデータが設定されていません。ちょっと考えて...

+0

遅い夜といくつかのビールので、あまりにも難しいと判断しない...;) –