Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Выброс исключения в классе, произв. от ListView  (Прочитано 10432 раз)
0 Пользователей и 1 Гость смотрят эту тему.
KAAnton
Гость
« : 16-01-2004 08:13 » 

Люди, помогите пожалуйста разобратся.
Создаю класс, производный от ListView. Делаю контекстное меню - добавить фалы/удалить файлы.
При удалении элементов из ListView периодически выскакивает исключение ArgumentOutOfRangeException.
На компе стоит .NET Framework 1.1

вот код класса:
public class CFilesToParseListView : ListView
{
protected System.Windows.Forms.ContextMenu m_clContextMenu;
protected System.Windows.Forms.MenuItem menuItem1;
protected System.Windows.Forms.MenuItem menuItem2;
protected OpenFileDialog m_clOpenFileDlg = new OpenFileDialog();
         
//===========
public CFilesToParseListView()
{
 MyInitComponents();
 m_clOpenFileDlg.CheckFileExists = true;
 m_clOpenFileDlg.Multiselect = true;
}

//============
protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
{
Point pt = new Point(e.X,e.Y);
//-------------

if(MouseButtons.Right != e.Button)
{
 base.OnMouseDown(e);
 return;
};
         
if(0 == SelectedItems.Count)
  menuItem2.Enabled = false;
else
 menuItem2.Enabled = true;

m_clContextMenu.Show(this,pt);
//base.OnMouseDown(e);
}

//============
protected bool MyInitComponents()
{
this.m_clContextMenu = new System.Windows.Forms.ContextMenu();
this.menuItem1 = new System.Windows.Forms.MenuItem();
this.menuItem2 = new System.Windows.Forms.MenuItem();

this.m_clContextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuItem1, this.menuItem2});
//
// menuItem1
//
this.menuItem1.Index = 0;
this.menuItem1.Text = "Добавить файл в список анализа...";
         this.menuItem1.Click += new System.EventHandler(this.menuItem1_Click);
   
//
// menuItem2
//
this.menuItem2.Index = 1;
this.menuItem2.Text = "Удалить файл из списка анализа";
this.menuItem2.Click += new System.EventHandler(this.menuItem2_Click);
         
return true;
}

//============
private void menuItem1_Click(object sender, System.EventArgs e)
{
ListViewItem   lvi = null;
int      iI = 0,
iFiles = 0,
iItems = 0;
string   strPath,strFName;
bool   bInsertIntoList = true;
//-------------

if(DialogResult.OK != m_clOpenFileDlg.ShowDialog(this))
 return;

for(iFiles = 0;iFiles < m_clOpenFileDlg.FileNames.GetLength(0);iFiles++)
{
 strPath = m_clOpenFileDlg.FileNames[iFiles];
 bInsertIntoList = true;
 for(iItems = 0;iItems < Items.Count;iItems++)
 {
  if(Items[iItems].SubItems[1].Text == strPath)
  {
    bInsertIntoList = false;break;
  };
 };
 if(!bInsertIntoList)
  continue;
 for(iI = strPath.Length - 1;iI >= 0;iI--)
 {
  if(strPath[iI] == '\\')
  {
  iI++;
  break;
  };
 };

 strFName = strPath.Substring(iI,strPath.Length - iI);
 lvi = Items.Add(strFName);
 lvi.SubItems.Add(strPath);
 };
return;
}

//============
private void menuItem2_Click(object sender, System.EventArgs e)
{
 int iI = 0;
 ListViewItem lvi = null;
 //---------------

 //TODO - Почему-то иногда происходит выброс исключения ArgumentOutOfRangeException
 for(iI = SelectedItems.Count - 1;iI >= 0;iI--)
 {
 lvi = SelectedItems[iI];
 lvi.Remove();
 };

return;
}


//============

Вот описание исключения:

System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: '0' is not a valid value for 'displayIndex'.
   at System.Windows.Forms.ListViewItemCollection.get_Item(Int32 displayIndex)
   at System.Windows.Forms.ListView.LvnBeginDrag(MouseButtons buttons, NMLISTVIEW nmlv)
   at System.Windows.Forms.ListView.WmReflectNotify(Message& m)
   at System.Windows.Forms.ListView.WndProc(Message& m)
   at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Записан
KAAnton
Гость
« Ответ #1 : 16-01-2004 08:47 » 

Кстати забыл добавить:
1) Установка перехватчика исключения в ф-и menuItem2_Click ничего не дает, т.к. исключение генерится в недрах System.Windows.Forms, пробовал даже перегружать DefWndProc и ставить обработчик исключения там, но не помогло, исключение каким-то образом доходит до Main(), и программа завершается с ошибкой.

2)Абсолютно непонятный мне эффект:
 Выделяем левой кнопкой мыши элементы в ListView
 Жмем ПКМ, появляется контекстное меню, выбираем удалить, элементы удаляются
  Контекстное меню исчезает, однако в ListView отображается рамка выделения элементов, которая выводится когда пользователь зажимает ЛКМ и двигает мышь
Записан
Mouse
Молодой специалист

ru
Offline Offline

« Ответ #2 : 16-01-2004 12:55 » 

Цитата

//TODO - Почему-то иногда происходит выброс исключения ArgumentOutOfRangeException

А когда именно? В частности, что возвращает SelectedItems.Count?
Записан
KAAnton
Гость
« Ответ #3 : 16-01-2004 14:44 » 

SelectedItems.Count возвращает ПРАВИЛЬНОЕ кол-во выделенных элементов.
Выброс исключения происходит ПОСЛЕ возврата из ф-и menuItem2_Click.
То есть в отладчике проходим цикл, попадает на return, жмем shift+F11, компьютер долго думает, потом возникает исключение.
Если прогонять без отладчика, то выбираем элементы, выбираем в менюшке удалить, и здесь начинается самое веселое, иногда приложение продолжает работу, иногда форма подвисает, после этого вываливается сообщение о возникновении исключения.
Записан
Mouse
Молодой специалист

ru
Offline Offline

« Ответ #4 : 16-01-2004 15:31 » 

Цитата
private void menuItem2_Click(object sender, System.EventArgs e)
А это обработчик какого события? Что-то тут не то. Я протестировал твой код - все работает. Вот этот код:

Код:
private void button1_Click(object sender, System.EventArgs e)
{
  int i = 0;
  ListViewItem lvi = null;

  for(i = listView1.SelectedItems.Count - 1; i >= 0; i--)
  {
    lvi = listView1.SelectedItems[i];
    lvi.Remove();
  };

  return;
}

Я сделал отдельную кнопку, по нажатию на которую происходит удаление всех выделенных элементов listView1. Попробуй перенести функцию удаления на отдельную кнопку. А все-таки, что это за событие menuItem2_Click?  :?:
« Последнее редактирование: 23-11-2007 18:47 от Алексей1153++ » Записан
KAAnton
Гость
« Ответ #5 : 19-01-2004 07:14 » 

menuItem2_Click - обработчик события от контекстного меню, связанного с экз. класса CFilesToParseListView.

....
protected System.Windows.Forms.ContextMenu m_clContextMenu;
protected System.Windows.Forms.MenuItem menuItem1;
protected System.Windows.Forms.MenuItem menuItem2;
....
protected bool MyInitComponents()
{
this.m_clContextMenu = new System.Windows.Forms.ContextMenu();
this.menuItem1 = new System.Windows.Forms.MenuItem();
this.menuItem2 = new System.Windows.Forms.MenuItem();

this.m_clContextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuItem1, this.menuItem2});
//
// menuItem1
//
this.menuItem1.Index = 0;
this.menuItem1.Text = "Добавить файл в список анализа...";
this.menuItem1.Click += new System.EventHandler(this.menuItem1_Click);

//
// menuItem2
//
this.menuItem2.Index = 1;
this.menuItem2.Text = "Удалить файл из списка анализа";
this.menuItem2.Click += new System.EventHandler(this.menuItem2_Click);

return true;
}
Записан
Mouse
Молодой специалист

ru
Offline Offline

« Ответ #6 : 19-01-2004 10:10 » 

KAAnton, так что, заработало наконец? Если мой код на кнопку попробовать привязать? Хотя в менюшке дело в принципе не должно быть...  :?
Записан
Anonymous
Гость
« Ответ #7 : 18-08-2004 19:41 » 

Цитата: Archangel
Цитата
private void menuItem2_Click(object sender, System.EventArgs e)
А это обработчик какого события? Что-то тут не то. Я протестировал твой код - все работает. Вот этот код:

Код:
private void button1_Click(object sender, System.EventArgs e)
{
  int i = 0;
  ListViewItem lvi = null;

  for(i = listView1.SelectedItems.Count - 1; i >= 0; i--)
  {
    lvi = listView1.SelectedItems[i];
    lvi.Remove();
  };

  return;
}

Я сделал отдельную кнопку, по нажатию на которую происходит удаление всех выделенных элементов listView1. Попробуй перенести функцию удаления на отдельную кнопку. А все-таки, что это за событие menuItem2_Click?  :?:
« Последнее редактирование: 23-11-2007 18:48 от Алексей1153++ » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines