如何将RadioButtonList.SelectedIndex放入Ints数组中

本文关键字:Ints 数组 放入 SelectedIndex RadioButtonList | 更新日期: 2023-09-27 18:29:13

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

如何将RadioButtonList.SelectedIndex放入Ints数组中

如果您正在动态填充控件,根据我所能收集到的信息,您将需要考虑如何在整个"用户旅程"中保持值。如果所有内容都是在一个页面上计算的,则可以使用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"];
    }
}

我认为,实例化每个页面的问题是加载/poctback数组的一个新实例,所有页面变量在页面卸载后都会失效。因此,每次触发按钮单击事件时,都会得到一个回发——页面类的一个新实例会被创建,所有底层字段也会被实例化。

显然,您必须缓存中间结果,对于这样少量的数据(数组中的少数项),您可以考虑会话。还要考虑使用泛型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;
    }  
}