如何将RadioButtonList.SelectedIndex带入Ints数组?

时间:2012-03-27 16:10:44

标签: c# asp.net .net radiobuttonlist selectedindex

我只是想将radiobuttonlist的SelectedIndex放到OnSelectedIndexChanged事件的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,但如果我选择一个答案并单击下一个按钮,然后按下前一个按钮返回我的选择消失。所以我有一个逻辑,就是将选定的索引存储在一个int数组中,然后在下一个和上一个按钮调用索引值并放入RadioButtonList的SelectedIndex中。所以请帮助我,我如何在OnSelectionChange的int数组中取这个选定的值?还有一个补充是我使RadioButtonList的Post Back True。

2 个答案:

答案 0 :(得分: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"];
    }
}

答案 1 :(得分: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;
    }  
}