abdul subhan mohammed Ответов: 1

Глобальные переменные получают значение null на таймер тиков с#


Дорогие Все,

У меня есть одно веб-приложение в ASP.NET с#.

В настоящее время я работаю над отображением вопроса из списка вопросов кандидату.

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

Private List<QuestionInfo> _questionList;

 public List<QuestionInfo> QuestionList
 {
      get
      {
          if(_questionList != null)
             return _questionList;
          else
                 _questionList = 
   QuestionDetailsController.Instance.ExamQuestionsGetRandomly(Module.TotalQuestions, QuestionLanguageID, PracticeModuleID).Select(item => item.Question).ToList();
                return _questionList;
    }
}


Что я уже пробовал:

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                BindQuestion(_questionNumber);
                Timer1.Enabled = true;
            }

        }


protected void BindQuestion(int nthQuestion)
{
    if (nthQuestion <= QuestionList.Count())
    {
        QuestionInfo CurrentQuestion = QuestionList.ElementAt(nthQuestion);
        if (CurrentQuestion != null)
        {
            lblNoOfQuestions.Text = string.Format("Question {0} of {1}", nthQuestion + 1, ExamQuestion.QuestionList.Count());
            lblQuestionText.Text = CurrentQuestion.QuestionDetails.First().Details.Text.QuestionText;
        }
    }
}


Я использую Ajax UpdatePanel & Timer(для отображения оставшегося времени).

У меня есть три кнопки, как предыдущий, пауза, следующий.

Всякий раз, когда я нажимаю кнопку Previous или Next, глобальная переменная также получает null & on timer_tick event.

Как я могу остановить глобальные переменные, чтобы не получить null, при нажатии на следующий, предыдущий(кнопки) или TimerEvent.

Кто-нибудь может пожалуйста помочь мне.


Заранее спасибо

phil.o

Не имеет отношения к вашему вопросу, но в BindQuestion метод, ваш тест должен быть if (nthQuestion > -1 && nthQuestion < QuestionList.Count()) На данный момент, если nthQuestion равен количеству коллекций, вы получите исключение index out of bounds.
И вы можете попытаться сделать свой список статической переменной (и свойством).

abdul subhan mohammed

Дорогой Фил,
На самом деле, всякий раз, когда я нажимаю кнопку "Далее" или "предыдущий", я получаю новый список вопросов. Где, как я хочу использовать тот же список вопросов, но не новый, на каждом клике.

1 Ответов

Рейтинг:
2

F-ES Sitecore

Только ваши управляющие данные или вещи в ViewState сохраняются через postbacks, ваши локальные переменные не таковы, что на каждом postback _questionlist будет null, так как вы не вызываете BindQuestion на postback. Вам просто нужно снять флажок "если".

protected void Page_Load(object sender, EventArgs e)
        {
            BindQuestion(_questionNumber);
            if (!IsPostBack)
            {
                Timer1.Enabled = true;
            }
 
        }


Вы не показываете, откуда берется _questionNumber, но, как я уже сказал выше, если вы хотите, чтобы это значение запомнилось, вам нужно будет сохранить его в ViewState, что-то вроде

<pre>protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Timer1.Enabled = true;
            }
            else
            {
                _questionNumber = (int)ViewState["questionNumber"];
            }
            BindQuestion(_questionNumber);

            ViewState["questionNumber"] = _questionNumber; 
        }


abdul subhan mohammed

при каждом нажатии на предыдущий или следующий список вопросов становится привязанным каждый раз, как новый.

F-ES Sitecore

Вам нужно будет разделить свой код таким образом, чтобы BindQuestion делал то, что вы не хотите делать при обратной передаче, например обновлял элементы управления, чтобы они могли быть внутри проверки if(!PostBack), а затем помещал то, что вам нужно делать каждый раз, например связывать события, настраивать переменные и т. д. В метод PageLoad.