PDA

View Full Version : ایجاد ListBox/ListView ای که ترتیب آیتم های آن قابل تغییر باشد



saed2006
یک شنبه 21 آذر 1389, 12:57 عصر
چجوری میتونم همچین
http://www.gregphoto.net/sortable/advanced/
drog drop ایجاد کنم

mehdi.mousavi
یک شنبه 21 آذر 1389, 13:28 عصر
چجوری میتونم همچین
http://www.gregphoto.net/sortable/advanced/
drog drop ایجاد کنم

سلام.
لطفا به این مقاله (http://www.codeproject.com/KB/combobox/DragDropListBox.aspx) رجوع کنید.

موفق باشید.

پاورقی: چون در بخش C# سوالتون رو مطرح کرده اید، فرض می کنم که می خواهید این کارو در Windows Forms انجام بدید (و نه تحت Web، علیرغم اینکه مثالی که زده اید تحت وب هستش).

saed2006
یک شنبه 21 آذر 1389, 14:13 عصر
سلام.
لطفا به این مقاله (http://www.codeproject.com/KB/combobox/DragDropListBox.aspx) رجوع کنید.

موفق باشید.

پاورقی: چون در بخش C# سوالتون رو مطرح کرده اید، فرض می کنم که می خواهید این کارو در Windows Forms انجام بدید (و نه تحت Web، علیرغم اینکه مثالی که زده اید تحت وب هستش).
اقای موسوی من یک لیست ویو دارم که توش یه سری عکس نشون داده شده میخوام کاربر این عکس رو بتونه بلند کنه و بندازه توی کنترل پانل میشه راهنماییم کنید
در ضمن منظور درگ کردن یک ایتم و انداختن توی پنل هست

mehdi.mousavi
یک شنبه 21 آذر 1389, 15:44 عصر
اقای موسوی من یک لیست ویو دارم که توش یه سری عکس نشون داده شده میخوام کاربر این عکس رو بتونه بلند کنه و بندازه توی کنترل پانل میشه راهنماییم کنید در ضمن منظور درگ کردن یک ایتم و انداختن توی پنل هست

سلام.
برای این کار، ابتدا ItemDrag Event رو روی ListView بگیرید. سپس در Handler اون، بدین شکل عمل کنید:


ListViewItem lvi = (ListViewItem)e.Item;

PictureBox pb = new PictureBox();
pb.Image = lvi.ImageList.Images[lvi.ImageIndex];
DoDragDrop(pb, DragDropEffects.Move);سپس، روی Panel مورد نظر، AllowDrop Property رو true کنید. سپس دو Event Handler برای Event های DragDrop و DragOver روی Panel تعریف کنید.
توی Handler مربوط به DragOver، شما باید e.Effect رو مساوی Move قرار بدید.
در نهایت در Handler مربوطه به DragDrop نیز با استفاده از e.Data.GetData به کنترلی که روی Panel درگ شده می تونید برسید. اگر Control شما null نبود، می تونید اونو به Control Collection پنل اضافه کنید:



IDataObject dataObject = e.Data;

PictureBox pb = dataObject.GetData(dataObject.GetFormats()[0]) as PictureBox;
if (pb != null)
{
pb.Location = this.panel1.PointToClient(new Point(e.X, e.Y));
this.panel1.Controls.Add(pb);
}
دقت کنید که این کد نهایی نیست و فقط برای اینکه متوجه روش بشید این مثال رو زدم. طبیعتا باید تغییرات مورد نظرتون رو در کد فوق اعمال کنید.

موفق باشید.

saed2006
دوشنبه 22 آذر 1389, 11:49 صبح
اقای موسوی میشه کاری کرد که تصویر انتخابی در listviewکه drog میشه رو در هنگام درگ کردن نشون داد عین لینکی که دادم
برای ساختن همچین چیری چه کار باید بکنم؟
تشکر

mehdi.mousavi
دوشنبه 22 آذر 1389, 12:29 عصر
اقای موسوی میشه کاری کرد که تصویر انتخابی در listviewکه drog میشه رو در هنگام درگ کردن نشون داد عین لینکی که دادم برای ساختن همچین چیری چه کار باید بکنم؟ تشکر

سلام.
البته که میشه. یه روش این هستش که روی Source (در مورد مساله شما ListView) خودتون، GiveFeedback رو بگیرید و روی پارامتر ورودیش UseDefaultCursors رو false کنید (یعنی نمیخوام Cursor پیش فرض رو موقع Drag & Drop نشونم بدی). بعدش توی DragEnter مقصد (یعنی Panel برای شما)، Cursor.Default رو به Bitmap ای Set کنید که خودتون از روی تصویر Drag شده ساخته اید. به این ترتیب هر وقت Mouse روی ناحیه Drop قرار بگیره اون تصویر دیده میشه. برای مشاهده یه مثال، می تونید به این آدرس (http://www.switchonthecode.com/tutorials/winforms-using-custom-cursors-with-drag-drop) رجوع کنید. دقت کنید که چطور در این مثال عنوان Node انتخاب شده در درخت برای عمل Drag & Drop، بصورت Bitmap ای روی صفحه کشیده میشه تا حس کنید که انگار اون Text رو واقعا برداشته اید و ...

روش دیگه این هستش که هنگام MouseDown روی ListView ی خودتون، تصویر مورد نظر رو بر اساس مختصات Mouse روی صفحه Paint کنید.

موفق باشید.

saed2006
دوشنبه 22 آذر 1389, 15:24 عصر
سلام.
البته که میشه. یه روش این هستش که روی Source (در مورد مساله شما ListView) خودتون، GiveFeedback رو بگیرید و روی پارامتر ورودیش UseDefaultCursors رو false کنید (یعنی نمیخوام Cursor پیش فرض رو موقع Drag & Drop نشونم بدی). بعدش توی DragEnter مقصد (یعنی Panel برای شما)، Cursor.Default رو به Bitmap ای Set کنید که خودتون از روی تصویر Drag شده ساخته اید. به این ترتیب هر وقت Mouse روی ناحیه Drop قرار بگیره اون تصویر دیده میشه. برای مشاهده یه مثال، می تونید به این آدرس (http://www.switchonthecode.com/tutorials/winforms-using-custom-cursors-with-drag-drop) رجوع کنید. دقت کنید که چطور در این مثال عنوان Node انتخاب شده در درخت برای عمل Drag & Drop، بصورت Bitmap ای روی صفحه کشیده میشه تا حس کنید که انگار اون Text رو واقعا برداشته اید و ...

روش دیگه این هستش که هنگام MouseDown روی ListView ی خودتون، تصویر مورد نظر رو بر اساس مختصات Mouse روی صفحه Paint کنید.

موفق باشید.


من این کد ها


privatevoid userControl11_DragOver(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.All;
}
privatevoid userControl11_DragDrop(object sender, DragEventArgs e)
{
IDataObject dataObject = e.Data;
ListViewItem pb = (ListViewItem)dataObject.GetData(dataObject.GetFor mats()[0]);
InsertMap(); ;
}
privatevoid glacialList1_GiveFeedback(object sender, GiveFeedbackEventArgs e)
{
e.UseDefaultCursors = false;
}
privatevoid userControl11_DragEnter(object sender, DragEventArgs e)
{
Image img = imageList1.Images[_curl.ImageKey];
Graphics g = Graphics.FromImage(img);
userControl11.Cursor.Draw(g, newRectangle(0, 0, 100, 100));
userControl11.Update();
}
privatevoid userControl11_GiveFeedback(object sender, GiveFeedbackEventArgs e)
{
e.UseDefaultCursors = false;
}


نوشتم اما جواب نمیده
در ضمن
GiveFeedbackدر طول drog کردن
اجرا نمیشه

saed2006
دوشنبه 22 آذر 1389, 16:45 عصر
مشکلم اینه که هیچ موقع GiveFeedback اجرا نمیشه

saed2006
چهارشنبه 24 آذر 1389, 17:12 عصر
اقای موسوی لطفا جواب