DataBinding与循环

时间:2009-07-17 13:53:37

标签: asp.net data-binding

  

可能重复:
  Using ASP.NET Controls without databinding

My previous question收效率很低,所以我想我会重新提问并重试。

foreach (XXX x in TTTT){ %>
       <tr>
           <td><%=x.val %></td>
               <asp:ImageButton runat="server" CommandName="uiImgResolve_Click"
               CommandArgument='<%=X.pkid%>' ImageUrl="../images/IMG.png"/>
     <% } %>

这不起作用,因为我无法在任何设置了RUNTAT属性的控件中设置值。给每行一个值的最佳方法是什么,所以当点击事件发生时,我可以读取点击项目的值,我不能把值放在查询字符串上,我不能使用asp.net数据绑定。

我正在做的事情比这复杂得多,数据绑定不起作用。

PERHAPS问一个更好的问题是,无论如何使用上面的循环机制仍然保持链接到控件代码隐藏的方法?

3 个答案:

答案 0 :(得分:3)

我建议您查看ASP repeater control。它提供了一个ItemDatabound事件,允许您操作正在动态生成的内容。

答案 1 :(得分:0)

将代码混合到您的标记中确实与ASP.Net服务器控件一起使用。有几个更好的选择。这是一个:

标记:

<table>
  <asp:Placeholder id="RowPlaceholder" runat="server" />
</table>

代码背后:

foreach (MyObject x in TT)
{
   Literal l1 = new Literal();
   l1.Text = string.Format("<tr><td>{0}</td><td>", x.val);

   ImageButton b = new ImageButton();
   b.ImageUrl = "../images/IMG.png";
   b.CommandArgument = x.pkid;
   b.CommandName = "uiImgResolve_Click";  // maybe do this a little differenlty

   Literal l2 = new Literal();
   l2.TExt = "</td></tr>";

   RowPlaceholder.Controls.Add(l1);
   RowPlaceHolder.Controls.Add(b);
   RowPlaceHodler.Controls.Add(l2);

}

答案 2 :(得分:0)

Repeater甚至GridView可能正常工作。但是需要执行OnRowCommand。 像帕迪所说的那样绝对清洁。

ASPX

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowDataBound="GridView1_RowDataBound">
    <Columns>
        <asp:BoundField DataField="val" />
        <asp:TemplateField>
            <ItemTemplate>
                <asp:ImageButton ID="Button1" runat="server" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

代码隐藏:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        GridView1.DataSource = TTTT;
        GridView1.DataBind();
    }
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType != DataControlRowType.DataRow)
        return;

    XXX x = (XXX)e.Row.DataItem;
    ImageButton btn = (ImageButton)e.Row.FindControl("Button1");
    btn.CommandArgument = x.pkid;
    btn.ImageUrl = "../images/IMG.png";
}