I am trying to add image items to listview. Here how to handle if i
need to add images?? Pls go thru the code.
In the form where i have used this virtualListView , have handled
QueryItemText.. And text alone is working fine..
using System;
using System.Windows. Forms;
using System.Diagnost ics;
namespace Microsoft.Sampl es.VirtualListV iew
{
#region VirtualListView Delegates
public delegate void QueryItemTextHa ndler(int item, int subItem,
out string text);
public delegate void QueryItemImageH andler(int item, int subItem,
out int imageIndex);
public delegate void QueryItemIndent Handler(int item, out int
itemIndent);
#endregion
/// <summary>
/// Summary description for VirtualListView Control.
/// </summary>
public class VirtualListView : ListView {
// store the item count to prevent the call to
SendMessage(LVM _GETITEMCOUNT)
private int itemCount = 0;
public int ItemCount {
get { return itemCount; }
set {
itemCount = value;
int result;
result = WindowsFunction .SendMessage(
this.Handle,
(int)ListViewMe ssages.LVM_SETI TEMCOUNT,
itemCount,
0);
}
}
public VirtualListView ()
{
// virtual listviews must be Details or List view with no
sorting
View = View.Details;
Sorting = SortOrder.None;
}
protected override System.Windows. Forms.CreatePar ams
CreateParams {
get {
CreateParams cp = base.CreatePara ms;
// LVS_OWNERDATA style must be set when the control is
created
cp.Style |= (int)ListViewSt yles.LVS_OWNERD ATA;
return cp;
}
}
public new System.Windows. Forms.View View {
get {
return new System.Windows. Forms.View();
}
set {
if (value == View.LargeIcon ||
value == View.SmallIcon) {
throw new ArgumentExcepti on("Icon views are
invalid for virtual ListViews", "View");
}
base.View = value;
}
}
#region Display query callbacks
public event QueryItemTextHa ndler QueryItemText;
public event QueryItemImageH andler QueryItemImage;
public event QueryItemIndent Handler QueryItemIndent ;
#endregion
void OnDispInfoNotic e(ref Message m, bool useAnsi) {
LVDISPINFO info =
(LVDISPINFO)m.G etLParam(typeof (LVDISPINFO));
string lvtext = null;
if((info.item.m ask & (uint)ListViewI temMask.LVIF_TE XT) >
0) {
if (QueryItemText != null) {
QueryItemText(i nfo.item.iItem, info.item.iSubI tem,
out lvtext);
if (lvtext != null) {
try {
int maxIndex = Math.Min(info.i tem.cchTextMax-1, lvtext.Length);
char[] data = new char[maxIndex+1];
lvtext.CopyTo(0 , data, 0, lvtext.Length);
data[maxIndex] = '\0';
System.Runtime. InteropServices .Marshal.Copy(d ata, 0,
info.item.pszTe xt, data.Length);
}
catch (Exception e) {
Debug.WriteLine ("Failed to copy text name
from client: " + e.ToString(), "VirtualListVie w.OnDispInfoNot ice");
}
}
}
}
if((info.item.m ask & (uint)ListViewI temMask.LVIF_IM AGE) >
0) {
int imageIndex = 0;
if (QueryItemImage != null) {
QueryItemImage( info.item.iItem ,
info.item.iSubI tem, out imageIndex);
}
info.item.iImag e = imageIndex;
}
if ((info.item.mas k & (uint)ListViewI temMask.LVIF_IN DENT)
0) {
int itemIndent = 0;
if (QueryItemInden t != null) {
QueryItemIndent (info.item.iIte m, out itemIndent);
}
info.item.iInde nt = itemIndent;
}
m.Result = new IntPtr(0);
}
protected override void WndProc(ref
System.Windows. Forms.Message m) {
NMHDR nm1;
bool messageProcesse d = false;
switch (m.Msg) {
case (int)WindowsMes sage.WM_REFLECT +
(int)WindowsMes sage.WM_NOTIFY:
nm1 = (NMHDR) m.GetLParam(typ eof(NMHDR));
switch(nm1.code ) {
case (int)ListViewNo tices.LVN_GETDI SPINFOW:
OnDispInfoNotic e(ref m, false);
messageProcesse d = true;
break;
default:
break;
}
break;
default:
break;
}
if (!messageProces sed) {
base.WndProc(re f m);
}
}
}
}