

[C#] ListView drag&drop
Zdravím,
řeším jeden problém s drag&drop mezi ListView a Explorerem. Neví někdo jak zjistit cílovou cestu při přetažení položek z ListViewu do Exploreru? Díky.
Mitch
Zdravím,
řeším jeden problém s drag&drop mezi ListView a Explorerem. Neví někdo jak zjistit cílovou cestu při přetažení položek z ListViewu do Exploreru? Díky.
Mitch
Zpět do poradny Odpovědět na původní otázku Nahoru
Mrkni se sem.
Díky, ale ten dotaz na MSDN je shodou okolností můj
Nevím jestli je moje angličtina až tak hrozná, každopádně mi byl vysvětlen opačný postup, tj. přetažení z exploreru do ListViewu. Rong mě tam odkazuje na článek na Codeprojectu který jsem ještě předtím četl ale odpověď na můj problém tam není.
Není problém aplikovat drag&drop pokud položky ListViewu reprezentují soubory fyzicky uložené na disku, protože se naplní pole cestama a pak se o to programátor nestará. Problém je pokud položky reprezentují soubory např. v archivu... Pak potřebuju při přetažení těchto položek do Exploreru cestu, kam ty soubory extrahuju.
//Edit:
Stejný dotaz je na thread463115.html bohužel bez řešení. Tady tazatel uvažuje spíš než o získání cesty z Exploreru, předání reference na stream ze kterého by se ty data pak vyčetla což asi bude reálnější. Jediná možnost kterou takhle mám je vykostit soubory z archivu do tempu během tažení a předat cesty na ně, ale to je v případě velkých souborů dost časově náročné.
Hmmm. Tak se mrkni sem a je3t2 sem..
Jdu do obchodu :)
Ještě jednou dík za snahu, ale asi mi nepřeje štěstí. Druhý odkaz je článek, který jsem četl ale zase se tam neříká nic o problému přetažení souborů, které nejsou v čase přetažení dostupné. První link vypadal nadějně, tazatel měl stejný problém a vypadalo to že ho vyřešil, ale zapoměl napsat jak
Hůův. No ještě existuje event vytvářený při změně file systému.
Jinak nevím.
//Edit
Jestliže ti jde o aktualizaci toho okna, pak by mělo stačit chytat tu událost (změna ve file-systému) a jestliže tam změna nastane, tak ten ListView překreslit.
O aktualizaci okna nejde. Prostě mám ListView, kde jsou položky reprezentující soubory v ISO obrazu a chtěl jsme uživateli dát možnost extrahovat tyto soubory pomocí drag&drop. Problém je že drag&drop z ListViewu do Exploreru je řešený tak, že informace o objektech (v tomhle případě souborech), které mají být součástí transakce se ukládají do instance DataObject a po přetažení si to Explorer už přebere. Jenže těžko můžu Exploreru poslat cesty k souborům, když jsou součástí ISO obrazu. Potřebuju získat místo, kam to uživatel přetáhl a potom už jsem shopen tam ty soubory extrahovat.
Stačí zajistit, aby se relativně efektivně extrahovaly na tvé známé umístění pouze ty soubory, které jsou nutné (vybrané) pro tuto operaci - tedy ty, které user vybral ("známé umístění" potom bude např. adresář z kama běží tvůj program (fantazii se meze nekladou).
Nakonec nastavíš "jako objekt přesunu" ty extrahované soubory ve "známém umístění" a nebo předáš referenci na objekt drag&drop (ten vytvořený uživatelem) vlastnímu konstruktoru paralelního vlákna, to by dokonce nadále bylo možné pracovat s programem, zatímco ten by extrahoval soubory, zobrazoval uživateli procentuální průběh a podobné vtipy.
A teď to nejlepší, časová náročnost je téměř totožná jako samotná extrakce - tedy v případě, že extrahováno je na totožný logický disk (přepisujou se jen odkazy v tabulce FAT), v horším případě (jiného disku, oddílu...) by se kopírovaly pouze uživatelem navolené soubory.
Otázkou je jestli to celé stojí za tu námahu (v porovnání s přínosem).
To, o čo sa snažíš, takýmto spôsobom spraviť nejde (pokiaľ viem), pretože to pustenie objektu si už spracováva každá aplikácia po svojom.
Nechce sa mi to skúšať či to ide, ale skúsil by som sa pozrieť na udalosti QueryContinueDrag a GiveFeedback a pred pustením objektu v Exploreri (pri akcii DragAction.Drop), by som vytvoril na disku dočasný súbor s požadovaným obsahom. Takže by sa prenášali fyzicky súbory (nešlo by to priamo z pamäte do cieľového adresára).
Ak by to nešlo spraviť tesne pred pustením, tak by som vytvoril dočasný súbor už pri začatí operácie drag&drop.
edit: Tak to predsa len pôjde aj priamo z pamäte. Nečítal som to podrobne, ale nadpis vyzerá sľubne: Transferring Virtual Files to Windows Explorer in C#.
Díky za tipy, o vytváření souborů už při započetí táhnutí jsem přemejšlel, ale je to jako se drbat pravou rukou za levým uchem a když vidím, že třeba archivátory tohle nemají zapotřebí tak jsem chtěl zjistit jak to dělají.
Aspoň se nebudu nudit