日期:2014-05-16  浏览次数:20411 次

动态加载自定义服务器控件的问题
我自己写了一个下拉多选控件。
但是很奇怪,该控件通过拖拽入页面使用一切正常。但是如果是通过动态加载的方式则会产生问题。通过跟踪代码发现,在动态加载控件时,在执行控件中的OnInit事件和Page_Load事件时,组成控件自身的对象为null(该控件页面中使用了很多Div,设置为服务器端运行,并且设置有ID)。
相关代码如下:

控件的页面代码(部分):
<div id="DIVHead" runat="server" class="head">
        <table cellpadding="0" cellspacing="0" width="100%" border="0">
        <tr>
        <td style="width:100%;">
        <div class="text">
            <asp:TextBox ID="txtData" runat="server" Text="-----" BackColor="White" BorderStyle="None" BorderWidth="0px" Width="100%" Height="12px" Font-Size="9pt"></asp:TextBox>
        </div>
        </td>
        <td align="right">
        <div onmouseup="this.className='arrow0'" class="arrow0" onmousedown="this.className='arrow1'" onmouseout="this.className='arrow0'">6</div>
        </td>
        </tr>
        </table> 
    </div>    
    <div id="DIVTv" runat="server" onclick="javascript:HandleClick()"> 
        <div id="SelectAll" runat="server" style="background-color: lightcyan; width:100%; height:18px; vertical-align:middle; padding-left: 5px;">
            <asp:TextBox ID="TreeFlag" runat="server" Text="0" style="display:none"></asp:TextBox>
            <a href="javascript:AaaBbb()" runat="server" id="TreeAll">SelectAll</a>                
        </div>
        
        <asp:TreeView ID="TreeViewData" runat="server" OnSelectedNodeChanged="TreeViewData_SelectedNodeChanged" ShowLines="True"></asp:TreeView>
    </div>

控件的OnInit事件代码:

protected override void OnInit(EventArgs e)
{
     base.OnInit(e);
     DIVTv.Attributes.Add("class", "value");
}

就是在该代码中,如果动态加载控件时,跟踪显示DIVTv为null导致出现错误。
但是通过直接在页面中加入该控件使用时则正常,跟踪代码也显示对应的DIVTv是存在的

动态加载控件的代码如下:
ReportControl.ddlTree ddltree = new ReportControl.ddlTree();
ddltree.ID = "P_" + param.ParamInfo.Name;
ddltree.AddNotSelectInfo = false;
ddltree.DropDownListDataTable = (DataTable)param.DataSource;
ddltree.ValueColumn = param.ValueMember; ;
ddltree.TextColumn = param.DisplayMember;
ddltree.ShowCheckBox = true;
Page.Panel1.Controls.Add(ddltree);

请教各位大侠,动态加载控件时该如何解决相应对象为null的问题。我的理解应该是控件的页面没有加载完毕引起的,但是该如何解决呢?
------解决方案--------------------
Refer:
http://www.cnblogs.com/insus/p/319719