2011-11-12 16 views
6

私はASP.Netにはかなり新しく、正しい方法を考えているのか分かりません。私は "イメージ"オブジェクトのリストにバインドされているリピーターを持っています。各RepeaterItem内にはチェックボックスがあり、チェックされたImageオブジェクトのいくつかの属性を表示するボタンOnClickイベントがあります。ASP.Net - RepeaterItemからデータを取得する

ラベルは更新されますが、メタデータは空白です。 DataBinder.Eval(i.DataItem、 "FileName")がnullに戻ってきていますが、なぜその理由がわかりませんか?おそらく、チェックボックスからのポストバックが問題を引き起こしていると思ったが、ポストバックが発生する前にデータを表示しようとすると同じ問題が発生するので、属性を正​​しく取得していない可能性があります。それとも、私は完全に間違った方法でこれについて行きますか?どんな助けもありがたい。

コード:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     string importPath = Server.MapPath("~/Images/ForImport"); 
     ImageProcessor processor = new ImageProcessor(importPath); 

     rptImageList.DataSource = processor.ImageList; 
     rptImageList.DataBind(); 
    } 
} 

protected void btnImport_Click(object sender, EventArgs e) 
{ 
    foreach (RepeaterItem i in rptImageList.Items) 
    { 
     CheckBox chk = i.FindControl("chkSelectImage") as CheckBox; 
     if (chk.Checked) 
     { 
      Testlabel.Text += "Selected: " + DataBinder.Eval(i.DataItem, "FileName"); 
     } 
    } 
} 

HTML:

<asp:Repeater ID="rptImageList" runat="server"> 
    <ItemTemplate> 
    <div class="photoinstance"> 
     <asp:Image runat="server" ImageUrl='<%#"Images/ForImport/" +DataBinder.Eval(Container.DataItem, "FileName") %>' /> 
     <asp:CheckBox ID="chkSelectImage" AutoPostBack="true" runat="server"/> 
     <p><%#Eval("FileName")%> - <%#Eval("FileSize")%> bytes</p> 
     </div> 
    </ItemTemplate> 
</asp:Repeater> 
+1

'DataItem'プロパティは、' ItemDataBound'イベントのポストバックの前にのみ使用できます。これはMSDNではうまく指摘されていませんが、すべてのASP.NETコントロールで一貫しています – jwiscarson

答えて

8

i.DataItemが利用できないが、btnImport_Clickで(nullである)私が正しく、イベント名リコール場合(のみItemDataBoundイベントで入手可能です)。
HiddenFieldを使用してFileNameを保存すると、i.FindControlを呼び出す必要があります。

0

この質問は、ポストバック時にリピータからデータを取得する方法、具体的にはリピータ内にあるCheckBoxとやりとりする方法を尋ねていると思います。したがって、別のコントロールのポストバックでは、これを行う方法の例があります。

protected void CheckBox_CheckedChanged(object sender, EventArgs e) 
    { 
     foreach (RepeaterItem ri in Repeater.Items) 
     { 
      foreach (Control c in ri.Controls) 
      { 
       if (typeof(CheckBox) == c.GetType()) 
       { 
        CheckBox checkBox = (CheckBox)c; 
        checkBox.Checked = true; 
       } 
      } 
     } 
    } 
関連する問題