webForumDet fria alternativet

Ett slags kategori system

.NET

4 svar · 296 visningar · startad av thevice

Medlem sedan dec. 2005198 inlägg
Frågan#1

Hej

Jag håller har en databas med en massa olika produkter. Varje produkt tillhör ett ID. Jag vill nu kunna loopa ut alla produkter som har ID 1, ID 2 osv. Och skriva skriva över alla som har ID 1 att det är ID 1 kategorierna som skrivs ut under.

Problem 1: Det kan finnas hur många olika IDn som helst. Från 1-2 till 1-100. Så jag kan inte bara göra en repeater för varje ID.

Problem 2: IDt står i samma rad som informationen som jag vill ha ut i databasen. Så databasen kan alltså bestå utav 50 produkter som har ID 1. 20 produkter som har ID 2 osv. Så därför när jag har försökt att göra en nästlad repeater så går det inte. Jag har tidigare gjort en tabell för kategorierna och en annan för produkterna. Men det går inte nu då det kan finnas hur många olika ID´n som helst. Eller inga alls om det inte finns några produkter.

Produkterna varierar alltså från varje gång. Jag håller på att göra ett "raportera system" där det så kallade IDt är numret på kartongen som produkterna ska ligga i.

Hur ska jag bära mig åt för att kunna loopa ut alla kartonger?

/ Timmie

Medlem sedan jan. 20022 440 inlägg
#2

/red såg inte att du redan försökt med nestlade repeaters

Jag ser inte varför det skulle vara några problem dock. Du spottar ju först ut ID och headern för varje hmm "kontrollID" sedan en nestlad repeater som spottar ut alla som tillhör "kontrollID't varför blir det problem?

Medlem sedan maj 20012 812 inlägg
#3

thevice:

Är det något sånt här som du tänkt dig?

1. KATEGORI
- Produkt
- Produkt
- Produkt

2. KATEGORI
- Produkt

4. KATEGORI
- Produkt
- Produkt
- Produkt
- Produkt
- Produkt

Om det är något sådant, så löser man det genom att ha 1 repeater (eller datalist eller något annat som kan lista dina poster) där du från databasen plockar fram alla produkter samt namnet för kategorien.

Här kommer lite kod som visar hur jag gjort en sådan lösning.

ASPX-sida

	<asp:datalist id="dlArticles" runat="server" onitemdatabound="dlArticles_onItemDataBound">
		<itemtemplate>
			<div class="articleRef">
				<asp:panel id="panelCategory" runat="server" cssclass="articleListCategory" visible="false">
					Kategori: <asp:label id="lblCategory"  cssclass="color" runat="server" />
				</asp:panel>
				
				<ts:clickablepanel id="panelArticle" runat="server" onclick="clickablePanel_Click"  cssclass="panelArticle">
					<h2 style="margin: 0px 0px 3px 0px;">
						<asp:image id="imgArticleHeader" skinid="imgArticleHeader" runat="server" />
						<asp:label id="lblHeader" runat="server"></asp:label>
					</h2>
					<div>
						<asp:label id="lblMessage" runat="server" />
					</div>
				</ts:clickablepanel>
			</div>
		</itemtemplate>
	</asp:datalist>

Codebehind

	#region -- Declarations
	private Category _Category;
	#endregion

	private void HandleCategory(DataListItem dataListItem)
	{
		//-- Get item
		Article entity = dataListItem.DataItem as Article;

		//-- Check if this category is same as old one
		if (entity.Category == null || (_Category != null && _Category.Identifier == entity.CategoryIdentifier))
			return;

		//-- this is not same category
		_Category = entity.Category;
		((Panel)dataListItem.FindControl("panelCategory")).Visible = true;
		((Label)dataListItem.FindControl("lblCategory")).Text = _Category.Name;
	}
	private void HandleArticle(DataListItem dataListItem)
	{
		//-- Get item
		Article entity = (Article)dataListItem.DataItem;

		if (entity == null)
			return;

		((ClickablePanel)dataListItem.FindControl("panelArticle")).Attributes.Add("identifier", entity.Identifier.ToString());
		((Label)dataListItem.FindControl("lblHeader")).Text = (entity.Subject.Length > 60 ? entity.Subject.Substring(0,57) + "..." : entity.Subject);
        ((Label)dataListItem.FindControl("lblHeader")).ToolTip = entity.Subject;
        ((Label)dataListItem.FindControl("lblMessage")).ToolTip = entity.Subject;
        ((Label)dataListItem.FindControl("lblMessage")).Text = (entity.HTMLMessageNoBold.Length > 200 ? entity.HTMLMessageNoBold.Substring(0, 200) + "..." : entity.HTMLMessageNoBold);
	}

	protected void dlArticles_onItemDataBound(object sender, DataListItemEventArgs dataListEventArgs)
	{
		switch (dataListEventArgs.Item.ItemType)
		{
			case ListItemType.AlternatingItem:
			case ListItemType.Item:
				HandleCategory(dataListEventArgs.Item);
				HandleArticle(dataListEventArgs.Item);
				break;
		}
	}

Hoppas det hjälper dig...

- M

Medlem sedan dec. 2005198 inlägg
#4

Tackar, det är precis så om jag vill ha det. Löste det på nästan samma sätt som detta i ASP. Men kunde inte komma på hur jag skulle göra. Återkommer med raport hur det gick. ;)

Edit;

Nej tyvärr Gladh, jag har inte kunskaper för att klara av den koden. Vad är entity, Article?

Medlem sedan maj 20012 812 inlägg
#5

thevice skrev:

Vad är entity, Article?

Eftersom jag inte använder mig av DataSet/DataTable/Datareader utan mappar min data till objekt, så är det objekt/klasser som du ser där.

Article är helt enkelt en klass (motsvara en tabell i databasen) och entity är ett objekt av typen article (motsvara en rad i tabellen).

gladh skrev:

//-- Get item
Article entity = dataListItem.DataItem as Article;

Motsvaras säkert av typ, kanske, möjligtviss:

DataRow dr = dataListItem.DataItem as DataRow

i din kod om du binder en datatable direkt till datalistan.

Titta inte så mycket på själva koden, utan strukturen istället, med att använd eventen i codebehind, och hur jag löste hanteringen med kategorierna.

- M

- M

278 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
133 ms — ändringar (db)