Как взять RadioButtonList.SelectedIndex в массив Ints? - PullRequest
0 голосов
/ 27 марта 2012

Я просто хочу взять SelectedIndex из radiobuttonlist в массив int для события OnSelectedIndexChanged.Я попробовал следующий код, но он не сработал:

Я создаю массив, подобный этому:

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 и при следующей и предыдущей кнопке вызвать это значение индекса и вставить в SelectedIndex, пораженный RadioButtonList.поэтому, пожалуйста, помогите мне, что, как я могу принять это выбранное значение в массиве int на OnSelectionChange?и еще одно дополнение в том, что я делаю Post Back True для RadioButtonList.

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Если вы динамически заполняете свой элемент управления, что, исходя из того, что я могу вам узнать, вы захотите рассмотреть, как вы будете сохранять значения в течение всего «пользовательского пути». Если все рассчитывается на одной странице, вы можете использовать ViewState для сохранения информации. В пределах Control, например Page или UserControl, вы можете сделать:

/// <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 голосов
/ 27 марта 2012

Я полагаю, что проблема в том, что вы создаете каждую страницу, загружаете / откладываете новый экземпляр массива, все переменные страницы умирают после того, как 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;
    }  
}
...