Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Это не стандартное поведение управления ListView, даже когда MultiSelect имеет значение true.
Если бы Вы хотели создать свое собственное управление, то необходимо было бы сделать следующее:
Должно быть достаточно просто реализовать и чувствовать себя подобно мультивыбору, не используя клавишу CTRL!
Вы могли бы хотеть также рассмотреть использование Флажков на представлении списка. Это - очевидный способ передать мультиизбранное понятие Вашему среднему пользователю, который не может знать о Ctrl+Click.
От страницы MSDN:
Свойство CheckBoxes предлагает способ выбрать несколько объектов в управлении ListView, не используя клавишу CTRL. В зависимости от Вашего приложения, с помощью флажков для выбора объектов, а не стандартного метода множественного выбора может быть легче для пользователя. Даже если свойство MultiSelect управления ListView имеет значение false, можно все еще отобразить флажки и предоставить возможности множественного выбора пользователю. Эта функция может быть полезной, если Вы не хотите, чтобы несколько объектов были выбраны, и все же хотят позволить пользователю выбирать несколько объектов из списка для выполнения операции в рамках приложения.
Выполните развертку через ListviewItemCollection, и можно установить свойство Selected для отдельных объектов к истинному. Это, я верю, будет эмулировать "мультиизбранную" функцию, которую Вы пытаетесь воспроизвести. (Кроме того, как вышеупомянутый комментатор упомянул, убедиться иметь свойство MultiSelect набора lisetview к истинному.)
Поведение Ctrl+Click как реализовано браузером и имеет мало общего с фактическим Управлением.NET. Результат, которого Вы пытаетесь достигнуть, может быть получен с большим количеством дополнительного JavaScript - самый легкий путь состоял бы в том, чтобы, вероятно, создать управление JavaScript из значения по умолчанию, которое прокладывает себе путь, вместо того, чтобы пытаться изрубить listview. Это было бы желательно? В этом случае я мог изучить его и возвратиться к Вам с решением.
Вот полное решение, которое я использовал для решения этой проблемы с помощью WndProc. По сути, он выполняет проверку нажатия при щелчке мышью ... затем, если MutliSelect включен, он автоматически включает / выключает элемент [.Selected] и не беспокоится о поддержании каких-либо других списков или возня с функциональностью ListView.
Я не тестировал это во всех сценариях, ... у меня это сработало. YMMV.
public class MultiSelectNoCTRLKeyListView : ListView {
public MultiSelectNoCTRLKeyListView() {
}
public const int WM_LBUTTONDOWN = 0x0201;
protected override void WndProc(ref Message m) {
switch (m.Msg) {
case WM_LBUTTONDOWN:
if (!this.MultiSelect)
break;
int x = (m.LParam.ToInt32() & 0xffff);
int y = (m.LParam.ToInt32() >> 16) & 0xffff;
var hitTest = this.HitTest(x, y);
if (hitTest != null && hitTest.Item != null)
hitTest.Item.Selected = !hitTest.Item.Selected;
return;
}
base.WndProc(ref m);
}
}