Avatar billede davidfossil Nybegynder
19. september 2004 - 18:08 Der er 14 kommentarer og
2 løsninger

Nedarve fra BoundColumn og HyperLinkColumn

Har man nogen som helst mulighed for at bestemme hvordan en nedarvet column skal renderes, ud over at override FormatDataValue, FormatDataTextValue og FormatDataNavigateUrlValue?

Hvis man fx ønsker at lave sin egen HyperLinkColumn hvor man kan sætte en ekstra parameter på det renderede A-element...
Avatar billede snepnet Nybegynder
19. september 2004 - 18:15 #1
Nu er en hyperlink-column jo sådan en rimelig specialiseret sag som udgangspunkt.
Det vil nok være bedst hvis du startede lidt højere oppe, og måske bare lavede en implementering af ITemplate....
Her er et eksempel på en databunden editerbar kolonne, men du kan lave hvad du har lyst til :

public class EditableColumn : ITemplate
{
    private string _dataField;

    public EditableColumn(string dataField)
    {
        this._dataField = dataField;
    }

    public void InstantiateIn(Control container)
    {
        TextBox tb = new TextBox();           
        tb.DataBinding+=new EventHandler(tb_DataBinding);
        container.Controls.Add(tb);           
    }

    private void tb_DataBinding(object sender, EventArgs e)
    {
        TextBox tb = (TextBox) sender;
        DataGridItem container = (DataGridItem) tb.NamingContainer;
        tb.Text = ((DataRowView)container.DataItem)[_dataField].ToString();
    }
}
Avatar billede snepnet Nybegynder
19. september 2004 - 18:18 #2
Du kan subclasse et HyperLink og overskrive disse to metoder :

    public class SpecialLink : HyperLink
    {
        public override void RenderBeginTag(HtmlTextWriter writer)
        {
        }

        public override void RenderEndTag(HtmlTextWriter writer)
        {
           
        }
    }
Avatar billede snepnet Nybegynder
19. september 2004 - 18:18 #3
så kan du fuldstændig styre hvad det skal pakkkes ind i.
Avatar billede snepnet Nybegynder
19. september 2004 - 21:14 #4
nå... jeg var måske helt ude i skoven her :oD

sig til hvis du gerne vil have mere konkrete eksempler.

mvh
Avatar billede snepnet Nybegynder
01. oktober 2004 - 20:25 #5
hvordan ser det ud her davidfossil ?
mvh
Avatar billede snepnet Nybegynder
03. oktober 2004 - 22:21 #6
jeg smider et svar her hvis du kunne bruge det til noget :o)
mvh
Avatar billede davidfossil Nybegynder
05. oktober 2004 - 08:15 #7
Umiddelbart kan jeg ikke få dit eksempel til at spille.
Jeg har ændret noget ting i din class, for at få runtime compiler fejl til at forsvinde, men uden held. Nu "virker" den som en column, men viser intet inhold.


<jsr:EditableColumn HeaderText="Oprettet af" DataField="authorName" />


public class EditableColumn : System.Web.UI.WebControls.DataGridColumn, ITemplate
{
    private string _dataField;
    public string DataField
    {
        get
        {
            return _dataField;
        }
        set
        {
            _dataField = value;
        }
    }

    public EditableColumn(string dataField)
    {
        this._dataField = dataField;
    }

    public EditableColumn()
    {
    }

    public void InstantiateIn(Control container)
    {
        System.Web.UI.WebControls.TextBox tb = new System.Web.UI.WebControls.TextBox();         
        tb.DataBinding+=new EventHandler(tb_DataBinding);
        container.Controls.Add(tb);         
    }

    private void tb_DataBinding(object sender, EventArgs e)
    {
        System.Web.UI.WebControls.TextBox tb = (System.Web.UI.WebControls.TextBox) sender;
        System.Web.UI.WebControls.DataGridItem container = (System.Web.UI.WebControls.DataGridItem) tb.NamingContainer;
        tb.Text = ((System.Data.DataRowView)container.DataItem)[_dataField].ToString();
    }
}
Avatar billede snepnet Nybegynder
05. oktober 2004 - 08:46 #8
Hej David :o)

Det lyder lidt underligt... Den første kode jeg sendte dig kører da fint her - er det ikke bare en
using System.Web.UI.WebControls;
der har manglet i den fil du har arbejdet med den i ?

det ser umiddelbart ud til at det eneste du har ændret er at skrive navnet fuldt ud på kontrollerne - alts f.eks. System.Web.UI.WebControls.Text.

Det giver så forfærdelig lange kodelinier, men hvis du øverst i din fil bare skriver
using System.Web.UI.WebControls;
kan du i koden referere klasser i namespacet direkte... f.eks. TextBox.

Med hensyn til at bruge templatekolonnen :
Prøv med følgende kode :

protected void CreateAndInsertGrid()
{
    DataGrid grid = new DataGrid();
    grid.AutoGenerateColumns = false;

    // en standardkolonne
    BoundColumn bc = new BoundColumn();
    bc.HeaderText = "FldString";
    bc.DataField = "FldString";  // KOLONNENANVNE HER
    grid.Columns.Add(bc);

    // og så en templatecolumn
    TemplateColumn tpc = new TemplateColumn();
    tpc.HeaderText = "Template";
    tpc.ItemTemplate = new EditableColumn("FldDateTime"); // KOLONNENAVN HER
    grid.Columns.Add(tpc);   

    grid.DataSource = PageDataSet; // DATA HER
    Form1.Controls.Add(grid);               
    grid.DataBind();
}

Husk at ændre der hvor jeg har skrevet :
// KOLONNENANVNE HER
// DATA HER
Til noget der passer.

Desuden - jeg sætter griddet ind på formen med denne linie :
Form1.Controls.Add(grid);

Det kan kun lade sig gøre fordi jeg har en dekleration øver i klassen :
protected HtmlForm Form1;
(kræver en using System.Web.UI.HtmlControls;)

Og formen hedder så også Form1 i aspx'en :
<form id="Form1" method="post" runat="server">

Håber du kan få det til at funge - ellers skal du endelig skrive.

mvh
Avatar billede davidfossil Nybegynder
05. oktober 2004 - 09:08 #9
Ahh, nu tror jeg at jeg kommer lidt tættere på...
Det er fordi du indsætter en TemplateColumn og så "binder" din template til den - det var den del jeg ikke havde fanget...

Men nu ønsker jeg mig jo at kunne indsætte en af mine "EditColumns" i et DataGrid ved blot at kalde den fra min .aspx side:
<jsr:EditColumn att1="val1" att2="val2" />
Avatar billede snepnet Nybegynder
05. oktober 2004 - 15:42 #10
Ah... det kan fikse med et par småændringer :

// costumcontrol (boundcolumn)

[ToolboxData("<{0}:EditableColumn runat=server></{0}:EditableColumn>")]
public class EditableColumn : BoundColumn, ITemplate
{
    public EditableColumn()
    {
    }

    public void InstantiateIn(Control container)
    {
        TextBox tb = new TextBox();           
        tb.DataBinding+=new EventHandler(tb_DataBinding);
        container.Controls.Add(tb);           
    }

    private void tb_DataBinding(object sender, EventArgs e)
    {
        TextBox tb = (TextBox) sender;
        DataGridItem container = (DataGridItem) tb.NamingContainer;
        tb.Text = ((DataRowView)container.DataItem)[DataField].ToString();
    }
}


// så skulle du kunne bruge den deklerativt sådan her :
<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False">
    <Columns>
        <cc1:EditableColumn runat="server" DataField="FldString"></cc1:EditableColumn>
    </Columns>
</asp:DataGrid></P>   

cc1 skal så være et registreret prefix på siden sådan her :
<%@ Register TagPrefix="cc1" Namespace="Exp2Controls" Assembly="Exp2Controls" %>

Det sidste er så afhængig af hvilken assembly du har lagt kontrollen (altså den der editable column), og hvilket namespace den ligger under i den assembly.

mvh
Avatar billede snepnet Nybegynder
05. oktober 2004 - 15:43 #11
Er det til at følge ?
mvh
Avatar billede snepnet Nybegynder
05. oktober 2004 - 15:43 #12
(eller formulerer jeg mig som en hat)
Avatar billede davidfossil Nybegynder
05. oktober 2004 - 16:20 #13
Altså nu virker den som en BoundColumn, men den gør heller ikke andet :o)
Ud fra din kode gætter jeg på at det var meningen at den skulle rendere som <input> felter... ? :)
Avatar billede snepnet Nybegynder
05. oktober 2004 - 16:54 #14
Ja det er mig der sidder og nosser i det :o) - sorry.

Jeg bliver nødt til at løbe nu, men jeg skal se om jeg kan finde en shortcut til det... (det kan godt lade sig gøre, hvis du specialiserer lidt højere oppe fra - fra en datagridcolumn f.eks. men det kræver at du skal lave en del mere arbejde selv).

Men hvis du vil angive det deklarativt alligevel... hvorfor bruger du så ikke en normalt templatekolonne (der kan du jo putte hvilken som helst kontrol ind).

mvh
(jeg er tilbage senere i aften)
Avatar billede snepnet Nybegynder
09. oktober 2004 - 15:44 #15
hej davidfossil - er du stadig igang her ?
(jeg har prøvet lidt forskelligt, men jeg synes ikke det virker som om det er den fede at subclasse en boundcolumn... den er lidt for lukket, og stringent i sin virkemåde).

men hvis du lige smider en kommetar til mit spørgsmå her 16:54:17 (omkring det med templatekolonne) vil jeg gerne komme med andre eksempler.

ellers får du lige et svar her, hvis du skulle kunne bruge noget af det til noget.

mvh
Avatar billede davidfossil Nybegynder
11. oktober 2004 - 09:13 #16
ok, vi lukker for nu :o)

ser om ikke jeg kan finde ud af en måde at løse det med template kolonnen.
ellers skal jeg nok oprette et nyt spm ;)
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