2012-03-27 6 views
0

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

я сделать массив как это:

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 of RadioButtonList.

+0

Ваш вопрос сбивает с толку. Вы пытаетесь сохранить выборки в массиве или проверить выбор на массив правильных ответов? –

+0

Просто хотите сохранить в массив. нет сравнения –

ответ

0

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

Здравствуйте, sll, я делаю это выше события загрузки страницы, поэтому он считается переменной страницы? во-вторых, ваша идея сессии важна, но как я могу сделать сеанс для каждого ответа? или есть ли другой способ управления сеансом? извините, но я новичок в .Net и его проект института –

+0

См. обновленный ответ, просто сохраните весь список в сеансе, это нормально для списка номеров (не очень большой объект) – sll

+0

@sll: Хотя я ценю ваши усилия для повторного использования кода OP, в приведенном выше коде есть некоторые очевидные ошибки. Исправьте его, чтобы он скомпилировался, и я поднимусь. –

1

Если вы заселять свой контроль динамически, что от того, что я могу собрать вас, вы хотите рассмотреть вопрос о том, как вы собираетесь сохраняются значения по всему «путешествие» пользователя. Если все рассчитывается на одной странице, вы можете использовать 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

+1: Я думаю, что это лучший ответ, но я не считаю, что сеттер должен быть необходим в этом случае. –

+0

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