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;
// 
//