【问题标题】:Specifying Image Button image URL in code behind of asp.net page?在 asp.net 页面后面的代码中指定图像按钮图像 URL?
【发布时间】:2016-05-27 09:14:57
【问题描述】:

我一直在尝试弄清楚如何执行此操作,因为我创建的图像按钮的 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();
                        }
                    }

【问题讨论】:

    标签: c# asp.net code-behind


    【解决方案1】:

    您的 ImageButton 位于中继器内,因此无法通过 ID 访问。

    但是,您可以使用FindControl 来获得此控制权,并且(至少)有两种方法可以解决此问题。

    在您的中继器上,您可以将一个事件附加到 ItemDataBound (&lt;asp:Repeater ID="titanRptr" runat="server" OnItemDataBound="titanRptr_ItemDataBound"&gt;),然后对中继器的每一行执行任务,因为它是数据绑定的。比如……

    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
    
    }
    

    【讨论】:

      【解决方案2】:

      您可以在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" %>' ... />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-25
        • 2013-06-20
        • 2011-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多