Hi All
I used listview and tried to update it by using Addrange.
When the number of items is less, it works fine.. But I
need to update nearly 200,000 items and it hangs. Also i
need to add images to listview also(This is to list all
the items in my inbox, and want to give the user the feel
of outlook).
Since it hangs for even 1000 items in the inbox, i tried
to shift to virtual listview. But virtual listview
(extending listview) didnt let me to add images.. i am
pasting the code here. Can anyone pls help me to let 1)
IMAGES TO BE ADDED TO THIS CODE
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)
ListViewMessages.LVM_SETITEMCOUNT,
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.CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
// LVS_OWNERDATA style must be set when
the control is created
cp.Style |= (int)
ListViewStyles.LVS_OWNERDATA;
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 ArgumentException("Icon
views are invalid for virtual ListViews", "View");
}
base.View = value;
}
}
#region Display query callbacks
public event QueryItemTextHandler QueryItemText;
public event QueryItemImageHandler QueryItemImage;
public event QueryItemIndentHandler
QueryItemIndent;
#endregion
void OnDispInfoNotice(ref Message m, bool
useAnsi) {
LVDISPINFO info = (LVDISPINFO)m.GetLParam
(typeof(LVDISPINFO));
string lvtext = null;
if((info.item.mask & (uint)
ListViewItemMask.LVIF_TEXT) > 0) {
if (QueryItemText != null) {
QueryItemText(info.item.iItem,
info.item.iSubItem, out lvtext);
if (lvtext != null) {
try {
int maxIndex = Math.Min(info.item.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(data,
0, info.item.pszText, data.Length);
}
catch (Exception e) {
Debug.WriteLine("Failed to
copy text name from client: " + e.ToString
(), "VirtualListView.OnDispInfoNotice");
}
}
}
}
if((info.item.mask & (uint)
ListViewItemMask.LVIF_IMAGE) > 0) {
int imageIndex = 0;
if (QueryItemImage != null) {
QueryItemImage(info.item.iItem,
info.item.iSubItem, out imageIndex);
}
info.item.iImage = imageIndex;
}
if ((info.item.mask & (uint)
ListViewItemMask.LVIF_INDENT) > 0) {
int itemIndent = 0;
if (QueryItemIndent != null) {
QueryItemIndent(info.item.iItem, out
itemIndent);
}
info.item.iIndent = itemIndent;
}
m.Result = new IntPtr(0);
}
protected override void WndProc(ref
System.Windows.Forms.Message m) {
NMHDR nm1;
bool messageProcessed = false;
switch (m.Msg) {
case (int)WindowsMessage.WM_REFLECT +
(int)WindowsMessage.WM_NOTIFY:
nm1 = (NMHDR) m.GetLParam(typeof
(NMHDR));
switch(nm1.code) {
case (int)
ListViewNotices.LVN_GETDISPINFOW:
OnDispInfoNotice(ref m,
false);
messageProcessed = true;
break;
default:
break;
}
break;
default:
break;
}
if (!messageProcessed) {
base.WndProc(ref m);
}
}
}
}
Also it's flickering.. I tried to prevent it by using
LockWindowUpdate. But still it flickers.
2) Wot can be done to avoid flickering???
Then tried to list only the page user scrolls to.. But
for this i could track scroll bar events, but when i
override and tried to look how it scrolls by displaying
messages, it scrolls differently.. I am pasting that code
tooooooo.... pls provide me some suggestion
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
namespace CtrPagingListView
{
#region VirtualListView Delegates
public delegate void QueryItemTextHandler(int
item, int subItem, out string text);
public delegate void QueryItemImageHandler(int
item, int subItem, out string text );
public delegate void QueryItemIndentHandler(int
item, out int itemIndent);
#endregion
public class CtrPagingListView :
System.Windows.Forms.ListView
{
const int WM_HSCROLL = 0x0114;
const int WM_VSCROLL = 0x0115;
protected const int WM_KEYDOWN = 0x0100;
// windows key codes, not used any more
protected const int VK_LEFT = 0x0025;
protected const int VK_UP = 0x0026;
protected const int VK_RIGHT = 0x0027;
protected const int VK_DOWN = 0x0028;
public int i = 0;
private System.ComponentModel.Container
components = null;
// 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)
ListViewMessages.LVM_SETITEMCOUNT,
itemCount,
0);
}
}
public CtrPagingListView()
{
View = View.Details;
Sorting = SortOrder.None;
// This call is required by the
Windows.Forms Form Designer.
//InitializeComponent();
// TODO: Add any initialization
after the InitComponent call
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool
disposing )
{
if( disposing )
{
if( components != null )
components.Dispose
();
}
base.Dispose( disposing );
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support -
do not modify
/// the contents of this method with the
code editor.
/// </summary>
private void InitializeComponent()
{
//
// CtrPagingListView
//
this.Size = new
System.Drawing.Size(352, 192);
}
#endregion
protected override void WndProc(ref
System.Windows.Forms.Message msg)
{
////added from virtual listview
NMHDR nm1;
bool messageProcessed = false;
switch (msg.Msg)
{
case (int)
WindowsMessage.WM_REFLECT + (int)WindowsMessage.WM_NOTIFY:
nm1 = (NMHDR)
msg.GetLParam(typeof(NMHDR));
switch(nm1.code)
{
case (int)
ListViewNotices.LVN_GETDISPINFOW:
OnDispInfoNotice(ref msg, false);
messageProcessed = true;
break;
default:
break;
}
break;
default:
break;
}
if (!messageProcessed)
{
base.WndProc(ref msg);
}
////upto
int NUMLINES = 5000;
int numLinesPerpage = 10;
if(msg.Msg == WM_VSCROLL)
{
System.IntPtr param =
msg.WParam;
string str;
switch ((int)param)
{
case 7:
System.Windows.Forms.MessageBox.Show("SB_BOTTOM
message" + (NUMLINES - numLinesPerpage) + "to" +
(NUMLINES-1));
i =
NUMLINES - numLinesPerpage;
break;
case 0:
System.Windows.Forms.MessageBox.Show("SB_linwup
WM_HSCROLL message" + (i - 1) + " to " + (i +
numLinesPerpage - 1));
i = i - 1;
break;
case 1:
System.Windows.Forms.MessageBox.Show("SB_LINEdown
message" + (i + 1) + "to" + (i + numLinesPerpage + 1));
i = i + 1;
break;
case 2:
System.Windows.Forms.MessageBox.Show("SB_PAGEUP
message"+ (i-numLinesPerpage) + "to" + (i));
i = i-
numLinesPerpage;
break;
case 3:
System.Windows.Forms.MessageBox.Show("SB_PAGEDOWN
message" + (i+numLinesPerpage) + " to " +
(i+numLinesPerpage+numLinesPerpage));
i = i +
numLinesPerpage;
break;
case 5:
System.Windows.Forms.MessageBox.Show
("SB_THUMBTRACK message");
break;
}
}
base.WndProc(ref msg);
}
protected override void OnMouseUp
(MouseEventArgs e)
{
System.Windows.Forms.MessageBox.Show
("ONMOusedown" + e.X + " Delta " + e.Delta);
System.Windows.Forms.MessageBox.Show
("ONMOusedown" + e.Y);
base.OnMouseUp(e);
}
public override bool PreProcessMessage
(ref System.Windows.Forms.Message
msg)
{
//Convert key code to a .NET Keys
structure
// Convert key code to a .NET
Keys structure
Keys keyData = ((Keys) (int)
msg.WParam) | ModifierKeys;
Keys keyCode = ((Keys) (int)
msg.WParam);
int numLinesPerpage = 10;
// handle message
if (keyData == Keys.Next)
{
System.Windows.Forms.MessageBox.Show("next page"
+
i + "to" + (i +
numLinesPerpage));
i = i + numLinesPerpage;
}
else if (keyData == Keys.Prior)
{
System.Windows.Forms.MessageBox.Show("prev
message"
+ i + "to" + (i -
numLinesPerpage));
i = i - numLinesPerpage;
}
else if (keyData == Keys.Up)
{
System.Windows.Forms.MessageBox.Show("UP" +
i + "to" +( i -
1));
i = i - 1;
}
else if (keyData == Keys.Down)
{
System.Windows.Forms.MessageBox.Show("DOWN" + i +
"to" + (i + 1));
i = i + 1;
}
else if (keyData == Keys.Left)
{
System.Windows.Forms.MessageBox.Show("Left");
}
else if (keyData == Keys.Right)
{
System.Windows.Forms.MessageBox.Show("Right");
}
return base.PreProcessMessage(ref
msg);
}
////this part of code is added from virtual list view
protected override
System.Windows.Forms.CreateParams CreateParams
{
get
{
CreateParams cp =
base.CreateParams;
// LVS_OWNERDATA style
must be set when the control is created
cp.Style |= (int)
ListViewStyles.LVS_OWNERDATA;
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
ArgumentException("Icon views are invalid for virtual
ListViews", "View");
}
base.View = value;
}
}
#region Display query callbacks
public event QueryItemTextHandler
QueryItemText;
public event QueryItemImageHandler
QueryItemImage;
public event QueryItemIndentHandler
QueryItemIndent;
#endregion
void OnDispInfoNotice(ref Message m, bool
useAnsi)
{
LVDISPINFO info = (LVDISPINFO)
m.GetLParam(typeof(LVDISPINFO));
string lvtext = null;
if((info.item.mask & (uint)
ListViewItemMask.LVIF_TEXT) > 0)
{
if (QueryItemText !=
null)
{
QueryItemText
(info.item.iItem, info.item.iSubItem, out lvtext);
if (lvtext !=
null)
{
try
{
int maxIndex = Math.Min(info.item.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(data,
0, info.item.pszText, data.Length);
}
catch
(Exception e)
{
System.Windows.Forms.MessageBox.Show("Failed to
copy text name from client: " + e.ToString
(), "VirtualListView.OnDispInfoNotice");
}
}
}
}
if((info.item.mask & (uint)
ListViewItemMask.LVIF_IMAGE) > 0)
{
string imageIndex;
if (QueryItemImage !=
null)
{
QueryItemImage
(info.item.iItem, info.item.iSubItem, out imageIndex);
}
//info.item.iImage =
imageIndex;
}
if ((info.item.mask & (uint)
ListViewItemMask.LVIF_INDENT) > 0)
{
int itemIndent = 0;
if (QueryItemIndent !=
null)
{
QueryItemIndent
(info.item.iItem, out itemIndent);
}
info.item.iIndent =
itemIndent;
}
m.Result = new IntPtr(0);
}
}
} 2 4682
are you using Listview1.BeginUpdate() (before you add) and
Listview1.EndUpdate (and after your finished)
these 2 calls will speed up your code drastically and it should prevent it
from hanging.
"Anushya devi" <an*******@discussions.microsoft.com> wrote in message
news:02****************************@phx.gbl... Hi All I used listview and tried to update it by using Addrange. When the number of items is less, it works fine.. But I need to update nearly 200,000 items and it hangs. Also i need to add images to listview also(This is to list all the items in my inbox, and want to give the user the feel of outlook).
Since it hangs for even 1000 items in the inbox, i tried to shift to virtual listview. But virtual listview (extending listview) didnt let me to add images.. i am pasting the code here. Can anyone pls help me to let 1) IMAGES TO BE ADDED TO THIS CODE
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) ListViewMessages.LVM_SETITEMCOUNT, 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.CreateParams CreateParams { get { CreateParams cp = base.CreateParams; // LVS_OWNERDATA style must be set when the control is created cp.Style |= (int) ListViewStyles.LVS_OWNERDATA; 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 ArgumentException("Icon views are invalid for virtual ListViews", "View"); } base.View = value; } }
#region Display query callbacks public event QueryItemTextHandler QueryItemText; public event QueryItemImageHandler QueryItemImage; public event QueryItemIndentHandler QueryItemIndent; #endregion
void OnDispInfoNotice(ref Message m, bool useAnsi) {
LVDISPINFO info = (LVDISPINFO)m.GetLParam (typeof(LVDISPINFO)); string lvtext = null;
if((info.item.mask & (uint) ListViewItemMask.LVIF_TEXT) > 0) { if (QueryItemText != null) { QueryItemText(info.item.iItem, info.item.iSubItem, out lvtext); if (lvtext != null) { try {
int maxIndex = Math.Min(info.item.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(data, 0, info.item.pszText, data.Length); } catch (Exception e) { Debug.WriteLine("Failed to copy text name from client: " + e.ToString (), "VirtualListView.OnDispInfoNotice"); } } } }
if((info.item.mask & (uint) ListViewItemMask.LVIF_IMAGE) > 0) { int imageIndex = 0; if (QueryItemImage != null) { QueryItemImage(info.item.iItem, info.item.iSubItem, out imageIndex); } info.item.iImage = imageIndex; }
if ((info.item.mask & (uint) ListViewItemMask.LVIF_INDENT) > 0) { int itemIndent = 0; if (QueryItemIndent != null) { QueryItemIndent(info.item.iItem, out itemIndent); } info.item.iIndent = itemIndent; } m.Result = new IntPtr(0); }
protected override void WndProc(ref System.Windows.Forms.Message m) { NMHDR nm1; bool messageProcessed = false; switch (m.Msg) { case (int)WindowsMessage.WM_REFLECT + (int)WindowsMessage.WM_NOTIFY: nm1 = (NMHDR) m.GetLParam(typeof (NMHDR)); switch(nm1.code) { case (int) ListViewNotices.LVN_GETDISPINFOW: OnDispInfoNotice(ref m, false); messageProcessed = true; break; default: break; } break; default: break; } if (!messageProcessed) { base.WndProc(ref m); } } } } Also it's flickering.. I tried to prevent it by using LockWindowUpdate. But still it flickers. 2) Wot can be done to avoid flickering???
Then tried to list only the page user scrolls to.. But for this i could track scroll bar events, but when i override and tried to look how it scrolls by displaying messages, it scrolls differently.. I am pasting that code tooooooo.... pls provide me some suggestion using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Data; using System.Windows.Forms;
namespace CtrPagingListView {
#region VirtualListView Delegates public delegate void QueryItemTextHandler(int item, int subItem, out string text); public delegate void QueryItemImageHandler(int item, int subItem, out string text ); public delegate void QueryItemIndentHandler(int item, out int itemIndent); #endregion
public class CtrPagingListView : System.Windows.Forms.ListView
{
const int WM_HSCROLL = 0x0114; const int WM_VSCROLL = 0x0115; protected const int WM_KEYDOWN = 0x0100; // windows key codes, not used any more protected const int VK_LEFT = 0x0025; protected const int VK_UP = 0x0026; protected const int VK_RIGHT = 0x0027; protected const int VK_DOWN = 0x0028; public int i = 0; private System.ComponentModel.Container components = null; // 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) ListViewMessages.LVM_SETITEMCOUNT, itemCount, 0); } } public CtrPagingListView() { View = View.Details; Sorting = SortOrder.None; // This call is required by the Windows.Forms Form Designer. //InitializeComponent(); // TODO: Add any initialization after the InitComponent call
}
/// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if( components != null ) components.Dispose (); } base.Dispose( disposing ); } #region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { // // CtrPagingListView // this.Size = new System.Drawing.Size(352, 192);
} #endregion
protected override void WndProc(ref System.Windows.Forms.Message msg) { ////added from virtual listview NMHDR nm1; bool messageProcessed = false; switch (msg.Msg) { case (int) WindowsMessage.WM_REFLECT + (int)WindowsMessage.WM_NOTIFY: nm1 = (NMHDR) msg.GetLParam(typeof(NMHDR)); switch(nm1.code) { case (int) ListViewNotices.LVN_GETDISPINFOW:
OnDispInfoNotice(ref msg, false);
messageProcessed = true; break; default: break; } break; default: break; } if (!messageProcessed) { base.WndProc(ref msg); } ////upto int NUMLINES = 5000;
int numLinesPerpage = 10;
if(msg.Msg == WM_VSCROLL) { System.IntPtr param = msg.WParam; string str; switch ((int)param) { case 7:
System.Windows.Forms.MessageBox.Show("SB_BOTTOM message" + (NUMLINES - numLinesPerpage) + "to" + (NUMLINES-1)); i = NUMLINES - numLinesPerpage; break; case 0:
System.Windows.Forms.MessageBox.Show("SB_linwup WM_HSCROLL message" + (i - 1) + " to " + (i + numLinesPerpage - 1)); i = i - 1; break; case 1:
System.Windows.Forms.MessageBox.Show("SB_LINEdown message" + (i + 1) + "to" + (i + numLinesPerpage + 1));
i = i + 1; break; case 2: System.Windows.Forms.MessageBox.Show("SB_PAGEUP message"+ (i-numLinesPerpage) + "to" + (i)); i = i- numLinesPerpage; break; case 3:
System.Windows.Forms.MessageBox.Show("SB_PAGEDOWN message" + (i+numLinesPerpage) + " to " + (i+numLinesPerpage+numLinesPerpage)); i = i + numLinesPerpage; break; case 5:
System.Windows.Forms.MessageBox.Show ("SB_THUMBTRACK message"); break; } } base.WndProc(ref msg);
}
protected override void OnMouseUp (MouseEventArgs e) {
System.Windows.Forms.MessageBox.Show ("ONMOusedown" + e.X + " Delta " + e.Delta);
System.Windows.Forms.MessageBox.Show ("ONMOusedown" + e.Y);
base.OnMouseUp(e); } public override bool PreProcessMessage (ref System.Windows.Forms.Message
msg) {
//Convert key code to a .NET Keys structure // Convert key code to a .NET Keys structure Keys keyData = ((Keys) (int) msg.WParam) | ModifierKeys; Keys keyCode = ((Keys) (int) msg.WParam); int numLinesPerpage = 10;
// handle message if (keyData == Keys.Next) {
System.Windows.Forms.MessageBox.Show("next page" +
i + "to" + (i + numLinesPerpage));
i = i + numLinesPerpage; } else if (keyData == Keys.Prior) {
System.Windows.Forms.MessageBox.Show("prev message"
+ i + "to" + (i - numLinesPerpage));
i = i - numLinesPerpage;
} else if (keyData == Keys.Up) {
System.Windows.Forms.MessageBox.Show("UP" +
i + "to" +( i - 1)); i = i - 1;
} else if (keyData == Keys.Down) {
System.Windows.Forms.MessageBox.Show("DOWN" + i +
"to" + (i + 1)); i = i + 1; } else if (keyData == Keys.Left) {
System.Windows.Forms.MessageBox.Show("Left");
} else if (keyData == Keys.Right) {
System.Windows.Forms.MessageBox.Show("Right");
} return base.PreProcessMessage(ref msg); } ////this part of code is added from virtual list view protected override System.Windows.Forms.CreateParams CreateParams { get { CreateParams cp = base.CreateParams; // LVS_OWNERDATA style must be set when the control is created cp.Style |= (int) ListViewStyles.LVS_OWNERDATA; 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 ArgumentException("Icon views are invalid for virtual ListViews", "View"); } base.View = value; } }
#region Display query callbacks public event QueryItemTextHandler QueryItemText; public event QueryItemImageHandler QueryItemImage; public event QueryItemIndentHandler QueryItemIndent; #endregion
void OnDispInfoNotice(ref Message m, bool useAnsi) {
LVDISPINFO info = (LVDISPINFO) m.GetLParam(typeof(LVDISPINFO)); string lvtext = null;
if((info.item.mask & (uint) ListViewItemMask.LVIF_TEXT) > 0) { if (QueryItemText != null) { QueryItemText (info.item.iItem, info.item.iSubItem, out lvtext); if (lvtext != null) { try {
int maxIndex = Math.Min(info.item.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(data, 0, info.item.pszText, data.Length); } catch (Exception e) {
System.Windows.Forms.MessageBox.Show("Failed to copy text name from client: " + e.ToString (), "VirtualListView.OnDispInfoNotice"); } } } }
if((info.item.mask & (uint) ListViewItemMask.LVIF_IMAGE) > 0) { string imageIndex; if (QueryItemImage != null) { QueryItemImage (info.item.iItem, info.item.iSubItem, out imageIndex); } //info.item.iImage = imageIndex; }
if ((info.item.mask & (uint) ListViewItemMask.LVIF_INDENT) > 0) { int itemIndent = 0; if (QueryItemIndent != null) { QueryItemIndent (info.item.iItem, out itemIndent); } info.item.iIndent = itemIndent; } m.Result = new IntPtr(0); } } }
you could try my listview. It's not %100 compatible with the built in
listview but it should be able to handle the things you seem to need
to do. http://www.glacialcomponents.com/gl.htm
Allen Anderson http://www.glacialcomponents.com
mailto: allen@put my website url here.com
On Sun, 28 Dec 2003 05:36:17 -0800, "Anushya devi"
<an*******@discussions.microsoft.com> wrote: Hi All I used listview and tried to update it by using Addrange. When the number of items is less, it works fine.. But I need to update nearly 200,000 items and it hangs. Also i need to add images to listview also(This is to list all the items in my inbox, and want to give the user the feel of outlook).
Since it hangs for even 1000 items in the inbox, i tried to shift to virtual listview. But virtual listview (extending listview) didnt let me to add images.. i am pasting the code here. Can anyone pls help me to let 1) IMAGES TO BE ADDED TO THIS CODE
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) ListViewMessages.LVM_SETITEMCOUNT, 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.CreateParams CreateParams { get { CreateParams cp = base.CreateParams; // LVS_OWNERDATA style must be set when the control is created cp.Style |= (int) ListViewStyles.LVS_OWNERDATA; 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 ArgumentException("Icon views are invalid for virtual ListViews", "View"); } base.View = value; } }
#region Display query callbacks public event QueryItemTextHandler QueryItemText; public event QueryItemImageHandler QueryItemImage; public event QueryItemIndentHandler QueryItemIndent; #endregion
void OnDispInfoNotice(ref Message m, bool useAnsi) {
LVDISPINFO info = (LVDISPINFO)m.GetLParam (typeof(LVDISPINFO)); string lvtext = null;
if((info.item.mask & (uint) ListViewItemMask.LVIF_TEXT) > 0) { if (QueryItemText != null) { QueryItemText(info.item.iItem, info.item.iSubItem, out lvtext); if (lvtext != null) { try {
int maxIndex = Math.Min(info.item.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(data, 0, info.item.pszText, data.Length); } catch (Exception e) { Debug.WriteLine("Failed to copy text name from client: " + e.ToString (), "VirtualListView.OnDispInfoNotice"); } } } }
if((info.item.mask & (uint) ListViewItemMask.LVIF_IMAGE) > 0) { int imageIndex = 0; if (QueryItemImage != null) { QueryItemImage(info.item.iItem, info.item.iSubItem, out imageIndex); } info.item.iImage = imageIndex; }
if ((info.item.mask & (uint) ListViewItemMask.LVIF_INDENT) > 0) { int itemIndent = 0; if (QueryItemIndent != null) { QueryItemIndent(info.item.iItem, out itemIndent); } info.item.iIndent = itemIndent; } m.Result = new IntPtr(0); }
protected override void WndProc(ref System.Windows.Forms.Message m) { NMHDR nm1; bool messageProcessed = false; switch (m.Msg) { case (int)WindowsMessage.WM_REFLECT + (int)WindowsMessage.WM_NOTIFY: nm1 = (NMHDR) m.GetLParam(typeof (NMHDR)); switch(nm1.code) { case (int) ListViewNotices.LVN_GETDISPINFOW: OnDispInfoNotice(ref m, false); messageProcessed = true; break; default: break; } break; default: break; } if (!messageProcessed) { base.WndProc(ref m); } } } } Also it's flickering.. I tried to prevent it by using LockWindowUpdate. But still it flickers. 2) Wot can be done to avoid flickering???
Then tried to list only the page user scrolls to.. But for this i could track scroll bar events, but when i override and tried to look how it scrolls by displaying messages, it scrolls differently.. I am pasting that code tooooooo.... pls provide me some suggestion using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Data; using System.Windows.Forms;
namespace CtrPagingListView {
#region VirtualListView Delegates public delegate void QueryItemTextHandler(int item, int subItem, out string text); public delegate void QueryItemImageHandler(int item, int subItem, out string text ); public delegate void QueryItemIndentHandler(int item, out int itemIndent); #endregion
public class CtrPagingListView : System.Windows.Forms.ListView
{
const int WM_HSCROLL = 0x0114; const int WM_VSCROLL = 0x0115; protected const int WM_KEYDOWN = 0x0100; // windows key codes, not used any more protected const int VK_LEFT = 0x0025; protected const int VK_UP = 0x0026; protected const int VK_RIGHT = 0x0027; protected const int VK_DOWN = 0x0028; public int i = 0; private System.ComponentModel.Container components = null; // 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) ListViewMessages.LVM_SETITEMCOUNT, itemCount, 0); } } public CtrPagingListView() { View = View.Details; Sorting = SortOrder.None; // This call is required by the Windows.Forms Form Designer. //InitializeComponent(); // TODO: Add any initialization after the InitComponent call
}
/// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if( components != null ) components.Dispose (); } base.Dispose( disposing ); } #region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { // // CtrPagingListView // this.Size = new System.Drawing.Size(352, 192);
} #endregion
protected override void WndProc(ref System.Windows.Forms.Message msg) { ////added from virtual listview NMHDR nm1; bool messageProcessed = false; switch (msg.Msg) { case (int) WindowsMessage.WM_REFLECT + (int)WindowsMessage.WM_NOTIFY: nm1 = (NMHDR) msg.GetLParam(typeof(NMHDR)); switch(nm1.code) { case (int) ListViewNotices.LVN_GETDISPINFOW:
OnDispInfoNotice(ref msg, false);
messageProcessed = true; break; default: break; } break; default: break; } if (!messageProcessed) { base.WndProc(ref msg); } ////upto int NUMLINES = 5000;
int numLinesPerpage = 10;
if(msg.Msg == WM_VSCROLL) { System.IntPtr param = msg.WParam; string str; switch ((int)param) { case 7:
System.Windows.Forms.MessageBox.Show("SB_BOTTOM message" + (NUMLINES - numLinesPerpage) + "to" + (NUMLINES-1)); i = NUMLINES - numLinesPerpage; break; case 0:
System.Windows.Forms.MessageBox.Show("SB_linwup WM_HSCROLL message" + (i - 1) + " to " + (i + numLinesPerpage - 1)); i = i - 1; break; case 1:
System.Windows.Forms.MessageBox.Show("SB_LINEdown message" + (i + 1) + "to" + (i + numLinesPerpage + 1));
i = i + 1; break; case 2: System.Windows.Forms.MessageBox.Show("SB_PAGEUP message"+ (i-numLinesPerpage) + "to" + (i)); i = i- numLinesPerpage; break; case 3:
System.Windows.Forms.MessageBox.Show("SB_PAGEDOWN message" + (i+numLinesPerpage) + " to " + (i+numLinesPerpage+numLinesPerpage)); i = i + numLinesPerpage; break; case 5:
System.Windows.Forms.MessageBox.Show ("SB_THUMBTRACK message"); break; } } base.WndProc(ref msg);
}
protected override void OnMouseUp (MouseEventArgs e) {
System.Windows.Forms.MessageBox.Show ("ONMOusedown" + e.X + " Delta " + e.Delta);
System.Windows.Forms.MessageBox.Show ("ONMOusedown" + e.Y);
base.OnMouseUp(e); } public override bool PreProcessMessage (ref System.Windows.Forms.Message
msg) {
//Convert key code to a .NET Keys structure // Convert key code to a .NET Keys structure Keys keyData = ((Keys) (int) msg.WParam) | ModifierKeys; Keys keyCode = ((Keys) (int) msg.WParam); int numLinesPerpage = 10;
// handle message if (keyData == Keys.Next) {
System.Windows.Forms.MessageBox.Show("next page" +
i + "to" + (i + numLinesPerpage));
i = i + numLinesPerpage; } else if (keyData == Keys.Prior) {
System.Windows.Forms.MessageBox.Show("prev message"
+ i + "to" + (i - numLinesPerpage));
i = i - numLinesPerpage;
} else if (keyData == Keys.Up) {
System.Windows.Forms.MessageBox.Show("UP" +
i + "to" +( i - 1)); i = i - 1;
} else if (keyData == Keys.Down) {
System.Windows.Forms.MessageBox.Show("DOWN" + i +
"to" + (i + 1)); i = i + 1; } else if (keyData == Keys.Left) {
System.Windows.Forms.MessageBox.Show("Left");
} else if (keyData == Keys.Right) {
System.Windows.Forms.MessageBox.Show("Right");
} return base.PreProcessMessage(ref msg); } ////this part of code is added from virtual list view protected override System.Windows.Forms.CreateParams CreateParams { get { CreateParams cp = base.CreateParams; // LVS_OWNERDATA style must be set when the control is created cp.Style |= (int) ListViewStyles.LVS_OWNERDATA; 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 ArgumentException("Icon views are invalid for virtual ListViews", "View"); } base.View = value; } }
#region Display query callbacks public event QueryItemTextHandler QueryItemText; public event QueryItemImageHandler QueryItemImage; public event QueryItemIndentHandler QueryItemIndent; #endregion
void OnDispInfoNotice(ref Message m, bool useAnsi) {
LVDISPINFO info = (LVDISPINFO) m.GetLParam(typeof(LVDISPINFO)); string lvtext = null;
if((info.item.mask & (uint) ListViewItemMask.LVIF_TEXT) > 0) { if (QueryItemText != null) { QueryItemText (info.item.iItem, info.item.iSubItem, out lvtext); if (lvtext != null) { try {
int maxIndex = Math.Min(info.item.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(data, 0, info.item.pszText, data.Length); } catch (Exception e) {
System.Windows.Forms.MessageBox.Show("Failed to copy text name from client: " + e.ToString (), "VirtualListView.OnDispInfoNotice"); } } } }
if((info.item.mask & (uint) ListViewItemMask.LVIF_IMAGE) > 0) { string imageIndex; if (QueryItemImage != null) { QueryItemImage (info.item.iItem, info.item.iSubItem, out imageIndex); } //info.item.iImage = imageIndex; }
if ((info.item.mask & (uint) ListViewItemMask.LVIF_INDENT) > 0) { int itemIndent = 0; if (QueryItemIndent != null) { QueryItemIndent (info.item.iItem, out itemIndent); } info.item.iIndent = itemIndent; } m.Result = new IntPtr(0); } } } This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Anushya |
last post by:
Hi
I am using Listview and inherited listview control overriding WndProc
& PreProcessMessage in ListView.
I need this to customize listview to display only the page the user
scrolls to. Since i...
|
by: Anushya |
last post by:
Hi
I am using Listview and inherited listview control overriding WndProc
& PreProcessMessage in ListView.
I need this to customize listview to display only the page the user
scrolls to. Since i...
|
by: VM |
last post by:
How can I fill up a listview with text file contents?
My listview has two columns and the first column fills up with a while loop:
while (myString != null)
{
myString = sr.Readline();...
|
by: keith |
last post by:
In a ListView control (two columns), I added a few
ListView items.
ListView listview=new ListView();
listview.Parent=this;
listview.View=View.Details;
listview.Columns.Add...
|
by: Dave Y |
last post by:
I am a newbie to C# and am having trouble trying to override a ListView
property method. I have created a new class derived from the Forms.Listview
and I cannot figure out the syntax to override...
|
by: BobAchgill |
last post by:
I am trying to decide which of these controls to use to
implement letting my user select a full row from
MyList. The MyList has several columns which would be
nice to sort by at run time. The...
|
by: Ben H |
last post by:
Hello all
I'm using a listview in my app but I want to scroll the listview
programatically as I hate the look of the standard scrollbar.
So, the listview is scrolled programatically using...
|
by: Peter |
last post by:
Hi,
I have a problem with Listview using checkboxes.
If i check items by code BEFORE the form is shown the Listview.Items
are confused during the ItemChecked Event !!!
After showing the...
|
by: Brian Gaze |
last post by:
I have created a ListView control and have bound this to a datasource.
Within the ItemTemplate of the ListView I have added another ListViewControl
which is databound in the code behind. The idea...
|
by: Faith0G |
last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome former...
|
by: ryjfgjl |
last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
|
by: taylorcarr |
last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
|
by: aa123db |
last post by:
Variable and constants
Use var or let for variables and const fror constants.
Var foo ='bar';
Let foo ='bar';const baz ='bar';
Functions
function $name$ ($parameters$) {
}
...
|
by: ryjfgjl |
last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
|
by: ryjfgjl |
last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
|
by: emmanuelkatto |
last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud.
Please let me know.
Thanks!
Emmanuel
|
by: BarryA |
last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
| |