Om ASP.NET onder de knie te krijgen heb ik een hobby project bedacht. Om zo veel mogelijk te leren en om efficient mogelijk te coden wil ik alle mogelijkheden van .NET die nuttig zijn gebruiken. Ik ontwikkel met Visual Studio.Net in C# en gebruik een MSDE 2000 database.
Nu moet ik op een aantal formulieren hetzelfde dropdown lijstje tonen. In dit lijstje moeten een aantal namen uit de database getoond worden, met als value het ID. Ook moet aan de hand van een kolom 'Default' in de database als default 1 van de waarden gekozen worden. Dit was al snel gemaakt. Ik weiger echter (om eerder genoemde reden) om zomaar code te copy-en van formulier naar formulier, dus besloot een Web User Control te maken.
Ik heb in mijn Solution een Web Control Library project ASPTestControls toegevoegd. Daarin heb ik 1 Web User Control aangemaakt, met de volgende inhoud:
DomainList.ascx:
DomainList.ascx.cs:
Vervolgens heb ik in mijn oorspronkelijke project een reference gezet naar mijn Web Control Library, en aan een pagina de volgende regels toegevoegd:
Als ik het project met die pagina als Start Page aanroep, krijg ik de volgende error:
Heeft er iemand ervaring met het ontwikkelen van Web User Controls in Web Control Libraries, waarbij gebruik wordt gemaakt van een standaard Web Control? Zo ja .... helluppie! (Sorry voor de grote lap code + text, ik heb alles we voor de volledigheid maar even bijgezet.)
Nu moet ik op een aantal formulieren hetzelfde dropdown lijstje tonen. In dit lijstje moeten een aantal namen uit de database getoond worden, met als value het ID. Ook moet aan de hand van een kolom 'Default' in de database als default 1 van de waarden gekozen worden. Dit was al snel gemaakt. Ik weiger echter (om eerder genoemde reden) om zomaar code te copy-en van formulier naar formulier, dus besloot een Web User Control te maken.
Ik heb in mijn Solution een Web Control Library project ASPTestControls toegevoegd. Daarin heb ik 1 Web User Control aangemaakt, met de volgende inhoud:
DomainList.ascx:
C#:
1
2
3
4
| <%@ Control Language="c#" AutoEventWireup="false" Codebehind="DomainList.ascx.cs" Inherits="ASPTestControls.DomainList" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" debug="False"%> <asp:dropdownlist id="ddlDomains" runat="server"></asp:dropdownlist> |
DomainList.ascx.cs:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
| namespace ASPTestControls { using System; using System.Data; using System.Drawing; using System.Web; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; // added later using System.Data.SqlClient; // SQL Database connections /// <summary> /// Summary description for DomainList. /// </summary> public abstract class DomainList : System.Web.UI.UserControl { protected System.Web.UI.WebControls.DropDownList ddlDomains; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } private void ddlDomains_Load(object sender, System.EventArgs e) { // in the Load event, load Items collection with domains from database, only if the page is NOT a postback if (!Page.IsPostBack) { SqlConnection mySqlConnection = new SqlConnection("server=(local)\\VSdotNet;database=ASPTest;Trusted_Connection=yes"); SqlCommand mySqlCommand = new SqlCommand("select * from tblDomain", mySqlConnection); SqlDataReader myReader = null; ListItem listDomain = null; try { mySqlConnection.Open(); myReader = mySqlCommand.ExecuteReader(); ddlDomains.DataSource = myReader; while (myReader.Read()) { listDomain = new ListItem(); listDomain.Value = myReader["DomainID"].ToString(); listDomain.Text = myReader["DomainName"].ToString(); if (myReader["DefaultDomain"].ToString() == "1") { listDomain.Selected = true; } ddlDomains.Items.Add(listDomain); } } catch (Exception exep) { Response.Write("Error: " + exep.Message); } finally { if (myReader != null) myReader.Close(); if (mySqlConnection.State == ConnectionState.Open) mySqlConnection.Close(); } } } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); } /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.ddlDomains.Load += new System.EventHandler(this.ddlDomains_Load); this.Load += new System.EventHandler(this.Page_Load); } #endregion } } |
Vervolgens heb ik in mijn oorspronkelijke project een reference gezet naar mijn Web Control Library, en aan een pagina de volgende regels toegevoegd:
C#:
1
2
3
| <%@ Register TagPrefix="ASPTestControls" Namespace="ASPTestControls" Assembly="ASPTestControls" %> [...] <ASPTestControls:DomainList id="ddlDomains2" runat="server" /> |
Als ik het project met die pagina als Start Page aanroep, krijg ik de volgende error:
Ik heb geen flauw idee wat ik verkeerd doe. Het merkwaardige is dat deze Web User Control wel werkt als ik hem onderdeel van het project maak, en direct naar de control file (.ascx) verwijs in de @Register tag. Alleen in dat geval krijg ik in design time in Visual Studio een error, en werkt IntelliSense e.d. er niet mee, en ik vind dat ook geen echt nette manier van werken.Server Error in '/ASPTest' Application.
--------------------------------------------------------------------------------
Compilation Error
Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.
Compiler Error Message: CS0144: Cannot create an instance of the abstract class or interface 'ASPTestControls.DomainList'
Source Error:
Line 15: <P><asp:label id="lblMemberName" runat="server">Member name: </asp:label><asp:textbox id="txtMemberName" runat="server"></asp:textbox> @
Line 16: <asp:dropdownlist id="ddlDomains" runat="server"></asp:dropdownlist>
Line 17: <ASPTestControls:DomainList id="ddlDomains2" runat="server" />
Line 18: </P>
Line 19: <P><asp:label id="lblPassword" runat="server">Password: </asp:label><asp:textbox id="txtPassword" runat="server" TextMode="Password"></asp:textbox></P>
Source File: http://localhost/ASPTest/login.aspx Line: 17
Heeft er iemand ervaring met het ontwikkelen van Web User Controls in Web Control Libraries, waarbij gebruik wordt gemaakt van een standaard Web Control? Zo ja .... helluppie! (Sorry voor de grote lap code + text, ik heb alles we voor de volledigheid maar even bijgezet.)