我一直在 listview 中玩弄虚拟模式,并试图读取一个大约 300mb 的日志文件,这是我到目前为止的代码。它在加载时冻结,但我使用虚拟模式并且只在需要时调用 readlines。我觉得我错过了什么,有人帮忙吗?
public partial class Form1 : Form
{
private const int maxLines = 100;
List<string> list = new List<string>();
public Form1()
{
InitializeComponent();
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog(this) == DialogResult.OK)
{
foreach (string s in openFileDialog1.FileNames)
{
listBox1.Items.Add(s);
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
listView1.VirtualMode = true;
listView1.VirtualListSize = maxLines;
PropertyInfo aProp = typeof(ListView).GetProperty("DoubleBuffered", BindingFlags.NonPublic | BindingFlags.Instance);
aProp.SetValue(listView1, true, null);
}
private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
ListViewItem lvi = new ListViewItem();
lvi.Text = retrieveItem(e.ItemIndex);
listView1.VirtualListSize = addList(textBox1.Text);
ListViewItem.ListViewSubItem lvsi = new ListViewItem.ListViewSubItem();
NumberFormatInfo nfi = new CultureInfo("de-DE").NumberFormat;
nfi.NumberDecimalDigits = 0;
lvsi.Text = e.ItemIndex.ToString("n", nfi);
lvi.SubItems.Add(lvsi);
e.Item = lvi;
}
string retrieveItem(int index)
{
list.Clear();
addList(textBox1.Text);
return list[index];
}
int addList(string keyword)
{
list.Clear();
int counter = 0;
foreach (string line in File.ReadLines("test.log"))
{
if (line.Contains(keyword))
{
list.Add(line);
counter++;
}
}
return counter;
}
private void button1_Click(object sender, EventArgs e)
{
ListViewItem foundItem = listView1.FindItemWithText(textBox1.Text, false, 0, true);
if (foundItem != null)
{
listView1.TopItem = foundItem;
}
}