2012-03-27 7 views
0

Ich möchte SelectedIndex von radioButtonlist nur in ein int-Array OnSelectedIndexChanged -Ereignis nehmen. Ich habe versucht, folgenden Code wird aber nicht gearbeitet:Wie RadioButtonList.SelectedIndex in ein Array von Ints zu nehmen?

ich mache ein Array wie folgt aus:

int[] correctAnswers = { -1, -1, -1, -1, -1 }; and i tried this as well:  
int[] correctAnswers = new int[100]; 

//SelectionChangeEvent  
protected void rbAnswers_SelectedIndexChanged(object sender, EventArgs e)  
{    
    int j = rbAnswers.SelectedIndex;     
    correctAnswers.SetValue(j, i); //or correctAnswers[i] = j;   
} 

ich ein Online-Testsystem in .Net machen werde. Ich ändere die Frage in Label und Antworten in RadioButtonList. Die Werte stammen aus der Datenbank. und ich ändere RadioButtonList dynamisch, aber wenn ich eine Antwort auswähle und auf Weiter klicke und dann zurückspringe, drücke ich die vorherige Taste, verschwindet meine Auswahl. also dafür habe ich eine logik, die ausgewählten index in einem int-array speichern soll und auf der nächsten und vorherigen taste diesen index-wert aufrufen und in SelectedIndex stroke von RadioButtonList eintragen. also bitte helfen Sie mir heraus, wie kann ich diesen ausgewählten Wert in einem int-Array auf OnSelectionChange nehmen? und eine weitere Ergänzung ist, dass ich Post TrueBase von RadioButtonList True.

+0

Ihre Frage verwirrend ist. Versuchen Sie, die Auswahl in einem Array zu speichern, oder überprüfen Sie die Auswahl anhand eines Arrays mit richtigen Antworten? –

+0

Möchten nur in einem Array speichern. kein Vergleich Benötigt –

Antwort

0

Ich glaube, das Problem, dass Sie jede Seite laden/pictctback eine neue Instanz des Arrays instanziieren, alle Seiten Variablen stirbt nach Seite UnLoad passiert. Jedes Mal, wenn ein Button-Click-Ereignis ausgelöst wurde, erhalten Sie ein Postback - eine neue Instanz der Page-Klasse wird erstellt und alle darunter liegenden Felder werden ebenfalls instanziiert.

Offensichtlich müssen Sie Zwischenergebnisse zwischenspeichern, für solch eine kleine Menge von Daten (wenige Artikel Array) können Sie Sitzung betrachten. Ziehen Sie auch die Verwendung von generischem List<> anstelle von Array in Betracht, insbesondere beim Speichern von Werttypen, die zum Boxing/Unboxing führen.

class MyPage: Page 
{ 
    private IList<int> correctAnswers; 
    private readonly string cacheKey = "cachedResults"; 

    protected void Page_Load(object sender, EventARgs args) 
    { 
     this.LoadCache(); 
    } 

    protected void rbAnswers_SelectedIndexChanged(object sender, EventArgs e)  
    {    
     if (rbAnswers.SelectedIndex >= 0) 
     { 
      // TODO: ensure there are enough allocated items 
      // so indexer [] would not throw 
      correctAnswers[rbAnswers.SelectedIndex] = i; 
      this.SyncCache(); 
     } 
    } 

    private LoadCache() 
    { 
     var resultsCache = Session[this.cacheKey]; 
     if (resultsCache != null) 
     { 
      this.correctAnswers = resultsCache as List<int>; 
     } 
    } 

    private void SyncCache() 
    { 
     Session[this.cacheKey] = this.correctAnswers; 
    } 
} 
+0

Hallo sll, ich mache es über dem Seitenladeereignis, also zählt es als Seitenladevariable? Zweitens ist Ihre Session-Idee prominent, aber wie kann ich Session für jede Antwort machen? oder gibt es eine andere Möglichkeit, die Sitzung zu verwalten? Entschuldigung, aber ich bin neu in. Net und es ist ein Institut Projekt –

+0

Siehe aktualisierte Antwort, halten Sie einfach alle Liste in der Sitzung, das ist in Ordnung für die Liste der Zahlen (nicht sehr großes Objekt) – sll

+0

@sll: Während ich Ihre Bemühungen zu schätzen wissen Um den Code von OP wiederzuverwenden, gibt es einige offensichtliche Fehler im obigen Code. Repariere es, damit es kompiliert und ich werde upvote. –

1

Wenn Sie Ihr Steuerelement dynamisch bevölkern, die von dem, was ich sammeln kann Sie sind, möchten Sie überlegen, wie Sie Werte bestehen bleiben während der „user Reise“ gehen. Wenn alles auf einer einzelnen Seite berechnet wird, können Sie die ViewState Informationen beibehalten. Innerhalb eines Control, wie ein Page oder UserControl können Sie tun:

/// <summary> 
/// Gets or sets the answers to the view state 
/// </summary> 
private List<int> Answers 
{ 
    get 
    { 
     // attempt to load the answers from the view state 
     var viewStateAnswers = ViewState["Answers"]; 

     // if the answers are null, or not a list, create a new list and save to viewstate 
     if (viewStateAnswers == null || !(viewStateAnswers is List<int>)) 
     { 
      Answers = new List<int>(); 
     } 

     // return the answers list 
     return (List<int>)viewStateAnswers; 
    } 
    set 
    { 
     // saves a list to the view state 
     var viewStateAnswers = ViewState["Answers"]; 
    } 
} 
+0

+1: Ich denke, das ist die beste Antwort, aber ich glaube nicht, dass ein Setter in diesem Fall benötigt werden sollte. –

+0

Hallo, ich mache diese Art der dynamischen Verwaltung ich nur die Elemente auf der nächsten Schaltfläche löschen und neue Artikel aus der Datenbank laden. das, was ich Dynamisch genannt habe, sorry dafür. –

Verwandte Themen