0

OnSelectedIndexChanged イベントで radiobuttonlist の SelectedIndex を int 配列に取りたいだけです。次のコードを試しましたが、うまくいきません:

私はこのような配列を作ります:

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

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

4

2 に答える 2

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"];
    }
}
于 2012-03-27T16:19:10.907 に答える
0

各ページの読み込みをインスタンス化している/配列の新しいインスタンスをposctbackしているという問題があると思います.Page UnLoadが発生した後、すべてのページ変数が死にます. したがって、ボタン クリック イベントが発生するたびに、ポストバックが発生します。ページ クラスの新しいインスタンスが作成され、基礎となるすべてのフィールドもインスタンス化されます。

明らかに、中間結果をキャッシュする必要があります。このような少量のデータ (いくつかの項目の配列) については、セッションと見なすことができます。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;
    }  
}
于 2012-03-27T16:14:39.330 に答える