Avatar billede anders159 Nybegynder
28. oktober 2005 - 12:47 Der er 10 kommentarer og
1 løsning

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 ;).
Avatar billede dr_chaos Nybegynder
28. oktober 2005 - 13:41 #1
du skal huske at du max må give 200 for et spørgsmål.
jeg tror at nedenstående kode er hvad du har brug for:

default.aspx:
<%@ Page language="c#" Codebehind="Default.aspx.cs" AutoEventWireup="false" Inherits="_Default" %>
<%@ Reference control="myControl.ascx" %>
<HTML>
    <HEAD id="Head1">
        <title>MyTestPage</title>
    </HEAD>
    <body>
        <form id="form1" runat="server">
            <div>
                <asp:PlaceHolder ID="plc" Runat="server"></asp:PlaceHolder>
            </div>
        </form>
    </body>
</HTML>
Avatar billede dr_chaos Nybegynder
28. oktober 2005 - 13:42 #2
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;


   
    /// <summary>
    /// Summary description for _Default.
    /// </summary>
    public class _Default : System.Web.UI.Page
    {
        protected Repeater Repeater1;
        public MyControl MyControl1;
        protected PlaceHolder plc;
        private void Page_Load(object sender, System.EventArgs e)
        {
            ArrayList values = new ArrayList();
            for(int i = 0;i<5;i++)
            {
                               
                MyControl1 = (MyControl)LoadControl("myControl.ascx");
                MyControl1.setName("noget nummer "+i);
                plc.Controls.Add(MyControl1);
               
               
            }
           

        }

        #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);
        }
       
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion
    }
Avatar billede dr_chaos Nybegynder
28. oktober 2005 - 13:42 #3
MyControl.ascx:

<%@ Control Language="c#" AutoEventWireup="false" Codebehind="MyControl.ascx.cs" Inherits="MyControl" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
<table>
    <tr>
        <td>
            <asp:textbox ID="t1" runat="server" />
        </td>
    </tr>
</table>
Avatar billede dr_chaos Nybegynder
28. oktober 2005 - 13:43 #4
MyControl.ascx.cs:


    using System;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;

    /// <summary>
    ///        Summary description for MyControl.
    /// </summary>
    public class MyControl : System.Web.UI.UserControl
    {
        public System.Web.UI.WebControls.TextBox t1;
        public string name;
        private void Page_Load(object sender, System.EventArgs e)
        {
           
                // Put user code to initialize the page here
        }
       
       
        public void setName(string s)
        {
            this.name = s;
            t1.Text = s;
        }
        #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);
        }
       
        /// <summary>
        ///        Required method for Designer support - do not modify
        ///        the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion
    }
Avatar billede dr_chaos Nybegynder
28. oktober 2005 - 13:44 #5
på denne måde kan du tilgå funktioner i usercontrollen.
f.eks. setname.
Avatar billede anders159 Nybegynder
28. oktober 2005 - 15:00 #6
Hej Chaos.

skal nok huske det med de 200.

kan dog ikke lige få din kode til at løbe..Køre det hos dig??

den førse fejl jeg lige møder er CodeBehind="xxx". denne komando eller hvad man kalder det, accepteres ikke af visulal studio..går dog udfra at det er det samme som codeFile="xxx".

du har i default.aspx.cs følgende.
>>public class _Default : System.Web.UI.Page<<
når jeg gør det sådan, siger den >-Missing partial modifier on declaration of type '_Default'; another partial declaration of this type exists<-

hvis jeg bibeholder 'partiel'
public partial class _Default : System.Web.UI.Page
siger den:
->The type or namespace name 'MyControl' could not be found (are you missing a using directive or an assembly reference?)<-

Når jeg opretter i myControl.ascx.cs
>>public System.Web.UI.WebControls.TextBox t1;<<
får jeg at vide:
->The type 'myControl' already contains a definition for 't1'
<-

Synes jeg har fået alt rette til efter din kode....Så
håber min beskrivelse her giver en smule mening, for jeg er helt ude at svømme ;)

Køre den kode du sendte mig, hos dig?
Avatar billede dr_chaos Nybegynder
28. oktober 2005 - 15:22 #7
send mig en mail på nic@jee.dk så mailer jeg filerne til dig.
Avatar billede dr_chaos Nybegynder
31. oktober 2005 - 09:21 #8
svar :)
Avatar billede anders159 Nybegynder
31. oktober 2005 - 11:40 #9
Er du nu også sikker på det ;)
Avatar billede dr_chaos Nybegynder
31. oktober 2005 - 12:04 #10
HOST F*** laver den altid :)
Avatar billede anders159 Nybegynder
31. oktober 2005 - 12:18 #11
hehe ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester