C# 使用ListViewItem进行异步编程

C# 使用ListViewItem进行异步编程,c#,C#,我是C#编程新手 我想写一个简单的表单应用程序,在每个操作后的ListView上,我将更新正在发生的事情 我写了一些代码来完成这项工作 应用程序工作正常,但ListView上的更新不正常 namespace ReportingTool { public partial class Form1 : Form { public static Form1 form; public Form1() { Ini

我是C#编程新手

我想写一个简单的表单应用程序,在每个操作后的ListView上,我将更新正在发生的事情

我写了一些代码来完成这项工作

应用程序工作正常,但ListView上的更新不正常

    namespace ReportingTool
{
    public partial class Form1 : Form
    {
        public static Form1 form;
        public Form1()
        {
            InitializeComponent();
            form = this;
            WriteToList("1", "Program started");
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            WriteToList("2", "Opening Chrome Browser");
            PageNavigation driver = new PageNavigation();
            await driver.BrowserActions();
            WriteToList("3", "Opening TalentLink page");
            await driver.GoToTalentLinkPageAsync();
        }

        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        public void WriteToList(string id, string action)
        {
            form.Activate();
            ListViewItem x = new ListViewItem(id);
            x.SubItems.Add(action);
            form.listView1.Items.Add(x);
            form.listView1.Refresh();
        }
    }
}

感谢您的帮助。

不幸的是,ListView上有一个bug(或缺乏实现)。基本上,若您对现有列表中的任何项目进行了修改,那个么即使在代码中进行了更新,该更新也不会在UI上可见。您必须在ListView中强制刷新ItemSource。我唯一能做到这一点的方法是保存现有的项目列表,将ItemSource设置为null,并将更新后的列表添加到ItemSource,以便:

    public void WriteToList(string id, string action)
    {
        form.Activate();
        ListViewItem x = new ListViewItem(id);
        x.SubItems.Add(action);
        form.listView1.Items.Add(x);
        form.listView1.Refresh();
        List<YourItems> newList = new List<YourItems>();
        newList = form.listView1;
        form.listView.ItemSource = null;
        form.listView.ItemSource = newList;

    }
public void WriteToList(字符串id,字符串操作)
{
form.Activate();
ListViewItem x=新的ListViewItem(id);
x、 增加(行动);
表单.listView1.Items.Add(x);
form.listView1.Refresh();
List newList=新列表();
newList=form.listView1;
form.listView.ItemSource=null;
form.listView.ItemSource=newList;
}

我也不认为设置类的静态字段是一种很好的方法

有什么问题?此代码中没有异步更新,
writeList()
在UI线程上运行,无论是从同步还是异步事件句柄调用,都应该可以正常工作UI是否冻结?
broweeseractions()
GoToTalentLinkPageAsync()
方法做什么?是的,但表单上没有可见的更新。好像它不存在?driver.BrowserActions()为Selenium设置驱动程序,driver.GoToTalentLinkPageAsync()运行其他方法如何在页面上导航,以及执行什么操作等。您能更具体地说明您的问题吗?它是否会给您任何错误消息,或者只是默默地拒绝更新ListView?您没有提到使用数据绑定和ItemSource。没有虫子。使用数据绑定时,需要更新数据源,而不是直接更新ListView。您只需向列表中添加一个新条目,然后在listview上调用
Refresh
。例如,
\u itemsList.Add(新建您的项目(id、操作);listView
.Refresh();
。您不需要手动添加ListViewItem或替换
ItemSource`可能,我从未尝试过。但是您可以看到,他没有在此处使用数据绑定。您是通过Windows窗体中的
ItemsSource
.BTW属性使用数据绑定的。这是WPF应用程序吗?还是使用了WPF控件?在这种情况下,您可以告诉我们这将通知控件在每次修改集合时更新自身