[ASP.Net / C#] DropDownLists krijgen ongewild elkaars value

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Kyoshi
  • Registratie: December 2006
  • Laatst online: 09-09 12:05
Ik ben bezig met een enquêtesysteem. In de beheermodule is het voor de gebruiker mogelijk om per vraag 2 of meer antwoordmogelijkheden op te geven en bijbehorend een vervolgvraag.

Ik heb een DropDownList waar ik alle vraagnummers in laat verschijnen en bij het SelectedIndexChanged event laat ik alle eigenschappen van die vraag volledig weergeven op het scherm. Dit gaat allemaal prima behalve de weergave van de juiste vervolgvraag.

Op de pagina is vooraf een Panel met daarin in tabel met 10 keer een row met een TextBox voor de inhoud van de antwoordmogelijk en een DropDownList om het vraagnummer van de vervolgvraag te selecteren.

Het probleem is dat wanneer ik de .SelectedValue property van 1 van de 10 DropDownLists aanpas is dat zij allemaal diezelfde property krijgen. Ik heb werkelijk geen idee waarom. Alle DropDownLists hebben dezelfde ListItems, namelijk alle vragen in de enquête met als Text het volgnummer en als value het vraagnummer. Zij hebben niet hetzelfde ID. (cbxAnswer1, cbxAnswer2, t/m 10)

SelectedIndexChanged Event:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
int QuestionId = Convert.ToInt32(dpdQuestions.SelectedValue);

// Get the original Question before clearing
Question q = new Question(QuestionId);

// All neccesary data collected; clear old data from the Form first
ClearPnlQuestions();

// Set the QuestionId value again
dpdQuestions.SelectedValue = QuestionId.ToString();

// Set
txtQuestionContent.Text = q.QuestionContent;
rbtnQuestionType.SelectedValue = q.QuestionType.ToString();

// Prepare the Panel, enables the right amount of TextBoxes
PrepareQuestionAnswerOptionForm();

// Get all Controls in an Array to set when necessary
// Sequence:
List<DropDownList> cbxList = new List<DropDownList>(); cbxList.Add(cbxAnswer1); cbxList.Add(cbxAnswer2); cbxList.Add(cbxAnswer3); cbxList.Add(cbxAnswer4); cbxList.Add(cbxAnswer5); cbxList.Add(cbxAnswer6); cbxList.Add(cbxAnswer7); cbxList.Add(cbxAnswer8); cbxList.Add(cbxAnswer9); cbxList.Add(cbxAnswer10);
// Content:
List<TextBox> txtList = new List<TextBox>(); txtList.Add(AnswerTextBox1); txtList.Add(AnswerTextBox2); txtList.Add(AnswerTextBox3); txtList.Add(AnswerTextBox4); txtList.Add(AnswerTextBox5); txtList.Add(AnswerTextBox6); txtList.Add(AnswerTextBox7); txtList.Add(AnswerTextBox8); txtList.Add(AnswerTextBox9); txtList.Add(AnswerTextBox10);

// Add QuestionAnswerOptions
for (int i = 0; i < q.QuestionAnswerOptions.Count; i++)
{
    // Set Content
    txtList[i].Text = q.QuestionAnswerOptions[i].AnswerContent;

    if (q.QuestionAnswerOptions[i].NextQuestion != 0)
    {
        // Get the follow-up Question object
        Question next = Data.GetQuestionByQuestionId(q.QuestionAnswerOptions[i].NextQuestion);

        // Select the value
        cbxList[i].SelectedValue = Convert.ToString(next.QuestionId);

        // At this point all DropDownLists in cbxList have the same properties which should be the    DropDownList at index i only.
    }
    else // No Next question specified
    {
        // Select the "End Survey" option
        cbxList[i].SelectedValue = "end";
    }
}


Iemand enig idee wat het kan zijn?

Acties:
  • 0 Henk 'm!

  • DoDo
  • Registratie: Juli 2001
  • Laatst online: 16-09 17:37
Weet je zeker dat

// Select the value
cbxList[i].SelectedValue = Convert.ToString(next.QuestionId);

Maar een keer word uitegevoerd? En niet voor elke waarde van I

Acties:
  • 0 Henk 'm!

  • Kyoshi
  • Registratie: December 2006
  • Laatst online: 09-09 12:05
Daar ben ik vrij zeker van. Op het moment dat de value voor cbxList[i] wordt aangepast is de for loop klaar en wordt i++ uitgevoerd. Daarna zou de volgende DropDownList in de List aangesproken moeten worden.

Ook door een breakpoint te setten en te controleren direct voor en na de set, toch worden alle objecten aangepast.

Ik gebruik overigens precies hetzelfde principe bij txtList<TextBox> en daar werkt het naar behoren.

[ Voor 13% gewijzigd door Kyoshi op 09-05-2010 22:40 ]


Acties:
  • 0 Henk 'm!

  • DoDo
  • Registratie: Juli 2001
  • Laatst online: 16-09 17:37
Misschien dat ik je vraag dan niet begrijp, maar daar komt het toch op neer? Bij elke waarde van I haal je een dropdownlist uit de lijst, waarop je de selecteditem zet.

Aangezien je vraag nooit veranderd, is voor elke I het volgende gelijk:
q.QuestionAnswerOptions[i].NextQuestion != 0

Daardoor doet hij voor elk item in de lijst hetzelfde.

Acties:
  • 0 Henk 'm!

  • Kyoshi
  • Registratie: December 2006
  • Laatst online: 09-09 12:05
De vraag q hoeft niet te veranderen; q heeft een aantal antwoordopties gelijk aan i waarbij elke antwoordoptie een andere vervolgvraag kan hebben, deze wens ik weer te geven. Ik heb ook met debugging gecontroleerd dat wanneer i = 1 en deze ècht bij cbxList[1] wordt gebruikt desondanks toch cbxList[0] ook dezelfde waarde krijgt terwijl deze anders zou moeten zijn.

C#:
1
2
// Get the follow-up Question object 
Question next = Data.GetQuestionByQuestionId(q.QuestionAnswerOptions[i].NextQuestion); 


In ieder geval bedankt voor je feedback. Het probleem treedt op, en ook alleen als 1 DropDownList uit de List<> aangepast wordt.

Acties:
  • 0 Henk 'm!

  • Peelee
  • Registratie: Mei 2010
  • Laatst online: 04-01-2021
Hoe wordt de lijst van keuzeitems uit je DropDownLists precies opgevuld? Als je bind op eenzelfde collectie, dan zal door het zetten van de SelectedValue die collectie naar een bepaald item verwijzen. Alle DropDownList-items verwijzen zo naar hetzelfde item.
Probeer eens om elke DropDownList aan een nieuwe instantie van je waardencollectie te binden.

Acties:
  • 0 Henk 'm!

  • Kyoshi
  • Registratie: December 2006
  • Laatst online: 09-09 12:05
Peelee,

Dat precies het probleem ben ik nu achter. Ze verwezen inderdaad allemaal naar hetzelfde ListItem. Ik vulde alleen 1 van de DropDownLists en dacht de ListItems te kopiëren naar de overige 9...

Voorheen:

C#:
1
2
3
4
5
6
7
8
9
10
11
for (int i = 1; i < cbxList.Count; i++)
                {
                    // Clear list
                    cbxList[i].Items.Clear();

                    // Add each item
                    foreach (ListItem li in cbxList[0].Items)
                    {
                        cbxList[i].Items.Add(li);
                    }
                }


Nu:

C#:
1
2
3
4
5
6
7
8
9
10
11
for (int i = 1; i < cbxList.Count; i++)
                {
                    // Clear list
                    cbxList[i].Items.Clear();

                    // Add each item
                    foreach (ListItem li in cbxList[0].Items)
                    {
                        cbxList[i].Items.Add(new ListItem(li.Text, li.Value));
                    }
                }


Heel erg bedankt! Ik heb me echt kapot gezocht waar het nou moest zitten!
Pagina: 1