0

我正在尝试使用中继器制作表格。但是,在转发器的项目中,我需要对某些特定控件实施一些逻辑,例如 div。

我试过,但没有用,我总是得到:

异常详细信息: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: }

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

我的 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
}

我哪里做错了?!

4

3 回答 3

2

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

protected void rptArticleContent_ItemDataBound(object sender, RepeaterItemEventArgs e)
    if (e.Item.ItemType == ListItemType.Item ||
        e.Item.ItemType == ListItemType.AlternatingItem) {
        // search for control here
    }
}
于 2012-08-30T21:50:48.250 回答
1

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

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

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

于 2012-08-30T21:51:09.033 回答
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 
}
于 2012-08-30T21:30:02.597 回答