UserControls og .NET. Til 400p
If at first you don't succeed....try try again :)Note: Er helt ny i denne .NET/C# verden, så mine problemer kan godt skyldes manglende indsigt eller at jeg angriber problemet helt forkert.
Vær venlig at læse hele spørgsmålet godt igennem før i svare og stil gerne spørgsmål hvis noget skulle være ugennesigtigt.
Opgave:
At lave en webUserControl. UserControlen skal have flere forskellige metoder, hvorigennem man kan manipulere med de elementer der er på userControl.aspx siden.
Har lavet et lille eksemple som skulle kunne gøre det ud for denne problemstilling. Så jeg håber at i med udgangspunkt i dette, kan forstå mit problem.
her er lige koden til de 4 filer.
-----------------------------------------------------------------
-----------------------------------------------------------------
Default.aspx :
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Debug="true" Inherits="_Default" %>
<html>
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table>
<asp:PlaceHolder ID="plc" runat="server">
</asp:PlaceHolder>
</table>
</div>
</form>
</body>
</html>
-----------------------------------------------------------------
default.aspx.cs :
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Collections;
using System.Reflection;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ArrayList values = new ArrayList();
for (int i = 0; i < 5; i++)
{
UserControl uc = null;
uc = (UserControl)LoadControl("myControl.ascx");
TextBox tb = (TextBox)uc.FindControl("t1");
tb.Text = "TextBox nummer " + (i+1);
plc.Controls.Add(uc);
}
}
}
-----------------------------------------------------------------
myControl.ascx :
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="myControl.ascx.cs" Inherits="WebUserControl" %>
<tr>
<td>
<asp:TextBox ID="t1" runat="server" > </asp:TextBox>
</td>
</tr>
-----------------------------------------------------------------
myControlascx.cs :
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class WebUserControl : System.Web.UI.UserControl
{
protected string name;
protected void Page_Load(object sender, EventArgs e)
{
}
public void setName(string s)
{
this.name = s;
this.t1.Text = s;
}
}
-----------------------------------------------------------------
-----------------------------------------------------------------
Denne kode virker fint, og giver mig en side med 5 textboxe.
I eksemplet opretter jeg myCotrol instanser i farten, Og det er også sådan det skal være. Jeg kan dog ikke se hvordan jeg kan tilgå metoden setName. jeg sætter jo bare attributten text direkte på textboxen, og ikke gennem metoden set name.
Jeg vil dog gerne kunne tilgå myCotrol mere direkte. Og her kommer der virkelig nogle ting der undre mig lidt.
Hvis jeg trækker en instans af myControl over på default.aspx i designmode, får jeg følgende kode:
---------------------------------------------------------------
<%@ Register Src="myControl.ascx" TagName="myControl" TagPrefix="uc1" %>
<uc1:myControl ID="MyControl1" runat="server" />
---------------------------------------------------
nu kan jeg så i min default.aspx.cs skrive følgende:
--------------------------------------------
MyControl1.setName("Anders");
-------------------------------------------
og den spytter en fin textbox ud, med anders i
1. Hvorfor kan jeg ikke tilgår myControl objektet på samme måde, når jeg oprette det dynamisk.
2. Findes der en måde at construere en usercontrol på, så jeg kan oprette den dynamsik og tilgå den som ovenfor.(måske som .dll)?
3.
Denne stump kode virker ikke, men er hvad jeg gerne ville kunne gøre på min Default.aspx.cs side. Kan det lade sig gøre?
-----------------------------------------------------------------
Default.aspx.cs(nice to have) :
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Collections;
using System.Reflection;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ArrayList values = new ArrayList();
for (int i = 0; i < 5; i++)
{
UserControl uc = null;
uc = (UserControl)LoadControl("myControl.ascx");
uc.setName("Anders");
plc.Controls.Add(uc);
}
}
}
-----------------------------------------------------------------
Håber nogen forstår mit problem og har en mulig løsning på det.
400 points til den der kan ;).
