无法找到ID为“ctl00_MainContentPlaceHolder_divDetailsContent”的控件,但它就在那里!

时间:2009-10-02 16:17:10

标签: asp.net

我正在尝试添加一个动态创建的控件,但是我收到了这个错误:

'abc'的TargetControlID无效。找不到ID为'ctl00_MainContentPlaceHolder_divDetailsContent'的控件。

aspx页面如下所示:( PSEUDO CODE ALERT)

.
.
<panel id="myPanel" runat="server" ... >
<div id="divDetailsContent" runat="server" style="width:100%">
.
.
<% this.Controls.Add(GetAnimationExtender(myPanel)); %>
.
. 

我已尝试过ID和ClientID属性,但仍然是错误。有什么想法吗?

编辑:

很多困惑的答案,这里是我的方法的较短版本,因为我评论了大部分内容,错误与此代码相同:

public static UpdatePanelAnimationExtender GetAnimationExtender(PlaceHolder loadingMessagePlaceHolder, Control targetControl, UpdatePanel targetPanel)
{

    UpdatePanelAnimationExtender ae = new UpdatePanelAnimationExtender();

    ae.ID = GenerateRandomControlID();
    ae.TargetControlID = targetPanel.ClientID;
  return ae;
}

它说它找不到TargetControlID但它将面板传递给它

4 个答案:

答案 0 :(得分:1)

如果你在任何html控件中使用runat =“server”attr,那么你不需要说ClientID,而是使用ID和:

<div id="divDetailsContent" runat="server" style="width:100%">
.
.
<% this.Controls.Add(blah.GetControl(divDetailsContent.ID)); %>
.
.
public static Control GetControl(n)
{
.
.
blah.TargetID = n;
.
.
}

答案 1 :(得分:1)

Aaron有正确的想法 - 你的runat =“server”意味着你不需要冒汗clientID或UniqueID。这里真正的问题是:

// You're trying to call blah.GetControl using the control name
<% this.Controls.Add(blah.GetControl(divDetailsContent.ClientID)); %>

//Yet GetControl is static ?  So what exactly is this function doing that it cannot find the control?
public static blah GetControl(n)
{
  //How is blah a method and an object?
  blah.TargetID = n;       
}

编辑: 你正在设置ae.TargetControlID两次 - 你确定它两次都是正确的目标吗?

此外,您是否知道在指定TargetControlID之前是否需要将其添加到页面?可能需要在能够找到目标控件之前将其加载到页面上。

编辑2: 您将ae.TargetControlID设置为更新面板的ClientID。这是不正确的 - 它需要是UpdatePanel的ID。是否可以找到它我打赌将基于我之前提到的问题。

答案 2 :(得分:1)

目前尚不清楚你要做什么。如果此代码位于.aspx页面上,则添加

<div id="divDetailsContent" runat="server" style="width:100%">

到您想要的页面会自动将其添加到页面中。尝试使用this.Controls.Add将其再次添加到父级将导致控制树的第二次呈现。这可能会导致意想不到的后果。

我认为使用runat = server添加div就足够了。

答案 3 :(得分:0)

解决了这个特殊问题......我不得不使用UniqueID。

现在我发现它必须在预渲染上完成,唉!但那是另一天的问题......