Hej
Som garvet PHP mand har jeg nu kastet mig ud i den store verden af .Net og er derfor selvfølgelig også begyndt på ASP.Net.
Jeg gik som noget at det første igang med at prøve at lave et forum for at prøve mine evner af og lære sproget og frameworket. Det gik også glimrende og GridView kontrollen er bare herlig til at vise en oversigt over alle tråde der er lavet osv.
Men problemet kom da jeg skulle til at vise alle tråde i et indlæg. Den simpleste måde er jo selvfølgelig bare at droppe en repeater eller datalist på formen og så oprette en datasource og redigere lidt i templaten. Men det dur bare ikke hvis man gerne vil være i stand til at bruge paging, låse det første element på datalisten osv.
Så jeg gik igang med at lave en bedre datalist/repeater, og det går egentlig også meget godt, jeg kan sagtens få lavet noget kode til min kontrol. Men jeg har et par problemer:
- Når jeg er inde og redigere i templates så får jeg ikke "Edit databindings..." smart-tagget frem hvis jeg f.eks. indsætter en label kontrol på min form?
- Jeg har INGEN idé om hvordan jeg skal gøre sådan at man kan trykke Refresh schema på min kontrols smart-tag, at den så loader nogle standard elementer ind (lige som den almindelige datalist).
- Jeg er ikke helt sikker på om min måde at databinde templatesne på er rigtig.
Så jeg søger selvfølgelig svar på disse spørgsmål og derudover vil en håndfuld links til udvikling af templated og databound (og gerne begge dele kombineret) være ekstremt hjælpsomme.
Min, lidt lange, kildekode ser ud som følger (der mangler stadig meget funktionalitet, men nu vil jeg lige få fod på disse ting først, så jeg ikke ender med at skulle redesigne alt for meget).
EXDataList.cs
using System;
using System.Collections.Generic;
using System.Collections;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.Design;
using System.Web.UI.Design.WebControls;
namespace Scp.Web.Controls
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:ExDataList runat=server></{0}:ExDataList>")]
[ParseChildren(true)]
[Designer(typeof(EXDataListDesigner))]
public class EXDataList : CompositeDataBoundControl, INamingContainer
{
#region Properties
#region Templates
private ITemplate itemTemplate;
[Browsable(false)]
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateContainer(typeof(EXDataListItem))]
public ITemplate ItemTemplate
{
get
{
return itemTemplate;
}
set
{
itemTemplate = value;
}
}
private ITemplate alternatingItemTemplate;
[Browsable(false)]
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateContainer(typeof(EXDataListItem))]
public ITemplate AlternatingItemTemplate
{
get
{
return alternatingItemTemplate;
}
set
{
alternatingItemTemplate = value;
}
}
#endregion
#region Paging
[Category("Paging")]
[DefaultValue(false)]
public bool AllowPaging
{
get
{
object s = ViewState["AllowPaging"];
if (s != null)
{
return (bool)s;
}
else
{
return false;
}
}
set
{
if (value != AllowPaging)
{
ViewState["AllowPaging"] = value;
}
if (base.Initialized)
{
base.RequiresDataBinding = true;
}
}
}
[Category("Paging")]
[DefaultValue(10)]
public int PageSize
{
get
{
object s = ViewState["PageSize"];
if (s != null)
{
return (int)s;
}
else
{
return 10;
}
}
set
{
if (value != PageSize)
{
ViewState["PageSize"] = value;
}
if (base.Initialized)
{
base.RequiresDataBinding = true;
}
}
}
[Category("Paging")]
[DefaultValue(0)]
public int PageIndex
{
get
{
object s = ViewState["PageIndex"];
if (s != null)
{
return (int)s;
}
else
{
return 0;
}
}
set
{
if (value != PageIndex)
{
ViewState["PageIndex"] = value;
}
if (base.Initialized)
{
base.RequiresDataBinding = true;
}
}
}
#endregion
#region Items
private Collection<EXDataListItemCollection> items;
protected virtual Collection<EXDataListItemCollection> Items
{
get
{
Collection<EXDataListItemCollection> s = items;
if (s == null)
{
s = new Collection<EXDataListItemCollection>();
}
return s;
}
}
public override ControlCollection Controls
{
get
{
this.EnsureChildControls();
return base.Controls;
}
}
#endregion
#endregion
protected override void RenderContents(HtmlTextWriter writer)
{
base.RenderContents(writer);
}
public override void DataBind()
{
base.DataBind();
}
protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding)
{
int count = 0;
if (!dataBinding && dataSource == null)
{
dataSource = new DummyDataSource((int)ViewState["_ItemCount"]);
}
if (dataSource != null)
{
IEnumerator it = dataSource.GetEnumerator();
while (it.MoveNext())
{
object o = it.Current;
EXDataListItem item = new EXDataListItem(o, PageIndex * PageSize + count, count);
Items.Add(item);
Controls.Add(item);
if (ItemTemplate != null)
{
ItemTemplate.InstantiateIn(item);
}
else
{
((ITemplate)new EXDataListItemTemplate(this)).InstantiateIn(item);
}
item.DataBind();
count++;
}
}
if (dataBinding)
{
ViewState["_ItemCount"] = count;
}
return count;
}
}
}
EXDataListItem.cs
using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.Design;
using System.Web.UI.Design.WebControls;
namespace Scp.Web.Controls
{
public class EXDataListItem : Control, IDataItemContainer, INamingContainer
{
public EXDataListItem(object dataItem, int itemIndex, int displayIndex)
{
this.dataItem = dataItem;
this.itemIndex = itemIndex;
this.displayIndex = displayIndex;
}
private object dataItem;
private int itemIndex, displayIndex;
#region IDataItemContainer Members
public object DataItem
{
get { return dataItem; }
}
public int DataItemIndex
{
get { return itemIndex; }
}
public int DisplayIndex
{
get { return displayIndex; }
}
#endregion
}
}
EXDataListDesigner.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.Design;
using System.Web.UI.Design.WebControls;
namespace Scp.Web.Controls
{
class EXDataListDesigner : DataBoundControlDesigner
{
public override void Initialize(IComponent component)
{
base.Initialize(component);
SetViewFlags(ViewFlags.TemplateEditing, true);
}
private TemplateGroupCollection Col;
public override TemplateGroupCollection TemplateGroups
{
get
{
if (Col == null)
{
TemplateGroupCollection col = base.TemplateGroups;
TemplateGroup tg = new TemplateGroup("Item Templates");
tg.AddTemplateDefinition(
new TemplateDefinition(
this,
"ItemTemplate",
(EXDataList)Component,
"ItemTemplate")
);
tg.AddTemplateDefinition(
new TemplateDefinition(
this,
"AlternatingItemTemplate",
(EXDataList)Component,
"AlternatingItemTemplate")
);
col.Add(tg);
Col = col;
}
return Col;
}
}
}
}
EXDataListItemTemplate.cs (ved ikke om sådan en klasse overhovedet skal bruges?)
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Scp.Web.Controls
{
public sealed class EXDataListItemTemplate : ITemplate
{
private EXDataList owner;
public EXDataListItemTemplate(EXDataList owner)
{
this.owner = owner;
}
#region ITemplate Members
void ITemplate.InstantiateIn(Control container)
{
container.Controls.Add(new LiteralControl(owner.ID));
}
#endregion
}
}
Som det kan ses mangler der stadig at blive skrevet en masse kode rundt omkring, og en masse properties bliver ikke engang brugt til noget som helst, dette laver bare en basis repeater der gør brug af databinding og templates, den kan ikke noget specielt (endnu).
Men jeg håber at der er nogle åbne sjæle derude der enten vil se hvad jeg mangler i min kode, eller smide en masse dejlige links i hovedet på mig!
Indlæg senest redigeret d. 14.04.2006 00:11 af Bruger #714