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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: перетаскивание элемента из одного списка в другой  (Прочитано 15972 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 24-08-2009 16:59 » 

понадобилась такая штука - перетащить мышью элемент из одного listBox в другой (на одной форме)

включил свойство AllowDrop.
В обработчике нажатия мыши запускаю
lbx_shop1_content.DoDragDrop(lst1.Items[0 ],DragDropEffects.Move|DragDropEffects.Copy);

появляется курсор - зачёркнутый кружок, однако лист - приёмник никакой реакции после бросания на него элемента не рожает (
Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 24-08-2009 18:45 » 

Алексей1153++, а ты Drop в приёмнике запрограммировал?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 24-08-2009 18:56 » 

так сообщение то не вызывается для приёмника, как я его запрограммирую ? Или я что то пропустил
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 25-08-2009 15:41 » 

так и не смог разобраться (
Вот прилагаю болванку, где хочется поймать сообщение DragDrop, когда из левого списка перетаскивается элемент в правый список

 
« Последнее редактирование: 26-08-2009 15:44 от Алексей1153++ » Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 26-08-2009 09:26 » 

Лёшка, дык ёлы палы! (ну если олифишь тады звиняй).
Ты курсор зачем запер? Ты бы им ещё на кнопки понажимал! Курсор управляется эффектами:

Код:

//левый список - начинаем перетаскивание
private void lbx_shop1_content_MouseDown(object sender,MouseEventArgs e)
{
((ListBox)sender).DoDragDrop(((ListBox)sender),DragDropEffects.All);
}

//правый список - меняем цвет на розовый, когда над ним курсор
private void lbx_shop2_content_DragEnter(object sender,DragEventArgs e)
{
((ListBox)sender).BackColor=Color.Pink;
e.Effect = DragDropEffects.Copy;
}
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 26-08-2009 09:46 » 

понятно )
в толстой книжке про это ничего нету. А оно, казывается, через ё делается

Дома опробую )
Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 26-08-2009 10:30 » 

Цитата: Джон
((ListBox)sender).BackColor=Color.Pink;
В данном случае так, но если в D&D операции участвуют разные объекты, то по-хорошему надо писать:
Код: (Text)
if(sender is ListBox)
{
   ((ListBox)sender).BackColor=Color.Pink;
}
или же
Код:
ListBox listBox = sender as ListBox;
if(listBox != null)
{
   listBox.BackColor=Color.Pink;
}
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 26-08-2009 10:40 » 

учту ) Я думал про такую проверку, но пока парился над дропом, поэтому не искал пока ещё, как сделать проверку
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 26-08-2009 15:44 » 

вот как получилось )

* dragdrop.rar (21.9 Кб - загружено 876 раз.)
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 26-08-2009 16:41 » 

а как задать элементу списка пользовательские данные, то есть, имеется в виду:

в списке - названия товаров, их тексты видно. А каждому элементу сопоставлен ID товара (так же, как это можно делать в апишном ComboBox )
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 26-08-2009 18:29 » 

всё, догадался )))

Код:
		//элемент списка
class listelem:object
{
public int good_id=0;//тип товара
public string good_name="";//имя товара
public int good_count=0;//количество

public listelem(int id,string name,int count)
{
good_id=id;
good_name=name;
good_count=count;
}


public override bool Equals(object obj)
{
if(this==null || obj==null)return false;
return (obj.Equals(this));
}

public override int GetHashCode()
{
return 0;
}

public override string ToString()
{
if(good_name==null)
{
return "NULL";
}
else
{
return good_name+" , "+good_count.ToString()+"шт.";
}
}

}
« Последнее редактирование: 26-08-2009 18:32 от Алексей1153++ » Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 26-08-2009 20:38 » 

Лёш, сиплюснотому (айпишному) ItemData соответствует свойство Tag, ему можно присвоить всё, что есть object.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 27-08-2009 03:51 » new

ItemData я не пользовался, всё сделал через свой класс, производный от object
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #13 : 27-08-2009 06:19 » 

Это был ответ на вопрос:

а как задать элементу списка пользовательские данные, то есть, имеется в виду:

в списке - названия товаров, их тексты видно. А каждому элементу сопоставлен ID товара (так же, как это можно делать в апишном ComboBox )

Те свойству Tag можно присвоить ЛЮБОЙ объект.

зы Конечно можно и так сделать, теперь это уже специальный Combobox.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 27-08-2009 06:29 » 

ну со своим классом даже удобнее, там ведь не только ID можно хранить )
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #15 : 27-08-2009 07:13 » 

Леш, забудь. Я просто делал такое для ListView

ListViewItem lvi = myListView.Items.Add("12345");
lvi.Tag = myObject;

На нормальном языке это было SetItemData с указателем.

С "нормальным" комбобоксом я делал так. Создавал объект какого либо класса (с ID и ещё кучей других полей, короче всё что тебе надо) и присваивал указателю полю ItemData каждого элемента списка комбобокса cmbMy.SetItemData(i,pMyObg);
Оказывается у додиезного комбобокса у элементов списка нет полей, у них ваще ничего нет.
Те надо сделать буферный объект с текстом и объектом.

Собственно говоря, почему я против непосредственного присваивания объектов. Ты подготавливаешь объект и настраиваешь его ToString. Допустим она возвращает Имя Фамилия для отображения в гриде. Теперь тебе надо сделать комбобокс выбора сотрудников для этого достаточно фамилии, тем более что нужна сортировка. Возникает дилема, ведь твой сомбобокс будет вызывать ToString.

Поэтому буферный объект с двумя полями (string Name и object Tag) и ToString имхо лучшее решение.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 27-08-2009 07:25 » 

Код:
С "нормальным" комбобоксом я делал так. Создавал объект какого либо класса (с ID и ещё кучей других полей, короче всё что тебе надо) и присваивал указателю полю ItemData каждого элемента списка комбобокса cmbMy.SetItemData(i,pMyObg);
ну я так же )

Код:
Допустим она возвращает Имя Фамилия для отображения в гриде. Теперь тебе надо сделать комбобокс выбора сотрудников для этого достаточно фамилии, тем более что нужна сортировка. Возникает дилема, ведь твой сомбобокс будет вызывать ToString.
ну у меня такого не будет - выберут товар, а в элементе есть мембер с ID в базе
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines