глобальная переменная равна нулю - PullRequest
4 голосов
/ 12 августа 2011
Dictionary<string, string> propertyCompany = new Dictionary<string, string>();//gloabal variable

protected void Page_Load(object sender, EventArgs e)
{
   if(!isPostBack){
      propertyCompany .add("a","1"); 
      propertyCompany .add("b","2");
      propertyCompany .add("c","3");
   }
}

protected void btnGetProperty_Click(object sender, EventArgs e)
{
      string a=propertyCompany["a"];//error this key is not exist
     //propertyCompany is null
}

когда определите propertyCompany и заполните form_load. при нажатии на кнопку propertyCompany имеет значение null!?

Я использую static, но иногда не понимаю, скажем, ошибка равна нулю.

Ответы [ 6 ]

4 голосов
/ 12 августа 2011

Каждый запрос создает новый объект страницы, поэтому вы не можете использовать словарь второго запроса (bnt click), который вы создали в первом запросе (загрузка без обратной передачи)

Удалить тест обратной передачи для быстрого исправления.

Другие возможности исправления: * сохранить словарь в viewstate.

1 голос
/ 12 августа 2011

Я почти уверен, что ваш заголовок должен быть "глобальная переменная не содержит данных, которые я хочу".Словарь будет составлен каждый раз при загрузке страницы (обратная передача или иным образом), но из-за этой строки:

if(!isPostBack) {
}

он не будет содержать нужные данные на кнопкеclick.

Чтобы уведомить страницу о клике, выполняется сообщение назад , поэтому высказывание !isPostBack (которое, я предполагаю, устанавливается где-то через Page.IsPostBack)также говоря «если я не нажал кнопку», что, конечно, не то, что вы хотите.

Чтобы получить желаемую функциональность, вы должны либо убрать из этого словарь, еслиblock, или же имеется условие else, которое также заполняет его необходимыми данными.

Другая альтернатива использованию переменной class - это сохранение данных в другом месте.Опции включают ViewState, Session, Application (если это действительно данные всего приложения), Cache и некоторые другие.Непонятно, что именно делает словарь, поэтому трудно сказать, какое место будет наиболее подходящим.

1 голос
/ 12 августа 2011

Каждая переменная, определенная в классе, наследующем Web.UI.Page, будет уничтожена в конце жизненного цикла страницы, следовательно, она будет null в обратной передаче, если вы не инициализируете ее.

Один из способов сохранить его в постбэках - сохранить его в Session-variable .

Полный список всех вариантов того, как сохранить переменные в постбэках, вы найдете здесь: http://msdn.microsoft.com/en-us/magazine/cc300437.aspx

  • Применение
  • печенье
  • Форма сообщения / скрытое поле формы
  • QueryString
  • Session
  • Новые государственные контейнеры в ASP.NET
  • Cache
  • Контекст
  • ViewState
  • Файлы Web.config и Machine.config Заключение

В природе HTTP-протокола он не имеет состояния .

0 голосов
/ 12 августа 2011

Как вы получаете доступ к элементам в propertyCompany в событии нажатия кнопки?Если вы делаете это неправильно, это, скорее всего, проблема.

0 голосов
/ 12 августа 2011

Один из способов заставить ваш словарь жить между запросами - объявить его статическим или в viewstate, как было предложено ранее.

0 голосов
/ 12 августа 2011

попробуйте

    Dictionary<string, string> propertyCompany;//gloabal variable

protected void Page_Load(object sender, EventArgs e)
{ 
   propertyCompany = new Dictionary<string, string>();
   if(!isPostBack){
      propertyCompany .add("a","1"); 
      propertyCompany .add("b","2");
      propertyCompany .add("c","3");
   }
}

защищенный void btnGetProperty_Click (отправитель объекта, EventArgs e) {// propertyCompany имеет значение null}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...