Gå til innhold

ASP: [LØST] DropDownList.SelectedIndex returnerer alltid 0


Anbefalte innlegg

Jeg holder på å lage et simpelt "handlekurvsystem" som en del av et større system. Formålet med "handlekurven" er at den skal vise valgte elementer og la brukeren legge til og fjerne elementer ved behov.

 

Koden fungerer fotreffelig, med unntak av DropDownList.SelectedIndex som til en hver tid returnerer 0. Jeg bruker listen til å velge elementet som skal fjernes.

 

Er det noen som har peiling på hvorfor den ikke returnerer riktig verdi? Jeg har gjort det samme før i både windows forms og med ASP uten at det har bydd på problemer.

 

		protected void Page_Load(object sender, EventArgs e)
	{
		if (!Page.IsCallback)
		{
			tempList.Add("doc1");
			tempList.Add("doc2");
			tempList.Add("doc3");
			tempList.Add("doc4");
			tempList.Add("doc5");
			tempList.Add("doc6");

			printSelectedDocs(tempList);
		}

	}

	private void printSelectedDocs(List<string> selectedDocs)
	{
		string docString = null;
		removeDocumentDropDownList.Items.Clear();

		removeDocumentDropDownList.Items.Add("**SELECT**");

		for (int i = 0; i < selectedDocs.Count; i++)
		{
			docString += selectedDocs[i] + "\n";

			ListItem lstItem = new ListItem(selectedDocs[i].ToString());
			removeDocumentDropDownList.Items.Add(selectedDocs[i]);
		}

		selectedDocsTextBox.Text = docString;
	}

	protected void removeDocumentButton_Click(object sender, EventArgs e)
	{
		int selectedDocNr = removeDocumentDropDownList.SelectedIndex;

		if (selectedDocNr > 0)
		{
			tempList.RemoveAt(selectedDocNr);
		}

		printSelectedDocs(tempList);
	}

 

 

	<asp:DropDownList ID="removeDocumentDropDownList" runat="server">
</asp:DropDownList>
<asp:Button ID="removeDocumentButton" runat="server" CausesValidation="False" 
	onclick="removeDocumentButton_Click" Text="Remove Document" />

 

Setter stor pris på all hjelp!

 

Mvh

 

Francis

 

EDIT: tempList skal ikke populeres slik den gjør nå. Jeg har simpelthen lagt til "dummy data" for testing.

Endret av :Francis:
Lenke til kommentar
Videoannonse
Annonse
Hvordan populerer du tempList på postbacks? Hva er tempList?

..Og når du nå har løst det første problemet, så du ikke lenger nuker removeDocumentDropDownList ved hver postback, så får du problemer med det jeg kommenterer over - hvordan skal tempList ha noen verdier på postbacks, når du hverken lagrer den i sesjonen, user controls eller i viewstate?

Generelt bør man unngå bruk av sesjon, med mindre det er en kontekst, som brukerlogin/handlekurv, eller det er store ting som uploadede filer og sånt.

Her kan en handlekurv kanskje gjemmes i sesjonen.

Lenke til kommentar

Jeg er ikke helt sikker på om vi forstår hverandre (det er meget sannsynlig at jeg er feilkilden).

 

gjør jeg slik:

 

		protected void removeDocumentButton_Click(object sender, EventArgs e)
	{
		int selectedDocNr = 4; //removeDocumentDropDownList.SelectedIndex;

		if (selectedDocNr > 0)
		{
			tempList.RemoveAt(selectedDocNr);
		}

		printSelectedDocs(tempList);
	}

 

Og trykker på knappen, så slettes element 4, og siden repopuleres med de riktige verdiene.

 

Problemet mitt er at removeDocumentDropDownList.SelectedIndex; returnerer 0 uansett hva som er valgt i removeDocumentDropDownList.

 

Til sammenligning bruker jeg .Text på DropDownList i andre klasser uten problemer - som i SQL spørringen du oppfordret meg til å parametisere for å unngå injection. :hmm:

 

Beklager hvis jeg er utrolig treg nå :/

 

Mvh

 

Francis

Endret av :Francis:
Lenke til kommentar

Nå føler jeg meg passe teit.

 

Jeg leste:

 

if (!Page.IsCallback)

 

I koden min som:

 

if (!Page.IsPostBack)

 

Og kunne ikke skjønne hvorfor du foreslo noe jeg allerede hadde gjort - my bad!

 

Nå er listen min tom, slik du beskrev det kom til å skje, så jeg får rydde opp i det etter at jeg har skjønt 100% hvorfor den tømmes.

 

Tusen takk for hjelpa!

 

Mvh

 

Francis

Endret av :Francis:
Lenke til kommentar
Nå er listen min tom, slik du beskrev det kom til å skje, så jeg får rydde opp i det etter at jeg har skjønt 100% hvorfor den tømmes.

Koden din kjører "fra start" hver postback - lokale variabler, som tmpList, blir derfor instansiert på nytt. Får de ingen verdi, så har de ingen verdi.

Du kan f.eks. stappe den i viewstaten på siden eller i sesjonen. Så kan du lese den igjen derfra.

Klassiker: (Bare knastret inn, ikke kompilert)

		private List<string> m_Foo = null;
	private List<string> Foo
	{
		get
		{
			if (m_Foo == null)
			{
				m_Foo = Session["MyFooList"];
				if (m_Foo == null)
				{
					m_Foo = new List<string>();
					Session["MyFooList"] = m_Foo;
				}
			}
			return m_Foo;
		}
	}

..Og så bruker du bare Foo i koden din når du skal ha listen.

Potensielt kan det være et thread-issue der, men det gadde jeg ikke kikke på i denne sammenhengen. ;)

Lenke til kommentar

Jeg vil helst slippe å dra session inn i dette hvis jeg kan unngå det.

 

Kommer jeg til helvete hvis jeg løser det slik?:

 

		private void printSelectedDocs(List<string> selectedDocs)
	{
		string docString = null;

		for (int i = 0; i < selectedDocs.Count; i++)
		{
			if (selectedDocs[i] != "**SELECT**")
			{
				docString += selectedDocs[i] + "\n";
			}

			ListItem lstItem = new ListItem(selectedDocs[i].ToString());
			removeDocumentDropDownList.Items.Add(selectedDocs[i]);
		}

		selectedDocsTextBox.Text = docString;
	}

	protected void removeDocumentButton_Click(object sender, EventArgs e)
	{
		int counter = removeDocumentDropDownList.Items.Count;

		for (int i = 0; i < counter; i++)
		{
			tempList.Add(removeDocumentDropDownList.Items[i].ToString());
		}

		int selectedDocNr = removeDocumentDropDownList.SelectedIndex;

		if (selectedDocNr > 0)
		{
			tempList.RemoveAt(selectedDocNr);
		}
		removeDocumentDropDownList.Items.Clear();
		printSelectedDocs(tempList);
	}

Endret av :Francis:
Lenke til kommentar

..men så bare bruk dropdown-listen til å lagre dataene dine i.

		protected void removeDocumentButton_Click(object sender, EventArgs e)
	{
		removeDocumentDropDownList.Items.RemoveAt(removeDocumentDropDownList.SelectedIndex);
		printSelectedDocs()
	}


	private void printSelectedDocs()
	{
		string docString = "";

		foreach (ListItem li in removeDocumentDropDownList.Items)
		{
			if (li.Value != "**SELECT**")
			{
				docString += li.Value + "\n";
			}
		}
		selectedDocsTextBox.Text = docString;
	}

Lenke til kommentar

Takk igjen!

 

Det var lurt å bruke foreach i printSelectedDocs - mye smidigere enn det jeg hadde gjort!

 

Jeg har tidligere kun brukt foreach sammen med en eller flere delimiters for å splite strenger på bestemte chars.

 

 

Jeg ser på det som en viktig del av læringsprosessen å bli korrigert slik. På den måten åpner man øynene opp for andre og bedre måter å løse samme problem på, og man kan ta med seg erfaringene videre og bygge på de.

 

Mvh

 

Francis

Lenke til kommentar
Takk igjen!

 

Det var lurt å bruke foreach i printSelectedDocs - mye smidigere enn det jeg hadde gjort!

 

Jeg har tidligere kun brukt foreach sammen med en eller flere delimiters for å splite strenger på bestemte chars.

 

 

Jeg ser på det som en viktig del av læringsprosessen å bli korrigert slik. På den måten åpner man øynene opp for andre og bedre måter å løse samme problem på, og man kan ta med seg erfaringene videre og bygge på de.

 

Mvh

 

Francis

Helt klart viktig å lære hva som finnes i libraries, runtimesystemet, best practices og sånt. Erfaring kommer nok. :)

Ellers: Skal du splitte strenger - ikke bruk foreach - bruk heller string.Split().

string foo = (...);

string[] fooSplit = foo.Split(' ', '/t', '/r', '/n');

 

Split er en funksjon som tar "params" - dvs uendelig antall videre parametre. Penere enn foo.Split(new char[] = {' ', '/t', '/r', '/n'}); og lignende.. :)

 

Lykke til videre!

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...