[ Igor Gajic @ 08.07.2011. 15:11 ] @
Potrebno mi je da u kodu setujem ItemTemplate za ListView.

Dakle imam ovakav kod:

Code (csharp):


private void SetTemplate(string template){

   this.listView.ItemTemplate = template;


}
 



Naravno, ovo ne prolazi, posto je ItemTemplate tipa ITemplate. Pri tome string template moze da izgleda ovako:

Code:

<li>
   <%# Eval("Data") %>
  <asp:Literal id="ltrItem" runat="server" />
</li>


Kako parsirati ovaj string i setovati ga kao ItemTemplate, a da pri tome sve kontrole budu dodate, i da Eval odradi svoj posao ?

Edit:

String je proizvoljan. Znam da postoji resenje Page.LoadTemplate("control.ascx") ali u ovom slucaju nije primenljivo.
[ pl4stik @ 08.07.2011. 20:29 ] @
Hmmm, mislim da ti logika negde skripi jer template podrazumeva da jedan datasource prikazujesh na vise nacina templateima, a ako vise razlicitih datasource-a prikazujesh onda valjda imash vise template-a...

Doduse, po meni IT podrazumeva da sve moze pitanje je kako al nekad prosto nece slonce u lonce (moze al nece)

Ako sam dobro razumeo pitanje...

Daj konkretan primer ...


[ Igor Gajic @ 08.07.2011. 22:36 ] @
Code (csharp):

namespace WebApplication1
{
    using System;
    using System.Linq;
    using System.Web.UI;

    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string template = @"<li>
                                    <%# Container.DataItem %>
                                   <asp:Literal id="
"ltrItem"" runat=""server"" />
                                   <asp:HyperLink ID="
"hlItem"" runat=""server"" NavigateUrl=""http://www.google.com"" Text=""Google"" />
                                </li>"
;

            this.listViewControl.DataSource = Enumerable.Range(0, 10);
            this.listViewControl.DataBind();

            this.listView.ItemTemplate = new ParseTemplate(template);
            this.listView.DataSource = Enumerable.Range(0, 10);
            this.listView.DataBind();
        }
    }

    public class ParseTemplate : ITemplate
    {
        private string _template;

        public ParseTemplate(string template)
        {
            this._template = template;
        }

        public void InstantiateIn(Control container)
        {
            container.Controls.Add(new LiteralControl(this._template));
        }
    }
}
 


Klasa ParseTemplate bi trebala da radi parsiranje stringa koji se prosledjuje i da promenljivu container popuni sa odgovarajucim promenljivim, i da Eval radi.

U sustinu listView i listViewControl bi trebale da imaju identican output.

Dodao sam i projekat koji bi trebalo da pojasni stvari.
[ Shadowed @ 08.07.2011. 23:47 ] @
Hm, to sto ti hoces je, blago receno, zeznuto da uradis sam jer treba isparsirati taj string koji sadrzi kod. Mogao bi pokusati da iskoristis interne klase (npr TemplateBuilder) ali koliko vidim, sve se svodi na parisranje koda koji je u fajlu a ne u stringu a za tu varijantu vec imas resenje. Mozda je i najbolje da koristis privremene fajlove..
[ Igor Gajic @ 09.07.2011. 00:03 ] @
Nazalost koriscenje temp fajlova nije opcija, a pravljenje custom parsera je suvise zeznuto i trazi daleko vise vremena nego sto imam.
[ Igor Gajic @ 11.07.2011. 15:34 ] @
Na kraju sam resio preko temp .ascx kontrola i LoadTemplate f-je. Drugacije nije moglo...
[ Shadowed @ 11.07.2011. 15:43 ] @
Da, bio sam se i ja udubio malo, framework dosta dugo prosledjuje putanju fajla, tek neke privatne funkcije koje ionako ne mozes pozvati obavljaju pravi posao.