C# ListView虚拟化要求RetrieveVirtualItem事件或OnRetrieveVirtualItem方法提供有效的ListViewItem
有人能告诉我这个密码哪里错了吗。。。我知道C# ListView虚拟化要求RetrieveVirtualItem事件或OnRetrieveVirtualItem方法提供有效的ListViewItem,c#,C#,有人能告诉我这个密码哪里错了吗。。。我知道listView1\u RetrieveVirtualItem方法中存在一些问题,但我无法更正。我得到这个错误: ListView虚拟化要求RetrieveVirtualItem事件或OnRetrieveVirtualItem方法提供有效的ListViewItem 这是我的密码: public partial class Form1 : Form { public Form1() { InitializeComponen
listView1\u RetrieveVirtualItem
方法中存在一些问题,但我无法更正。我得到这个错误:
ListView虚拟化要求RetrieveVirtualItem事件或OnRetrieveVirtualItem方法提供有效的ListViewItem
这是我的密码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
_fileInfoCollection = new Queue<ListViewFileInfo>();
}
private void GetFileInformation(string drive)
{
_fileInfoCollection.Clear();
var directory = new DirectoryInfo(drive);
var files = directory.GetFiles("*.*", SearchOption.TopDirectoryOnly);
foreach (var file in files)
{
_fileInfoCollection.Enqueue(new ListViewFileInfo() { FileName = file.Name, FilePath = file.FullName });
}
}
private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
if (_fileInfoCollection.Count > 0)
{
ListViewFileInfo fileInfo = _fileInfoCollection.Dequeue();
var listViewItem = new ListViewItem();
listViewItem.Text = fileInfo.FileName;
var listViewSubItem = new ListViewItem.ListViewSubItem();
listViewSubItem.Text = fileInfo.FilePath;
listViewItem.SubItems.Add(listViewSubItem);
e.Item = listViewItem;
}
}
private void comboBoxDrive_SelectedIndexChanged(object sender, EventArgs e)
{
GetFileInformation(comboBoxDrive.Text);
}
private Queue<ListViewFileInfo> _fileInfoCollection;
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
_fileInfoCollection=newqueue();
}
私有void GetFileInformation(字符串驱动器)
{
_fileInfoCollection.Clear();
var directory=newdirectoryinfo(驱动器);
var files=directory.GetFiles(“*.*”,SearchOption.TopDirectoryOnly);
foreach(文件中的var文件)
{
_fileInfoCollection.Enqueue(新的ListViewFileInfo(){FileName=file.Name,FilePath=file.FullName});
}
}
私有无效列表视图1_RetrieveVirtualItem(对象发送方,RetrieveVirtualItemEventArgs e)
{
如果(_fileInfoCollection.Count>0)
{
ListViewFileInfo文件信息=_fileInfoCollection.Dequeue();
var listViewItem=新listViewItem();
listViewItem.Text=fileInfo.FileName;
var listViewSubItem=新建ListViewItem.listViewSubItem();
listViewSubItem.Text=fileInfo.FilePath;
listViewItem.SubItems.Add(listViewSubItem);
e、 项目=listViewItem;
}
}
private void ComboxDrive\u SelectedIndexChanged(对象发送方,事件参数e)
{
GetFileInformation(comboBoxDrive.Text);
}
专用队列(fileInfoCollection);
}
使用ListView虚拟模式的代码仍然缺少一些重要信息。
首先,我们需要将ListView属性的值设置为VirtualListSize。
其次,我们需要设置一个缓存值来正确检索ListItem
我们应该记住RetrieveVirtualItem事件始终需要返回ListViewItem
你可以在这里查阅:
我已经根据我的假设修改了你的代码,你可以按照你的想法修改它。希望这有帮助
public partial class Form1 : Form
{
private ListViewItem[] myCache; //array to cache items for the virtual list
private int firstItem; //stores the index of the first item in the cache
public Form1()
{
InitializeComponent();
_fileInfoCollection = new Queue<ListViewFileInfo>();
}
private void GetFileInformation(string drive)
{
_fileInfoCollection.Clear();
var directory = new DirectoryInfo(drive);
var files = directory.GetFiles("*.*", SearchOption.TopDirectoryOnly);
myCache = new ListViewItem[files.Length];
int temp = 0;
foreach (var file in files)
{
_fileInfoCollection.Enqueue(new ListViewFileInfo() { FileName = file.Name, FilePath = file.FullName });
ListViewFileInfo fileInfo = _fileInfoCollection.Dequeue();
var listViewItem = new ListViewItem();
listViewItem.Text = fileInfo.FileName;
var listViewSubItem = new ListViewItem.ListViewSubItem();
listViewSubItem.Text = fileInfo.FilePath;
listViewItem.SubItems.Add(listViewSubItem);
myCache[temp] = listViewItem;
temp++;
}
listView1.VirtualListSize = myCache.Length;
}
private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
if (myCache != null && e.ItemIndex >= firstItem && e.ItemIndex < firstItem + myCache.Length)
{
//A cache hit, so get the ListViewItem from the cache instead of making a new one.
e.Item = myCache[e.ItemIndex - firstItem];
}
else
{
//A cache miss, so create a new ListViewItem and pass it back.
e.Item = new ListViewItem();
}
}
private void comboBoxDrive_SelectedIndexChanged(object sender, EventArgs e)
{
GetFileInformation(comboBoxDrive.Text);
}
private Queue<ListViewFileInfo> _fileInfoCollection;
}
公共部分类表单1:表单
{
私有ListViewItem[]myCache;//用于缓存虚拟列表项的数组
private int firstItem;//在缓存中存储第一项的索引
公共表格1()
{
初始化组件();
_fileInfoCollection=newqueue();
}
私有void GetFileInformation(字符串驱动器)
{
_fileInfoCollection.Clear();
var directory=newdirectoryinfo(驱动器);
var files=directory.GetFiles(“*.*”,SearchOption.TopDirectoryOnly);
myCache=newListViewItem[files.Length];
内部温度=0;
foreach(文件中的var文件)
{
_fileInfoCollection.Enqueue(新的ListViewFileInfo(){FileName=file.Name,FilePath=file.FullName});
ListViewFileInfo文件信息=_fileInfoCollection.Dequeue();
var listViewItem=新listViewItem();
listViewItem.Text=fileInfo.FileName;
var listViewSubItem=新建ListViewItem.listViewSubItem();
listViewSubItem.Text=fileInfo.FilePath;
listViewItem.SubItems.Add(listViewSubItem);
myCache[temp]=listViewItem;
temp++;
}
listView1.VirtualListSize=myCache.Length;
}
私有无效列表视图1_RetrieveVirtualItem(对象发送方,RetrieveVirtualItemEventArgs e)
{
如果(myCache!=null&&e.ItemIndex>=firstItem&&e.ItemIndex
以下是完整的代码
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.listView1 = new System.Windows.Forms.ListView();
this.columnHeaderIndex = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeaderInformation = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.comboBoxDrive = new System.Windows.Forms.ComboBox();
this.SuspendLayout();
//
// listView1
//
this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeaderIndex,
this.columnHeaderInformation});
this.listView1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.listView1.Location = new System.Drawing.Point(0, 24);
this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(551, 249);
this.listView1.TabIndex = 0;
this.listView1.UseCompatibleStateImageBehavior = false;
this.listView1.View = System.Windows.Forms.View.Details;
this.listView1.VirtualListSize = 500;
this.listView1.VirtualMode = true;
this.listView1.RetrieveVirtualItem += new System.Windows.Forms.RetrieveVirtualItemEventHandler(this.listView1_RetrieveVirtualItem);
//
// columnHeaderIndex
//
this.columnHeaderIndex.Text = "Index";
//
// columnHeaderInformation
//
this.columnHeaderInformation.Text = "Information";
this.columnHeaderInformation.Width = 400;
//
// comboBoxDrive
//
this.comboBoxDrive.FormattingEnabled = true;
this.comboBoxDrive.Items.AddRange(new object[] {
"C:",
"D:"});
this.comboBoxDrive.Location = new System.Drawing.Point(-4, 0);
this.comboBoxDrive.Name = "comboBoxDrive";
this.comboBoxDrive.Size = new System.Drawing.Size(121, 21);
this.comboBoxDrive.TabIndex = 2;
this.comboBoxDrive.SelectedIndexChanged += new System.EventHandler(this.comboBoxDrive_SelectedIndexChanged);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(551, 273);
this.Controls.Add(this.comboBoxDrive);
this.Controls.Add(this.listView1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ListView listView1;
private System.Windows.Forms.ColumnHeader columnHeaderInformation;
private System.Windows.Forms.ColumnHeader columnHeaderIndex;
private ComboBox comboBoxDrive;
//
///设计器支持所需的方法-不修改
///此方法的内容与代码编辑器一起使用。
///
私有void InitializeComponent()
{
this.listView1=new System.Windows.Forms.ListView();
this.columnHeaderIndex=((System.Windows.Forms.ColumnHeader)(新的System.Windows.Forms.ColumnHeader());
this.columnHeaderInformation=((System.Windows.Forms.ColumnHeader)(新的System.Windows.Forms.ColumnHeader());
this.comboBoxDrive=new System.Windows.Forms.ComboBox();
这个.SuspendLayout();
//
//列表视图1
//
this.listView1.Columns.AddRange(新System.Windows.Forms.ColumnHeader[]{
这是columnHeaderIndex,
这是一种新的信息});
this.listView1.Dock=System.Windows.Forms.DockStyle.Bottom;
this.listView1.Location=新系统.Drawing.Point(0,24);
this.listView1.Name=“listView1”;
this.listView1.Size=新系统.Drawing.Size(551249);
this.listView1.TabIndex=0;
this.listView1.UseCompatibleStateImageBehavior=false;
this.listView1.View=System.Windows.Forms.View.Details;
this.listView1.VirtualListSize=500;
this.listView1.VirtualMode=true;
this.listView1.RetrieveVirtualItem+=新的System.Windows.Forms.RetrieveVirtualItemEventHandler(this.listView1\u RetrieveVirtualItem);
//
//柱头索引
//
this.columnHeaderIndex.Text=“Index”;
//
//柱头信息
//
this.columnHeaderInformation.Text=“信息”;
this.columnHeaderInformation.Width=400;
//
//