从Repeater ItemTemplate服务器端获取控制权

时间:2012-08-30 21:25:55

标签: c# asp.net itemtemplate asprepeater

我正在尝试使用转发器制作一张桌子。然而,在转发器中的项目中,div表示我需要实现一些特定控件的逻辑。

我已经尝试了this但是它无效了,我得到了:

  

异常详细信息:System.NullReferenceException:不是对象引用   设置为对象的实例。

     

来源错误:

Line 35:         HtmlGenericControl myDiv = (HtmlGenericControl)e.Item.FindControl("RepeaterBG");
Line 36: 
Line 37:         myDiv.Style.Add("background-color","green");
Line 38:     }
Line 39: }
  

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

我的Html是:

<asp:Repeater runat="server" ID="MyStudents"
        OnItemDataBound="rptArticleContent_ItemDataBound">
            <HeaderTemplate>
                <table><tr>
            </HeaderTemplate>
            <ItemTemplate> 

                <td>
                    <div  runat="server" ID="RepeaterBG" > helli there</div>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
                </td>
                <td>
                    <asp:Label ID="Label2" runat="server" Text='<%# Bind("RegistrationDate") %>'></asp:Label>
                </td>
                <td>
                    <asp:Label ID="Label3" runat="server" Text='<%# Bind("Email") %>'></asp:Label>
                </td>

            </ItemTemplate>
            <FooterTemplate>
                </tr></table>
            </FooterTemplate>
        </asp:Repeater>

我的.CS

protected void rptArticleContent_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    Label lb = new Label();
    lb.Text = "</tr><tr>";
    e.Item.Controls.Add(lb);

    HtmlGenericControl myDiv = (HtmlGenericControl)e.Item.FindControl("RepeaterBG"); // i get null here, it seems to not find it at all!
    myDiv.Style.Add("background-color","green"); // problem here
}

我哪里出错?!

3 个答案:

答案 0 :(得分:2)

您应该检查项目类型,而不是“在标题中搜索”,例如

protected void rptArticleContent_ItemDataBound(object sender, RepeaterItemEventArgs e)
    if (e.Item.ItemType == ListItemType.Item ||
        e.Item.ItemType == ListItemType.AlternatingItem) {
        // search for control here
    }
}

答案 1 :(得分:1)

您需要检查并确保您的商品是数据商品。如果您在发布的示例链接中看到,则ItemDataBound事件中的第一行是:

if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType !=   
       ListItemType.AlternatingItem) return;

IIRC,那是因为ItemDataBound事件中的第一项是标题项。您必须检查项目是否为数据项。

答案 2 :(得分:0)

在运行时,您无法以这种方式从转发器内部获取项目,因为在执行代码后会添加转发器中的控件。

相反,您需要在数据绑定中对单个项目执行FindControl。要执行此操作,请在转发器上设置onItemDataBound事件,并在触发每个项目的事件中执行逻辑。您可以在事件参数的项属性中找到项模板中的控件。

例如:

在你的转发器上:

<asp:Repeater id="Repeater1" OnItemDataBound="Repeater1OnItemDataBound" runat="server">
你的代码隐藏中的

Public void Repeater1OnItemDataBound(Object Sender, RepeaterItemEventArgs e) {
    HtmlGenericControl myDynamicRepeaterControl = 
     ((HtmlGenericControl)e.Item.FindControl("MyDiv"))
    //...do some work on myDynamicRepeaterControl 
}
相关问题