C# ListView (přidání onScroll eventu, řazení prvků atd..) – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C# ListView (přidání onScroll eventu, řazení prvků atd..) – .NET – Fórum – Programujte.comC# ListView (přidání onScroll eventu, řazení prvků atd..) – .NET – Fórum – Programujte.com

 

klinki0
Návštěvník
11. 7. 2009   #1
-
0
-

Zdravím, mám pár problémů s ListViewem... Je toho docela dost tak se předem omlouvám, ale bude to hodně dlouhé :)

1) potřebuju modifikovat ListView tak, aby měl onScroll event.

Takže jsem si napsal třídu ListViewEx, která dědí původní Windows.Forms.ListView a má navíc event onScroll a má trochu poupravený WndProc. A zrovna tady mám problém...
Hledal jsem na internetu, jak detekovat scroll atd... a našel jsem, že musím detekovat zprávu WM_VSCROLL. Takže už bez problémů detekuju scrollování, ale potřebuju ještě detekovat dodatečné informace. Informace o tom, jak se scrolluje a o kolik by měla být uložená v parametru zprávy WParam. V klasickém WinApi bych si napsal switch ze kterého bych dostal vše co potřebuju
např.



GetScrollInfo (hwnd, SB_HORZ, &si);
xPos = si.nPos;
switch (LOWORD (wParam))
{
// user clicked left arrow
case SB_LINELEFT:
si.nPos -= 1;
break;

// user clicked right arrow
case SB_LINERIGHT:
si.nPos += 1;
break;

// user clicked the scroll bar shaft left of the scroll box
case SB_PAGELEFT:
si.nPos -= si.nPage;
break;

// user clicked the scroll bar shaft right of the scroll box
case SB_PAGERIGHT:
si.nPos += si.nPage;
break;

// user dragged the scroll box
case SB_THUMBTRACK:
si.nPos = si.nTrackPos;
break;

default :
break;
}

( více viz http://msdn.microsoft.com/en-us/library/bb787531%28VS.85%29.aspx ) ale v C# bohužel není makro LOWORD() a tak nevím, jak dostat nižších 16 bitů ke kterým by se pak hodil podobný switch...

Zatím modifikovaný ListView vypadá takto:


public class ListViewEx : ListView
{
// from WinUser.h
private const int WM_PAINT = 0x000F;
private const int WM_VSCROLL = 0x0115;

public enum WM_VSCROLLINFO : short
{
SB_BOTTOM = 7,
SB_LINEDOWN = 1,
SB_LINEUP = 0,
SB_PAGEDOWN = 3,
SB_PAGEUP = 2,
SB_TOP = 6
}

protected override void WndProc(ref Message m)
{
base.WndProc(ref m);

if (m.Msg == WM_VSCROLL)
{
onScroll(this, new EventArgs());
}
}

public event EventHandler onScroll;
}


umí tedy generovat onScroll event, ale zatím tam nejsou žádné informace o tom kam se scrolluje atd...


2) Nevím, jak posunout více položek na začátek nebo na konec ListViewu.
(tedy principiálně vím, ale když posunu jednu z vybraných položek tak se mi změní pořadí položek v ListView.SelectedItems a znovu posunu tu stejnou položku :( )

Ještě pro ukázku kód posunutí na začátek:



private void button1_Click(object sender, EventArgs e)
{
// Na začátek
if (1 == listView1.SelectedItems.Count)
{

ListViewItem item = listView1.SelectedItems[0];


int index;
index = item.Index;

index = 0;

if (index < listView1.Items.Count)
{

listView1.Items.Remove(item);

listView1.Items.Insert(index, item);
}
}
else
{
for (int x = listView1.SelectedItems.Count - 1; x >= 0; x--)
{
ListViewItem item = listView1.SelectedItems[x];

int index;

index = 0;

listView1.Items.Remove(item);
listView1.Items.Insert(index, item);
}
}
}


a teď co to dělá:

1. průchod cyklu:
------------
ListView1.SelectedItems[0] je 1. položka
ListView1.SelectedItems[1] je 2. položka
------------

2. průchod cyklu:
------------
ListView1.SelectedItems[0] je 2. položka
ListView1.SelectedItems[1] je 1. položka

tzn. že 1. průchod cyklu posune 2. položku na začátek ListViewu a druhý průchod cyklu znovu posune tu samou položku znovu na začátek. Tzn. dojde k posunutí pouze 1 položky.


3) Posunování prvků v ListView při použití Groups.
(Myslím že sem někde dokonce našel, že je v tom skutečně bug v zobrazování a byla tam i použita nějaká funkce na opravu, myslím že nějaké překreslení, ale nefungovalo mi to :( )

Při posunování prvků v ListView za použití Groups dojde skutečně k posunutí prvku v Items, ale zobrazí na konci ListViewu :(

Nahlásit jako SPAM
IP: 85.13.98.–
rudolf_franek0
Stálý člen
12. 7. 2009   #2
-
0
-

Pripada mi, ze pro zacatek by bylo lepsi strucne shrnout, co presne ocekavas o tveho noveho ListView (bez naznaku implementace samotneho Controlu). Cele by se to dalo mozna malinko zjednodusit.

Nahlásit jako SPAM
IP: 90.178.66.–
klinki0
Návštěvník
14. 7. 2009   #3
-
0
-

Ok takže stručné shrnutí co potřebuju od novéh ListView:

1) onScroll event
2) Vyřešit bug posunování položek při použití Groups
3) Vyřešit posunování více položek na začátek / na konec

Nahlásit jako SPAM
IP: 85.13.98.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 20 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý