Avatar billede shadowdance Nybegynder
10. august 2006 - 22:06 Der er 8 kommentarer

Lave kontrol med rendering af indre html

Hejsa,

hvis jeg nu gerne vil lave en kontrol, der forenkler følgende udtryk:

<table><tr><td>Se her!</td></tr><tr><td>Her er min hilsen</td></tr></table>

til dette:

<test:myusercontrol Title="Ser her!">Her er min hilsen</test:myusercontrol>

...hvordan skal jeg så opbygge mine properties i kontrollen?
Avatar billede snepnet Nybegynder
10. august 2006 - 22:14 #1
Vil du ikke gerne have at du kan sætte hvad som helst ind i tabelcellen, og ikke bare tekst?
Mvh
Avatar billede snepnet Nybegynder
10. august 2006 - 22:35 #2
Nå - du kan lave det sådan her hvis du vil, men det bliver en del mere fleksibelt, hvis du laver den templatebaseret - så kan du sætte hvad som helst ind.

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.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// Summary description for SomeControl
/// </summary>
namespace PageControls
{
    [ParseChildren()]
    public class TableControl : Table
    {
        private LiteralControl m_Content;
        private string m_Title;

        public string Title
        {
            get { return m_Title; }
            set { m_Title = value; }
        }
   
        protected override void OnInit(EventArgs e)
        {
            this.BorderStyle = BorderStyle.Solid;
            this.BorderWidth = 1;
            this.GridLines = GridLines.Both;

            TableRow row = new TableRow();
            Rows.Add(row);
            TableCell cell = new TableCell();
            row.Cells.Add(cell);
            cell.Text = m_Title;
           
            row = new TableRow();
            cell = new TableCell();
            row.Cells.Add(cell);
            cell.Controls.Add(m_Content);
            Rows.Add(row);
           
            base.OnInit(e);
        }

        protected override void AddParsedSubObject(object obj)
        {
            LiteralControl literal = obj as LiteralControl;
            if (literal != null)
            {
                m_Content = literal;
            }
            else
            {
                base.AddParsedSubObject(obj);
            }
        }
    }
}

Mvh
Avatar billede snepnet Nybegynder
10. august 2006 - 22:36 #3
Det er jo så ikke en usercontrol, men en webcontrol.
Mvh
Avatar billede snepnet Nybegynder
10. august 2006 - 22:48 #4
Men sådan en kan det også være:

// ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="TableUserControl.ascx.cs" Inherits="UserControls_TableUserControl" %>
<asp:Table ID="SomeTable" runat="server" BorderStyle="Solid" GridLines="Both">
    <asp:TableRow runat="server">
        <asp:TableCell runat="server" ID="HeaderCell"></asp:TableCell>
    </asp:TableRow>
    <asp:TableRow runat="server">
        <asp:TableCell runat="server" ID="ContentCell"></asp:TableCell>
    </asp:TableRow>
</asp:Table>

// code:
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;

[ParseChildren()]
public partial class UserControls_TableUserControl : System.Web.UI.UserControl
{
    private string m_Title;
    private LiteralControl m_Content;

    public string Title
    {
        get { return m_Title; }
        set { m_Title = value; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        HeaderCell.Text = m_Title;
        ContentCell.Controls.Add(m_Content);
    }

    protected override void AddParsedSubObject(object obj)
    {
        LiteralControl literal = obj as LiteralControl;
        if (literal != null)
        {
            m_Content = literal;
        }
        else
        {
            base.AddParsedSubObject(obj);
        }
    }
}

Mvh
Avatar billede shadowdance Nybegynder
10. august 2006 - 22:58 #5
Jo, lige præcis... man skal kunne sætte hvad som helst ind... så skal jeg bruge eksempel nr 2, eller hvad?
Avatar billede shadowdance Nybegynder
10. august 2006 - 22:59 #6
Nej, nu er jeg med... hvad vil 'templatebaseret' sige, og hvordan griber jeg det så an?
Avatar billede snepnet Nybegynder
10. august 2006 - 23:07 #7
Du kan måske bruge denne her som inspiration:

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;
using System.Xml;

namespace PageControls
{
    public class InnerPage : WebControl
    {
        private ITemplate m_HeaderTemplate;
        private ITemplate m_ContentTemplate;
        private ITemplate m_NavigationTemplate;

        [PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(TemplateControl))]
        public ITemplate HeaderTemplate
        {

            get { return m_HeaderTemplate; }
            set { m_HeaderTemplate = value; }

        }

        [PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(TemplateControl))]
        public ITemplate ContentTemplate
        {

            get { return m_ContentTemplate; }
            set { m_ContentTemplate = value; }

        }

        [PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(TemplateControl))]
        public ITemplate NavigationTemplate
        {

            get { return m_NavigationTemplate; }
            set { m_NavigationTemplate = value; }

        }

        protected override void CreateChildControls()
        {
            Table table = new Table();
            table.BorderStyle = BorderStyle.Solid;
            table.BorderWidth = 1;
            table.GridLines = GridLines.Both;

            TableRow row = new TableRow();
            TableCell cell = new TableCell();
            row.Cells.Add(cell);
            cell.ColumnSpan = 2;
            if (m_HeaderTemplate != null)
            {
                m_HeaderTemplate.InstantiateIn(cell);
            }
            table.Rows.Add(row);

            row = new TableRow();
            cell = new TableCell();
            row.Cells.Add(cell);
            if (m_NavigationTemplate == null)
            {
                m_NavigationTemplate = new DefaultNavigationTemplate();
            }
            m_NavigationTemplate.InstantiateIn(cell);

            row = new TableRow();
            table.Rows.Add(row);
            row.Cells.Add(cell);
            cell = new TableCell();
            if (m_ContentTemplate != null)
            {
                m_ContentTemplate.InstantiateIn(cell);
            }
            row.Cells.Add(cell);
            Controls.Add(table);

            base.CreateChildControls();
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            string s = sender.ToString();
        }
    }

    public class DefaultNavigationTemplate : ITemplate
    {
        protected GridView m_NavigationTable;

        public void InstantiateIn(Control container)
        {
            m_NavigationTable = new GridView();
            m_NavigationTable.DataSource = CreateDataSource();
            m_NavigationTable.DataBind();
            container.Controls.Add(m_NavigationTable);
        }

        protected virtual DataTable CreateDataSource()
        {
            DataTable data = new DataTable();
            data.Columns.Add("Text", typeof(string));
            data.Columns.Add("Link", typeof(string));

            DataRow row = data.NewRow();
            row["text"] = "Blah";
            row["link"] = "http://www.google.dk";
            data.Rows.Add(row);

            row = data.NewRow();
            row["text"] = "Yuhah";
            row["link"] = "http://www.dr.dk";
            data.Rows.Add(row);

            return data;
        }
    }
}

Kan bruges på en side sådan her:
<ctr:InnerPage ID="InnerPage1" runat="server">
    <HeaderTemplate>
        <asp:Label Text="HEADER" runat="server" ID="lblHeader"></asp:Label>
    </HeaderTemplate>
    <ContentTemplate>
        <asp:Label ID="Label1" Text="CONTENT" runat="server"></asp:Label>
    </ContentTemplate>   
</ctr:InnerPage> 

Mvh
Avatar billede snepnet Nybegynder
10. august 2006 - 23:08 #8
Det er self. lidt noget fjolleri med hc link etc, men håber den illustrerer tilstrækkeligt.
Mvh
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