Как взять RadioButtonList.SelectedIndex в массив Ints?

Я просто хочу взять SelectedIndex списка радиокнопок в массив 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.


person Ali Raza    schedule 27.03.2012    source источник
comment
Ваш вопрос сбивает с толку. Вы пытаетесь сохранить выбор в массиве или проверить выбор по массиву правильных ответов?   -  person James Johnson    schedule 27.03.2012
comment
Просто хочу сохранить в массиве. сравнение не требуется   -  person Ali Raza    schedule 27.03.2012


Ответы (2)


Если вы динамически заполняете свой элемент управления, что, насколько я могу судить, вы должны рассмотреть, как вы собираетесь сохранять значения на протяжении «путешествия пользователя». Если все вычисляется на одной странице, вы можете использовать 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"];
    }
}
person Richard    schedule 27.03.2012
comment
+1: я думаю, что это лучший ответ, но я не думаю, что в этом случае нужен сеттер. - person James Johnson; 27.03.2012
comment
Здравствуйте, я выполняю этот тип динамического управления, я просто очищаю элементы на кнопке «Далее» и загружаю новый элемент из базы данных. это то, что я назвал динамическим, извините за это. - person Ali Raza; 27.03.2012

Я считаю, что проблема заключается в том, что вы создаете экземпляр каждой загрузки страницы/отправляете новый экземпляр массива, все переменные страницы умирают после того, как происходит выгрузка страницы. Таким образом, каждый раз, когда срабатывает событие нажатия кнопки, вы получаете обратную передачу — создается новый экземпляр класса страницы, а также создаются экземпляры всех базовых полей.

Очевидно, вам нужно кэшировать промежуточные результаты, для такого небольшого количества данных (несколько массивов элементов) вы можете рассмотреть сеанс. Также рассмотрите возможность использования универсального 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;
    }  
}
person sll    schedule 27.03.2012
comment
Здравствуйте, я делаю это выше события загрузки страницы, поэтому считается ли это переменной загрузки страницы? во-вторых, ваша идея сеанса видна, но как я могу сделать сеанс для каждого ответа? или есть другой способ управлять сессией? извините, но я новичок в .Net, и это проект института - person Ali Raza; 27.03.2012
comment
Смотрите обновленный ответ, просто сохраните весь список в сеансе, это нормально для списка чисел (не очень большой объект) - person sll; 27.03.2012
comment
@sll: Хотя я ценю ваши усилия по повторному использованию кода OP, в приведенном выше коде есть несколько очевидных ошибок. Исправьте это, чтобы оно скомпилировалось, и я проголосую. - person James Johnson; 27.03.2012