Repeater mit Datalist - brauche schnelle Hilfe für eine Präsentation

20/04/2010 - 19:19 von Axel | Report spam
Hi,

ich habe den folgenden Artikel über "Web User Controls in Repeaters with
DataList" gelesen:

http://www.c-sharpcorner.com/Upload...PartA.aspx

Versuche derzeit ein web user control in einen Repeater einzubauen, das
web user control soll Produktattribute aus einer GenericList übernehmen.
Alle Details & Klassen sind schon programmiert (C#), ebenso ein
wunderbares, web user control, aber ich muss die Datasource im Page_Load
Event des _Codes_ der (den Repeater enthaltenden) Seite zuweisen (und
nicht von der aspx Seite) - da erst im Page_Load event the liste der
ProduktAttribute geladen wird:

= Seite, die den Repeater enthàlt (Auszug) ==private Product _Product;

Page_Load ...
if (_Product.hasMasterAttributes) {
if (Language == MasterLanguage)
this.repeatAttributes.DataSource = _Product.masterAttributeList;
else
this.repeatAttributes.DataSource = _Product.localizedAttributeList;
}


Produkt Klasse (Auszug) // the constructor fills the attributes from the database
// these generic lists shall be used as DataSource for the repeater
// enthàlt 2 generische Listen, die Englische Attribut liste
// und eine Übersetzung (für ein lokalisierungs - Interface, das ich
spàter implementieren werde)
public List<ProductAttribute> masterAttributeList
= new List<ProductAttribute>();
public List<ProductAttribute> localizedAttributeList
= new List<ProductAttribute>();

public Int16 ProductStatus { get.. let...};
public int localizedLanguageId=0;

ProductAttribute Klasse (komplett);
Ihre Instanzen sind die items der generischen Listen oben ==public class ProductAttribute
{
// lazy interface a la 'struct'
public int ProductId;
public int LanguageId;
public int AttributeCount;
public string ContentTitle;
public string ContentType;
public string ContentText;
public string AltText;
public string ToolTipText;
public string URI;
public int SequenceCount;

// Konstruktor
public ProductAttribute (int lProductId, int lLanguageId, int
lAttributeCount, string sContentTitle, string sContentType, string
sContentText, string sAltText, string sToolTipText, string sURI, int
lSequenceCount)
{
this.ProductId = lProductId;
this.LanguageId =lLanguageId;
this.AttributeCount = lAttributeCount;

this.ContentTitle = sContentTitle;
this.ContentType = sContentType;
this.ContentText = sContentText;
this.AltText = sAltText;
this.ToolTipText = sToolTipText;
this.URI = sURI;

this.SequenceCount = lSequenceCount;
}
}

Die Produkt Klasse enthàlt eine Generic List aus ProductAttribute
Instanzen. (ProductAttribute is a very simple class which just serves as
strongly typed container for my attributes).

Die verschiedenen Attribute der ProductAttribute (zB
ContentText, URL etc) werden als Properties publziert.

Ausserdem have ich dieselben public properties im Web User Control um
die attribute von der ProductAttribute instanz in das Web User Control
kopiert werden kÖnnen. Womit ich wirklich Schwierigkeiten habe ist dert
Prozess des Bindens im ItemTemplate, ausserdem würde ich das lieber im
C# code tun - da könnte ich dann auch gleich debuggen um zu lernen wie
das binden vor sich geht. Kompilierfehler sind mir auch lieber als
RUnTime syntax errors.

wisst ihr ob es möglich ist die stattdessen in einem event zu binden?

Hier ist der derzeitige HTML code:

<asp:Repeater ID="repeatAttributes" runat="server"
onitemdatabound="repeatAttributes_ItemDataBound"
onitemcreated="repeatAttributes_ItemCreated" >
<ItemTemplate >
<uc1:EditAttributePanel ID="theAttributePanel"
runat="server"


ContentTitle="<%#DataBinder.Eval(Container.DataItem,"ContentTitle")%>"
Language = "<%#DataBinder.Eval(Container.DataItem,"LanguageId")%>"
Attribute = "<%#DataBinder.Eval(Container.DataItem,"AttributeCount")%>"



/>
</ItemTemplate>
</asp:Repeater>

Wer bis hierhin gelesen hat, dem machts vielleicht auch nix aus auf
Englisch weiter zu lesen - habe genug vom übersetzen ;)

I had quite great trouble with the lines for copying data from the
container List to the properties of the Web User Control (see 3 lkinbes
above in the stripped down example above) lots of runtime compile
errors, and I don't really like that code polluting the aspx file. Also
now that the page is not crashing anymore, it doesn't show anything in
the Repeater, although my generic lists definitelyt contain data; where
can I check what data is being marshalled into the repeater?

Also, can I re-trigger the databinding for the repeater from an
interface of the repeater from code? (Did not find any DataBind() interface)

I would prefer doing all the copying of data between List Item and web
control instance from code, which would give me more control and I could
add validation, is there an event I can use for this??? Or can I replace
the awkward DataBinder.Eval stuff with some public methods on my page??

Another feature that my project provides is a localization interface so
the Product actually contains 2 Generic Lists of Attributes (one for the
Master Language and one for the current translation), which is another
reason that I would like to have the databinding in C# code and not on
the container page itself.

thanks in advance
Axel
 

Lesen sie die antworten

#1 Stefan Falz [MVP]
24/04/2010 - 13:38 | Warnen spam
Hallo Axel,

"Axel" schrieb:

aber ich muss die Datasource im Page_Load
Event des _Codes_ der (den Repeater enthaltenden) Seite zuweisen (und
nicht von der aspx Seite) - da erst im Page_Load event the liste der
ProduktAttribute geladen wird:



ich hab zwar nicht verstanden, was Du damit sagen wolltest aber ich
versuch trotzdem mal, was dazu zu sagen :)

Womit ich wirklich Schwierigkeiten habe ist dert
Prozess des Bindens im ItemTemplate, ausserdem würde ich das lieber im
C# code tun - da könnte ich dann auch gleich debuggen um zu lernen wie
das binden vor sich geht. Kompilierfehler sind mir auch lieber als
RUnTime syntax errors.



In deinem Fall wàre das ItemCreated Ereignis des Repeater Controls wohl
am besten geeignet, um deinen Code anzudocken.

http://msdn.microsoft.com/de-de/lib...eated.aspx

Über die RepeaterItemEventArgs erhàltst Du Zugriff auf das Item und von
dort aus auf dein UserControl.

http://msdn.microsoft.com/de-de/lib...targs.aspx

Wichtig dabei ist, dass Du im Vorfeld prüfst, ob es sich überhaupt um ein
Item bzw. AlternatingItem und nicht etwa um Header, Footer, ... handelt.
(Im o.g. Link wird das auch beschrieben)

Wenn es ein Item ist, kannst Du über e.Item.FindControl( "NameDesControls" )
und einem Cast, bspw. per CType o.à. auf das Control zugreifen und dann die
Eigenschaftswerte manuell zuweisen.



...

Dim MyEditAttributePanel As EditAttributePanel
MyEditAttributePanel.<Property> = <Wert>
MyEditAttributePanel.<AndereProperty> = <AndererWert>

...



Tschau, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

Ähnliche fragen