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问一个更好的问题是,无论如何使用上面的循环机制仍然保持链接到控件代码隐藏的方法?
答案 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";
}