我一直试图弄清楚如何做一段时间,因为我创建的图像按钮的ID('titanBtn')在我的代码隐藏文件中无法识别。这将允许我简单地写'titanBtn.ImageUrl =',但唉,后面的代码说它不存在。
我试图用这个代码做的就是从Db读取一个字符串,它指定图像的文件名(相应的图像以每个对象的元素类型命名),并将它放在一个连接中指定ImageUrl的字符串。
<asp:Repeater ID="titanRptr" runat="server">
<ItemTemplate>
<table>
<tr class="tr1">
<td><%# Eval("TitanName") %></td>
<td>
<asp:ImageButton ID="titanBtn" runat="server" Width="100px" Height="100px" OnClick="titanBtn_Click" />
</td>
<td>Level: <%# Eval("char_lvl")%>
<br />
Step: <%# Eval("step")%>
<br />
</td>
</tr>
</table>
</ItemTemplate>
</asp:Repeater>
背后的代码
using (SqlCommand cmd2 = new SqlCommand("getElement", conn))
{
cmd2.CommandType = CommandType.StoredProcedure;
cmd2.Parameters.AddWithValue("@uid", titanElement);
using (SqlDataAdapter sda = new SqlDataAdapter(cmd2))
{
SqlDataReader reader;
conn.Open();
reader = cmd2.ExecuteReader();
while (reader.Read())
{
titanImage = Convert.ToString(reader["Element"]);
titanBtn.ImageUrl = "images/" + titanImage+ ".gif"; //"The name 'titanBtn' does not exist in the current context"
titanRptr
}
conn.Close();
}
}
答案 0 :(得分:1)
您可以访问ItemDataBound
事件中每个项目的ImageButton:
protected void titanRptr_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
ImageButton titanBtn = e.Item.FindControl("titanBtn") as ImageButton;
...
}
但是,如果您可以直接在转发器的数据源中获取Element
数据,则可以在标记中执行此操作:
<asp:ImageButton ID="titanBtn" runat="server" ImageUrl='<%# "images/" + Eval("Element") + ".gif" %>' ... />
答案 1 :(得分:1)
您的ImageButton位于Repeater内部,因此ID无法访问。
但是,您可以使用FindControl
来获得此控件,并且(至少)有两种方法可以解决此问题。
在Repeater上,您可以将事件附加到ItemDataBound(<asp:Repeater ID="titanRptr" runat="server" OnItemDataBound="titanRptr_ItemDataBound">
),然后为转发器的每一行执行任务,因为它是数据绑定的。例如......
protected virtual void titanRptr_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
{
ImageButton titanBtn = (ImageButton)e.Item.FindControl("titanBtn");
//etc etc
//get any values you need (eg)
int something = (int)DataBinder.Eval(e.Item.DataItem, "something");
或者你可以在数据绑定之后循环遍历转发器并访问每一行并找到控件,例如......
foreach (RepeaterItem row in titanRptr.Items)
{
ImageButton titanBtn = (ImageButton)row.FindControl("titanBtn");
//etc etc
}