C# 子中继器控件在嵌套中继器中使用时无法隐藏或显示面板控件

C# 子中继器控件在嵌套中继器中使用时无法隐藏或显示面板控件,c#,asp.net,repeater,webforms,nested-repeater,C#,Asp.net,Repeater,Webforms,Nested Repeater,我使用嵌套的repeater控件按年份显示相册 输出应该是这样的 年度 --唱片集1唱片集2唱片集3唱片集4[IMG更多信息] 年度 --唱片集1唱片集2唱片集3唱片集4[IMG更多信息] 年度 --唱片集1唱片集2唱片集3唱片集4[IMG更多信息] 已解决:我提到了面板的错误名称Panel pnl=(Panel)e.Item.FindControl(“pnlMore”) 如果我用“//生成错误”注释这两条语句,代码工作正常。从这段代码中,我想显示一张图像[IMG More],如果一年的专辑超过

我使用嵌套的repeater控件按年份显示相册

输出应该是这样的

年度

--唱片集1唱片集2唱片集3唱片集4[IMG更多信息]

年度

--唱片集1唱片集2唱片集3唱片集4[IMG更多信息]

年度

--唱片集1唱片集2唱片集3唱片集4[IMG更多信息]

已解决:我提到了面板的错误名称
Panel pnl=(Panel)e.Item.FindControl(“pnlMore”)

如果我用“//生成错误”注释这两条语句,代码工作正常。从这段代码中,我想显示一张图像
[IMG More]
,如果一年的专辑超过4张,否则就隐藏它

下面的代码行生成错误

pnl.Visible=true//生成错误
pnl.Visible=false//生成错误

错误消息:对象引用未设置为对象的实例

父中继器控制
rptAlbumsCategories
&子中继器控制
rptAlbums

我不确定这为什么会产生错误

如果有更好的方法,我将不胜感激

protected void rptAlbumCategory_ItemBound(Object Sender, RepeaterItemEventArgs e)
{
    try
    {
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        DataRowView drv = (DataRowView)e.Item.DataItem;
        int year = Convert.ToInt32(drv["Year"]);
        Repeater Repeater2 = (Repeater)e.Item.FindControl("rptAlbums");
            Panel pnl = (Panel)e.Item.FindControl("pnlNext");
        //Control pnl = (Control)e.Item.FindControl("pnlNext");
        Repeater2.DataSource = getAlbumsYear(year, pnl);
        Repeater2.DataBind();
    }
        }
    catch (Exception ex)
    {
        throw ;
    }
}

private DataTable getAlbumsYear(int year, Panel pnl)
{
    try
    {
        DataSet ds = new DataSet();
        string strSql = "SELECT TOP 4 AlbumID, AlbumName, AlbumIcon FROM Album";
        strSql += " DATEPART(YYYY,AlbumDate) = " + year;
        strSql += " ORDER BY AlbumDate DESC ";
        ds = DataProvider.Connect_Select(strSql);
        DataTable dt = ds.Tables[0];
        //Code to show Next arrow
        string strSql2 = "SELECT AlbumID, AlbumName, AlbumIcon FROM Album ";
        strSql2 += "WHERE DATEPART(YYYY,AlbumDate) = " + year;
        DataSet ds2 = new DataSet();
        ds2 = DataProvider.Connect_Select(strSql2);
        if (ds2.Tables[0].Rows.Count > 3)
        {
            pnl.Visible = true;  //Generates Error
        }
        else
        {
            pnl.Visible = false; //Generates Error
        }
        return dt;
    }
    catch (Exception ex)
    {
        throw;
    }
}
代码


解决:我提到了错误的面板控制名称

Panel Panel pnl = (Panel)e.Item.FindControl("pnlMore");

旁注:您不应该在catch块中创建新的异常,而应该抛出相同的异常,因此不要
throw ex
或(您所写的)
抛出新异常(例如ToString())简单地说:
抛出
Panel Panel pnl = (Panel)e.Item.FindControl("pnlMore");