webForumDet fria alternativet

dropdownlist

6 svar · 423 visningar · startad av DavidB

DavidBMedlem sedan jan. 20001 372 inlägg
#1

tjena

i min codebehind skapar jag några dropdownlists, koden för detta set ut såhär:

DataTable dt = wsd.GetProductAttributes(productid);
foreach(DataRow row in dt.Rows){
	DropDownList ddl = new DropDownList();
	ddl.ID = "ddl_" + row["id"].ToString();
	DataTable av = wsd.GetProductAttributeValues(Convert.ToInt32(row["ID"].ToString()));
	ddl.DataSource = av;
	ddl.SelectedIndexChanged += new EventHandler(changeDDL);
	ddl.AutoPostBack = true;
	ddl.DataTextField = "name";
	ddl.DataValueField = "id";
	ddl.DataBind();

t1.Controls.Add(ddl);
}

funktionen changeDDL ser ut såhär:

private void changeDDL(object Src,EventArgs e){
	int productid = Convert.ToInt32(Request.QueryString["pid"]);

	WebSiteData wsd = new WebSiteData();
	DataTable dt = wsd.GetProductAttributes(productid);

	foreach(DataRow row in dt.Rows){
		DropDownList ddl = (DropDownList)FindControl("ddl_" + row["id"].ToString() + "");
		DataTable av = wsd.GetProductAttributeValuesChange(Convert.ToInt32(row["ID"].ToString()));
		ddl.DataSource = av;
		[b]ddl.DataBind();[/b]
	}
}

när jag kör koden och gör en postback med någon av dropdownlistsen så får jag följande fel:

System.Web.HttpException: DataBinder.Eval: 'System.Data.DataRowView' does not contain a property with the name name.

nån som ser vad som kan vara fel?

GladhMedlem sedan maj 20012 812 inlägg
#2

Eftersom du DYNAMISK skapar dina DropDownListor, så finns dessa inte vid en postback (om du inte återskapar dem).

En ASP.NET sida är Stateless, alltså den kan inte behålla värden/state mellan 2 sidanropningar.

Så om du i din kodbehind skapar en textbox och lägger ut på sidan, om du sedan gör en postback så kommer .NET att återskapa alla de kontroller som du har i din aspx-html kod. De kontroller som du skapat själv i din kodebehind, måste du återskapa en gång till annars så vet inte .NET vad det är för kontroll.

Och eftersom du gör en FindControl() på din sida där du letar efter kontroller som inte finns (eftersom du inte har återskapat dem) så får du felet att .NET inte kan hitta denna kontrol på sidan, eftersom den inte finns.

- Magnus

DavidBMedlem sedan jan. 20001 372 inlägg
#3

Okej, finns det nån lösning på problemet? Jag skapar dropdownlisten i Page_load när sidan körs, hur gör jag för att fylla den med ny data i changeDDL?

Stefan HolmbergMedlem sedan aug. 200136 inlägg
#4

De kontroller som du skapat själv i din kodebehind, måste du återskapa en gång till annars så vet inte .NET vad det är för kontroll.

Korrekt, genom att göra override på CreateChildControls kan du skapa kontrollerna i "rätt" tid så dom finns där innan dom refereras till.

DavidBMedlem sedan jan. 20001 372 inlägg
#5

Du skulle inte vilja förklara lite mer vad det innebär? SÖkte på google men jag hittade inget som gjorde mig direkt klokare

DavidBMedlem sedan jan. 20001 372 inlägg
#6

Nu har jag löst detta problemet.

Har dock en annan grej som jag undrar över. Jag har ju flera dropdownlistar som kör samma funktion vid postback. Går det att få fram vilket ID den dropdownlist som gör postbacken har?
Funktionen ser ut såhär:

private void changeDDL(object Src,EventArgs e){
	// kod
}
GladhMedlem sedan maj 20012 812 inlägg
#7

object src innehåller den dropdownlist som har triggat eventet.

Så om du gör:

((DropDownList)Src).ID

Så skall du få fram ID för just den dropDownlist som har triggat eventet.

- M

130 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)