19. september 2004 - 18:08Der 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...
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); }
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.
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 :
// 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.
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" />
[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); }
// 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.
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... ? :)
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).
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.
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 ;)
Synes godt om
Ny brugerNybegynder
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.