2012-03-27 11 views
0

私は、radiobuttonlistのSelectedIndexをOnSelectedIndexChangedイベントのint配列に取り込むだけです。私は、コードを次のよう試みたが、働いていないでしょう。RadioButtonList.SelectedIndexをIntsの配列に取り込む方法は?

は、私はこのような配列を作る:私は.NETのオンラインテストシステムを作ってるんだ

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;   
} 

。私はRadioButtonListのラベルと回答の質問を変更しています。値はデータベースから来ています。私はRadioButtonListを動的に変更していますが、1つの回答を選択して次のボタンをクリックし、前のボタンを押して戻ると選択が消えます。そのためには、選択されたインデックスをint配列に格納し、次と前のボタンでそのインデックス値を呼び出し、SelectedIndexに入れて、RadioButtonListを押すというロジックがあります。ですから、どうすればOnSelectionChangeのint配列でこの選択された値を取ることができますか?もう1つはRadioButtonListのPost Back Trueを作ることです。

+0

ご質問は混乱しています。選択肢を配列に格納しようとしていますか、または正しい答えの配列に対して選択をチェックしていますか? –

+0

ちょうどアレイに格納する。いいえ比較が必要 –

答えて

0

私は、各ページをインスタンス化するという問題は、配列の新しいインスタンスをロード/ポストバックし、すべてのページ変数がページアンロードが発生した後に消滅すると考えています。したがって、ボタンクリックイベントが発生するたびにポストバックが発生し、ページクラスの新しいインスタンスが作成され、基礎となるフィールドもすべてインスタンス化されます。

明らかに、中間結果をキャッシュする必要があります。そのような少量のデータ(少数のアイテムの配列)は、セッションとみなすことができます。また、配列の代わりに汎用のList<>を使用することを検討してください。特にボクシング/ボックス解除の原因となる値の型を格納する場合

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

こんにちはsll、私はページロードイベントの上にそれを作っているので、ページロード変数としてカウントされますか?第二にあなたのセッションのアイデアは顕著ですが、どのように私はすべての答えのためのセッションを作ることができますか?またはセッションを管理する他の方法はありますか?申し訳ありませんが、私は.Netとその研究所のプロジェクトで新しくなっています –

+0

更新された回答を参照してください、バカンスでセッションのすべてのリストを保持してください、これは数字のリスト(あまり大きなオブジェクトではありません)のためには良いです – sll

+0

@sll: OPコードを再利用するには、上記のコードにいくつかの明白なエラーがあります。それをコンパイルするように修正し、私はupvoteします。 –

1

あなたはあなたが私が収集できるものとされ、動的にコントロールを移入している場合、あなたは、「ユーザーの旅」を通じて値を保持しようとしている方法を検討することになるでしょう。すべてが1ページで計算されている場合は、ViewStateを使用して情報を保持できます。 Control内では、などPageUserControlあなたが行うことができます。

/// <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:これは最高の答えだと思いますが、この場合は設定者が必要であるとは思いません。 –

+0

こんにちは、私はこのタイプの動的管理を行っています。次のボタンの項目をクリアし、データベースから新しい項目をロードします。これを私はダイナミックなことと申します。 –

関連する問題