Словарь может также содержать наверху, в зависимости от фактической реализации. Хеш-таблица обычно содержит некоторое простое число доступных узлов для начала, даже при том, что Вы могли бы только использовать несколько узлов.
Оценка по Вашему примеру, "Свойству", Вы были бы лучше из с подходом класса для заключительного уровня и реальных свойств? Или названия свойств изменяющийся много от узла до узла?
я сказал бы, что то, что "эффективный" означает, зависит от большого количества вещей, как:
, я думаю, что Вы найдете, что структура данных, которая быстра, будет обычно использовать больше памяти, чем та, которая является медленной. Это не всегда имеет место, но большинство структур данных, кажется, следует за этим.
словарь А мог бы быть простым в использовании, и предоставить Вам относительно однородно доступ, он будет, скорее всего, использовать больше памяти, чем, как Вы предполагаете, списки. Списки, однако, обычно имеют тенденцию содержать больше служебное при вставке данных в него если они не предварительно выделяют X узлов, в которых они будут снова использовать больше памяти.
Мое предложение, в целом, должно было бы просто использовать метод, который кажется самым естественным для Вас, и затем сделайте "стресс-тест" системы, добавив значительное количество данных к нему и посмотрите, становится ли это проблемой.
Вы могли бы также рассмотреть добавление слоя абстракции к Вашей системе, так, чтобы Вы не изменяли интерфейс программирования, если позже необходимо изменить внутреннюю структуру данных.
События изменения вызываются при каждой обратной передаче, для которой они актуальны, как описано в теме MSDN « Модель событий управления веб-сервером ASP.NET ».
Изменить события в серверных элементах управления HTML и серверные веб-элементы управления, такие как TextBox, не сразу вызвать пост. Вместо этого они возникают , когда в следующий раз появляется сообщение .
Когда пользователи нажимают кнопку «Изменить исполнителя», ASP.NET думает, что lbLinks.SelectedIndex
изменился, поэтому он вызывает свой обработчик SelectedIndexChanged
.
причина, по которой ASP.NET считает, что индекс изменился, заключается в следующем: при первой загрузке страницы lbLinks
не делает » t имеют выбранный индекс (или значение), если вы не укажете иное, явно установив его. Пока вы этого не сделаете, выбранный индекс будет -1, а его выбранное значение будет пустой строкой. Выбранное значение (в данном случае пустая строка) записывается для состояния просмотра при отображении страницы , чтобы ASP.NET мог определить, изменилось ли значение при обратной передаче .
Вы можете наблюдать это во время отладки, проверяя ваши списки выбранные индексы и значения перед рендерингом, или вы можете использовать один из декодеров состояния онлайн-просмотра ( как этот ), чтобы увидеть, что на вашей странице, когда она впервые написана (хотя, чтобы прочитать это, вам нужно знать о структура сериализованных данных состояния просмотра ).
При следующем ответе HTML
элемент lbLinks
будет иметь непустое значение , и отправляется как часть данных сообщения. Взгляните на Request.Form ["lbLinks"]
, и вы увидите, что он равен lbLinks.Items [0] .Value
.
ASP.NET отображает опубликованные значение на lbLinks.SelectedValue
, но он также знает, что выбранное значение раньше было пустой строкой - оно получает старое значение из состояния просмотра.
Are you sure you haven't changed the index on the other listbox? Are you re-binding that list box, maybe, because that code get executed on post-pack?
I'm guessing you call LoadLinks() in your Page_Load() or other similar event. Remember, when you do a postback, it has to re-run the entire page lifecycle. You're working with a brand new instance of the page class. This is true even if you just wanted to process a simple button click or selection change event.
Попробуйте посмотреть стек вызовов и понять, почему вызывается несвязанный метод.
Я предполагаю, что это может быть код, изменяющий свойство Index
объекта другой список, а затем подключение обработчиков событий.
Стек вызовов должен помочь вам определить причину для начала.
Проблема в ваших объявлениях AutoPostBack = "true". Я не знаю точной причины, если кто-то еще захочет уточнить, но когда несколько элементов управления на странице имеют AutoPostBack = "true", все события на стороне сервера запускаются при отправке обратно на сервер.
РЕДАКТИРОВАТЬ Я предполагаю, что по какой-то причине, возможно связанной с состоянием просмотра, SelectedIndexChanged оценивает значение true для обоих элементов управления при обратной передаче.
Согласно странице, оба списка были изменены. Это был selectedIndex -1, тогда, когда страница загружается, они оба перейдут к выбранному индексу 0, возможно, из-за способа, которым вы назначаете им данные. Поэтому, когда происходит обратная передача, для обоих методов имеет смысл только работать, так как их выбранный индекс фактически изменился.
Посмотрите, решит ли следующая проблема вашу проблему. Установите выбранный индекс как ноль:
if (!IsPostBack){
GetArtists(); // populates artists listbox
GetLinks(); // populates links listbox
lbArtists.SelectedIndex = 0;
lbLinks.SelectedIndex = 0;
}
Я считаю, что второе окно списка не начинается с выбранного элемента. Когда страница загружается, ваш браузер автоматически выбирает первый элемент. Когда вы публикуете страницу, состояние просмотра изменилось (нет элемента на первый элемент), поэтому происходит событие обратной передачи. Убедитесь, что у вас есть выбор.