2014-02-01 7 views
0

Итак, я начинаю ASP.NET и в то же время изучаю немного C#, достаточного для создания веб-страниц. Я просто взял на себя проект создания базового визуального калькулятора, такого, с помощью которого вы нажимаете удобные кнопки. Это мой C# Код:Как исправить эту ошибку System.OutOfMemoryException?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class ExtraCredit_GraphicCalculator : System.Web.UI.Page 
{ 
    string number1 = ""; 
    string number2 = ""; 
    bool EnteringNumber1 = true; 
    bool EnteringNumber2 = false; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     while (EnteringNumber1) 
     { 

      Enter9.Click += (s, args) => 
      { 
       number1 = number1 + "9"; 
      }; 

      Enter8.Click += (s, args) => 
      { 
       number1 = number1 + "8"; 
      }; 
      Enter7.Click += (s, args) => 
      { 
       number1 = number1 + "7"; 
      }; 
      Enter6.Click += (s, args) => 
      { 
       number1 = number1 + "6"; 
      }; 
      Enter5.Click += (s, args) => 
      { 
       number1 = number1 + "5"; 
      }; 
      Enter4.Click += (s, args) => 
      { 
       number1 = number1 + "4"; 
      }; 
      Enter3.Click += (s, args) => 
      { 
       number1 = number1 + "3"; 
      }; 
      Enter2.Click += (s, args) => 
      { 
       number1 = number1 + "2"; 
      }; 
      Enter1.Click += (s, args) => 
      { 
       number1 = number1 + "1"; 
      }; 
      Enter0.Click += (s, args) => 
      { 
       number1 = number1 + "0"; 
      }; 
      Result.Text = number1; 
     } 
    } 
} 

всего несколько вещей, чтобы заметить, это событие # .Something каждый коррелируют с числовыми кнопками, так и с Enter7.Click, по нажатию кнопки с надписью 7, он делает что-то , В конце результат Result.Text коррелирует с меткой, которая отображает результат. Прямо сейчас, я просто хочу видеть результаты каждого нажатия кнопки, но я планирую добавлять функции для второго числа и математических функций, таких как показатели и квадратные корни.

Что я могу сделать, чтобы исправить эту ошибку?

+3

Что вы пытаетесь сделать с этим циклом 'while'? Поскольку в настоящее время ваш код предназначен для регистрации обработчиков событий в бесконечном цикле, пока программа не сработает ... – Vache

+0

Хорошо, я вижу ошибку while while. Суть его в том, чтобы позволить пользователю вводить столько чисел, сколько они хотят, и заканчивается его нажатием кнопки операнда (этого я не получил). – user3029002

ответ

3

Прежде всего EnteringNumber1 всегда верно, поэтому ваш метод Page_Load никогда не выходит. Он только продолжает добавлять обработчики событий, которые, вероятно, вызывают ошибку памяти. Знайте, что Page_Load - событие, которое срабатывает во время инициализации части страницы. Обычно вы используете этот метод для установки свойств в элементах управления и для установления соединений с базой данных (см. Page Life Cycle Overview для получения дополнительной информации).

Помните, что HTML является статическим, и все, что делает asp.net, это создание этих статических html-страниц на сервере. Вы захотите удалить бесконечный цикл и зарегистрировать события один раз.

Вы также захотите обработать какое-то отображение значения в событиях щелчка.

В этом случае я действительно не вижу многого в вашем обработчике Page_Load. Вы можете создавать отдельные обработчики событий для каждой кнопки, если хотите (вы могли бы упростить это позже). По умолчанию, когда пользователь нажимает кнопку на странице, появляется PostBack на сервере, и сервер выполняет некоторые вычисления, и возвращается новая версия страницы. В конце концов, вы бы что-то, что выглядит вроде следующего:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!Page.IsPostBack()) // we only want this stuff to happen on initial load   
    { 
     hiddenField.value = 0; 
    } 
} 

protected void Enter9_OnClick(object sender, EventArgs e) 
{ 
    // a postback to the server just happened 
    hiddenField.value = (double)hiddenField.value + 9; 
} 

.... 
.... 

Обратите внимание, что этот код не проверен и не может быть 100% правильно, но он получает вам основную идею о том, как осина. сетевые работы.

Теперь, когда вы комфортно страницы жизненного цикла, что вы действительно хотите сделать, это а) обрабатывать сторону расчетов клиента в JavaScript или б) маршалом вызовы со стороны клиента кода на сервере (где ваши вычисления будут произойдет) и обратно, используя простой ajax. Отъезд jQuery, чтобы помочь с клиентской стороной.

3

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

Дамп петли. В этом не должно быть необходимости. Убедитесь, что ваш результат также попадает в поле ввода в asp, так что при нажатии другой кнопки вы можете «добавить» номер к номеру, который вы уже установили.

Смежные вопросы