2009-11-14 1 views
5

Я уверен, что это просто, но это сводит меня с ума.Почему вызовы вызываются при вызове метода автоповторной Asp.Net ListBox?

У меня есть ListBox на моей странице, чтобы показать художник, который вызывает метод, когда индекс изменяется, и кнопка, которая загружает художник из этого списка в других страницах при нажатии:

<asp:ListBox ID="lbArtists" runat="server" Rows="1" AutoPostBack="true" OnSelectedIndexChanged="ShowArtistsWorks" /> 

<asp:Button ID="btnEditArtist" runat="server" Text="Edit the artist" OnClick="LoadArtist" /> 

Далее , у меня есть подобный список ссылок, который также имеет метод AutoPostBack:

<asp:ListBox ID="lbLinks" runat="server" Rows="1" AutoPostBack="true" OnSelectedIndexChanged="LoadLink" /> 

проблема заключается в том, когда я призываю ShowArtistsWorks() нажав btnEditArtist, метод LoadLink() также получает называется. Почему это происходит? Почему это вызвано, когда я не изменил индекс на lbLinks ListBox? Он не должен приближаться к этому методу.

EDIT: (отношение) Code-за методы (

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack){ 
     GetArtists(); // populates artists listbox 
     GetLinks(); // populates links listbox 
    } 
} 

protected void LoadArtist(object sender, EventArgs e){ 
    if (lbArtists.SelectedValue != "") 
     Response.Redirect("Artist.aspx?id=" + lbArtists.SelectedValue); 
} 

protected void LoadLink(object sender, EventArgs e) 
{ 
    if (lbLinks.SelectedValue != "") 
     Response.Redirect("Link.aspx?id=" + lbLinks.SelectedValue); 
} 

EDIT # 2: я мог бы легко исправить ляп для этого в отдельных методов, чтобы остановить их происходит, когда они не должны , но я хочу понять, почему методы, которые я не называю, и что только дозвонились из одного места, получить вызывается непреднамеренно

ПРИНЯТ ОТВЕТ:. несмотря на то, Boon (теперь CRice) получил в первом с объяснением а также решение, я решил принять более подробное объяснение Джеффа, потому что это то, что я хотел, более углубленный анализ. Спасибо всем, кто ответил.

+0

Убедитесь, что у вас нет EnableViewState = "false" в файле web.config или в директиве страницы. – Phaedrus

+0

Нет, это не так. Вентилятор «Дзэн и искусство ...»? –

+0

mofe ........... – CRice

ответ

2

Изменить события возникают на каждом постбэка, для которых они имеют отношение - как описано в MSDN теме «ASP.NET Web Server Control Event Model

Изменение событий в HTML-сервер управляет и веб-сервера управления, такие как контроль TextBox, не сразу вызвать пост. Вместо этого они подняты при следующем сообщении.

Если пользователь нажмет на кнопку «Редактировать» Художник, ASP.NET думает lbLinks.SelectedIndex изменилось, так что вызывает его SelectedIndexChanged обработчика.

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

Вы можете наблюдать это во время отладки, проверяя выбранные вами индексы и значения ваших списков перед рендерингом или вы можете использовать один из режимов отображения состояния онлайн (like this one), чтобы увидеть, что находится на вашей странице, когда оно написано (хотя прочитайте это, вы должны знать о the structure of serialized view state data).

Когда вы в следующий раз пост назад, HTML <select> элемент lbLinksимеет непустое значение, и он будет представлен как часть почтовых данных. Взгляните на Request.Form["lbLinks"], и вы увидите, что он равен lbLinks.Items[0].Value.

ASP.NET отображает размещенное значение lbLinks.SelectedValue, но он также знает, что выбранное значение используется как пустая строка - он получает старое значение из поля зрения государства. Поскольку эти два значения различны, процесс вызывает событие с измененным индексом, выбранное элементом управления, что вызывает нежелательное поведение, которое вы наблюдали.

As boon suggested, решение всегда явно установить SelectedIndex для всех ListBox управления, когда вы используете OnSelectedIndexChanged событие, даже если вы просто установив индекс к нулю.

(Настройка AutoPostBack является несвязанной отвлекающим маневром. Если вы удалите его из обоих списков, их OnSelectedIndexChanged события как огонь каждый раз, когда вы нажимаете на кнопку.)

0

Вы уверены, что вы не указали указатель в другом списке? Может быть, вы перевязываете этот список, потому что этот код выполняется в post-pack?

+0

Бывает, изменил ли я другой ListBox. Вот что меня озадачивает. Нет, не переустанавливая его –

+0

Если вы вызываете только событие LoadLinks() из события, то как начать заполнение списка? Мы говорим, что весь код жизненного цикла вашей страницы запускается, когда событие возвращается (за исключением того, где вы тестируете IsPostBack). Событие не запускается без изменения списка. – cdonner

+0

Ну, LoadLink() означает загрузку выбранной ссылки на новую страницу. ListBox заносится в первую очередь из события Page_Load, но только если (! IsPostBack) ... –

0

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

+0

Нет, я только вызываю LoadLink() из списка 'lbLinks' ListBox –

0

Попробуйте просмотреть стек вызовов & Посмотрите, почему вызывается неродственный метод.

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

Стек вызовов должен помочь вам определить причину, для начала.

0

Проблема заключается в ваших объявлениях AutoPostBack = "true". Я не знаю точной причины, если кто-то еще хотел бы разработать, но когда у нескольких элементов управления на странице есть AutoPostBack = "true", все события на стороне сервера запускаются при отправке обратно на сервер.

EDIT Я предполагаю, что по какой-либо причине, возможно, связанная с представлением состояние SelectedIndexChanged оценивает значение true для обоих элементов управления при обратной передаче.

+0

вы перестраиваете DropDownList на обратной стороне? – jaywon

+0

Нет - они оба заполняются только если (! IsPostBack) –

+0

Это может быть частью проблемы при запуске события SelectedIndexChanged. Я думаю, вам может понадобиться повторно заполнять списки каждый раз, чтобы ViewState правильно проверял, является ли событие SelectedIndexChanged истинным или нет. – jaywon

1

В соответствии со страницей оба списка были изменены.Он был выбранIndex -1, а затем, когда загружается страница, они оба перейдут к выбранному индексу 0, возможно, из-за того, как вы назначаете им данные. Поэтому, когда происходит обратная передача, имеет смысл только для обоих методов запускать, так как их выбранный индекс действительно изменился.

Проверьте, не исчезли ли следующие проблемы. Установить выбранный индекс нулю:

if (!IsPostBack){ 
    GetArtists(); // populates artists listbox 
    GetLinks(); // populates links listbox 

    lbArtists.SelectedIndex = 0; 
    lbLinks.SelectedIndex = 0; 
} 
+0

+1 для первого объяснять вкратце проблему и решение, которое работает, спасибо. –

+0

Возможно, я просто не был достаточно сложным, кажется! : P – CRice

+0

Ну, как я уже сказал в редакции № 2, я мог бы решить проблему с kludge в порядке, но я хотел понять проблему в деталях. В этом отношении ответ Джеффа был лучше –

0

Моя мысль в том, что второй список Безразлично Не начинайте с выбранного элемента. Когда страница загружается, ваш браузер автоматически выбирает первый элемент. Когда вы публикуете страницу, состояние просмотра изменилось (нет элемента для первого элемента), поэтому происходит событие обратной передачи. Попытайтесь убедиться, что у вас есть выбор.

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