我有一個串列視圖,我希望能夠從專案中清除然后再次填充它。
我需要將它與我的Engine班級活動一起使用。
當我清除專案并再次運行它時,問題就開始了,它復制了我的專案:

知道為什么會發生以及如何解決嗎?
清除串列視圖或初始化新串列視圖對我不起作用。
我的表格代碼:
using System;
using System.Windows.Forms;
namespace WindowsFormsApp3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private delegate void createListViewCallBack(string i_File, string i_FileStatus);
private void createListView(string i_File, string i_FileStatus)
{
if (this.InvokeRequired)
{
createListViewCallBack s = new createListViewCallBack(createListView);
this.Invoke(s, i_File, i_FileStatus);
}
else
{
ListViewItem item = new ListViewItem(i_File);
item.SubItems.Add(i_FileStatus);
listView1.Items.Add(item);
}
}
private void buttonStart_Click(object sender, EventArgs e)
{
Engine.BuildListViewUpdate = Engine_BuildListViewUpdate;
Engine.BuildList();
//createListView(@"c:\a.txt", @"yes");
//createListView(@"c:\b.txt", @"no");
}
private delegate void buildListUpdateCallBack(string i_File, string i_FileStatus);
private void Engine_BuildListViewUpdate(string i_File, string i_FileStatus)
{
if (this.InvokeRequired)
{
buildListUpdateCallBack s = new buildListUpdateCallBack(Engine_BuildListViewUpdate);
this.Invoke(s, i_File, i_FileStatus);
}
else
{
ListViewItem item = new ListViewItem(i_File);
item.SubItems.Add(i_FileStatus);
listView1.Items.Add(item);
}
}
private void clear1()
{
this.listView1 = new ListView();
//this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
//this.columnHeader1,
//this.columnHeader2});
this.listView1.HideSelection = false;
this.listView1.Location = new System.Drawing.Point(55, 156);
this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(633, 265);
this.listView1.TabIndex = 1;
this.listView1.UseCompatibleStateImageBehavior = false;
this.listView1.View = System.Windows.Forms.View.Details;
}
private void buttonClear_Click(object sender, EventArgs e)
{
listView1.Items.Clear();
//listView1.Clear();
//clear1();
}
}
}
我的引擎類:
namespace WindowsFormsApp3
{
public delegate void BuildListViewEventHandler(string i_File, string i_FileStatus);
static class Engine
{
public static event BuildListViewEventHandler BuildListViewUpdate;
public static void BuildList()
{
BuildListViewUpdate(@"c:\a.txt", @"yes");
BuildListViewUpdate(@"c:\b.txt", @"no");
}
public static void OnBuildListViewUpdate(string i_File, string i_FileStatus)
{
if (BuildListViewUpdate != null)
{
BuildListViewUpdate.Invoke(i_File, i_FileStatus);
}
}
}
}
uj5u.com熱心網友回復:
問題是每次單擊開始時您都在訂閱該事件。
因此,第二次單擊開始按鈕時,事件將觸發兩次,依此類推。
要修復它,請在程式開始時僅訂閱一次事件或在清除串列時取消訂閱
private void buttonClear_Click(object sender, EventArgs e)
{
listView1.Items.Clear();
Engine.BuildListViewUpdate -= Engine_BuildListViewUpdate;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/463728.html
