ASP.NET的VB.NET用户控件:“0”;“不是已知元素”;

ASP.NET的VB.NET用户控件:“0”;“不是已知元素”;,asp.net,vb.net,user-controls,Asp.net,Vb.net,User Controls,我在VB.NET中创建了一个UserControl,并将其添加到表单中。但看起来我做错了,因为下面的信息强调了这一点: ctlDropDown不是已知元素。如果 网站中存在编译错误或缺少Web.config文件 当我尝试运行它时,会出现以下错误: 此处不允许使用myControl,因为它不扩展classSystem.Web.UI.UserControl 代码如下: 控制自己 <%@ Control Language="vb" AutoEventWireup="false" CodeB

我在VB.NET中创建了一个UserControl,并将其添加到表单中。但看起来我做错了,因为下面的信息强调了这一点:

ctlDropDown
不是已知元素。如果 网站中存在编译错误或缺少
Web.config
文件

当我尝试运行它时,会出现以下错误:

此处不允许使用myControl,因为它不扩展class
System.Web.UI.UserControl

代码如下:

控制自己

   <%@ Control Language="vb" AutoEventWireup="false" CodeBehind="ctlDropDown.ascx.vb" Inherits="myProj.UserControls.ctlDropDown" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
  <asp:textbox id="txtValue" style="Z-INDEX: 101; LEFT: -100px; POSITION: absolute; TOP: -200px"
        tabIndex="0" runat="server"></asp:textbox><asp:panel id="pnlMain" style="scrolling: no" Width="100%" runat="server" HorizontalAlign="Right"
        BorderWidth="1px" BorderStyle="Solid">
        <TABLE cellSpacing="0" cellPadding="0" width="100%" border="0">
            <TR>
                <TD vAlign="top" width="100%">
                    <asp:TextBox id="txtData" tabIndex="9500" runat="server" Width="100%" Height="100%" BorderStyle="None"
                        BorderWidth="0px"></asp:TextBox></TD>
                <TD vAlign="top">
                    <asp:ImageButton id="imgDownButton" runat="server" BackColor="ControlLight" BorderStyle="Outset"
                        BorderWidth="2px" ImageUrl="../Arrow.gif"></asp:ImageButton></TD>
            </TR>
        </TABLE>
    </asp:panel><asp:listbox id="lstList" tabIndex="0" Height="205px" Width="100%" runat="server" Visible="False"></asp:listbox><asp:textbox id="txtActiveElementClientID" style="Z-INDEX: 100; LEFT: -100px; POSITION: absolute; TOP: -200px"
        tabIndex="0" runat="server"></asp:textbox>

在表格上

<%@ Register TagPrefix="uc1" TagName="ctlDropdown" Src="../UserControls/ctlDropDown.ascx" %>

而且

<table>
<tr>
<TD style="POSITION: absolute;">
     <uc1:ctlDropDown ID="ctlDropDown1" runat="server"></uc1:ctlDropDown>
</TD>
</tr>
</table>

您已经向我们展示了用户控件的标记。但是,还应该有一个具有该对象的实际类的文件。您的标记在此处引用它:

CodeBehind="ctlDropDown.ascx.vb"
此文件应包含一个类,在此处的标记中引用:

Inherits="myProj.UserControls.ctlDropDown"
此类应扩展(继承)类
System.Web.UI.UserControl
。比如:

Namespace myProj.UserControls
  Public Class ctlDropDown Inherits System.Web.UI.UserControl

    ' Your class implementation.  Likely a Page_Load method perhaps.

  End Class
End Namespace
(请注意,该类可能标记为“部分”类,具体取决于用户控件的创建方式。)


编译器比标记更需要这一点。整个ASP.NETWeb应用程序中的实际控件、用户控件等都可以归结为相互交互的类。如果没有支持标记的类,则运行时不知道该标记,因此无法使用。

我找到了问题的根源。在动态创建的designer.vb中错误引用了usercontrol。所以我把它从

Protected WithEvents ctlDropDown1 As Global.myProj.UserControls.ctlDropDown

…现在它起作用了


希望这对其他人有用。

由于您将代码隐藏用于用户控件,因此该控件必须继承自
UserControl
请参见示例


只是补充一下对解决方案的解释。解决方案无法加载控件,因为控件出错。因此,当您将控件拖放到窗体上时,它在设计时从未完全注册


始终检查控件是否存在某种排除或隐藏的错误

用户控件的实际代码如何?它是否扩展了类
System.Web.UI.UserControl
?我不知道。这是什么意思?恰到好处。我只是在同一时间发布了同样的东西。非常感谢。很好奇,因为标记引用了
myProj.UserControls.ctlDropDown
。听起来您可能有一些交叉的名称空间,这可能会导致这种情况再次发生。您需要确保您的名称空间已明确排序,否则在运行时可能会发生奇怪的事情。(例如更新您认为正在使用的类,但实际上它使用的是同名的不同类。)
Protected WithEvents ctlDropDown1 As Global.myProj.ctlDropDown
Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls

Public Class SimpleControl
   Inherits UserControl
   Public name As TextBox
   Public output As Label
   Public myButton As Button


   Public Sub myButton_Click(sender As Object, e As EventArgs)

      output.Text = "Hello, " + name.Text + "."

   End Sub  

End Class