VB.NET UserControl for ASP.NET: "not a known element"
I've created a UserControl in VB.NET and added it to a form. But it looks like I've done it wrong as it is underlined with the message:
ctlDropDown
is not a known element. This can occur if there is a compilation error in the Web site or theweb.config
file is missing.
When I try to run it I get the following error:
myControl
is not allowed here because it does not extend classSystem.Web.UI.UserControl
.
Here's the code:
control itself...
<%@ 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" tabI开发者_C百科ndex="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>
on the form...
<%@ Register TagPrefix="uc1" TagName="ctlDropdown" Src="../UserControls/ctlDropDown.ascx" %>
and...
<table>
<tr>
<TD style="POSITION: absolute;">
<uc1:ctlDropDown ID="ctlDropDown1" runat="server"></uc1:ctlDropDown>
</TD>
</tr>
</table>
You've shown us the markup for your user control. However, there should also be a file which has the actual class for that object. Your markup references it here:
CodeBehind="ctlDropDown.ascx.vb"
This file should contain a class, referenced in your markup here:
Inherits="myProj.UserControls.ctlDropDown"
This class should extend (inherit from) the class System.Web.UI.UserControl
. Something like:
Namespace myProj.UserControls
Public Class ctlDropDown Inherits System.Web.UI.UserControl
' Your class implementation. Likely a Page_Load method perhaps.
End Class
End Namespace
(Note that the class may be marked as a "partial" class, depending on how the user control was created.)
This is needed by the compiler more so than the markup. The actual controls, user controls, etc. throughout an ASP .NET web application all boil down to classes interacting with each other. Without a class backing the markup, it's not known to the runtime and can't be used.
I've found the root of the problem. The usercontrol was incorrectly referenced in the dynamically-created designer.vb. So I changed it from...
Protected WithEvents ctlDropDown1 As Global.myProj.UserControls.ctlDropDown
to...
Protected WithEvents ctlDropDown1 As Global.myProj.ctlDropDown
...and now it works.
Hope this proves useful to someone.
Since you are using code behind for the user control the control must inherit from UserControl
see the example here.
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
Just to add the explanation of the solution. The solution was failing to load the control because the control was in error. So when you dragged and dropped the control onto the form it never fully registered in design time.
Always check the control doesn't have some sort of excluded or hidden error.
精彩评论