C#:ListView不会添加来自其他类的项目

时间:2017-06-01 12:07:36

标签: c# winforms listview

美好的一天,

我是整个编程的新手,无法找出/找到解决方案。 我一直试图使用来自另一个类的Items填充我的ListView。 但是当Class2返回Array时,ListView似乎没有做任何事情。

我是如何做到的:

1)我搜索某些内容并将值发送到Class2(Form1中的主类):

private void tbSearch_KeyDown(object sender, KeyEventArgs e)
    {
        Class2 cl2 = new Class2();

        if (e.KeyCode == Keys.Enter)
        {
            if (string.IsNullOrEmpty(tbSearch.Text))
            {
                MessageBox.Show("The Textbox is Empty.....");
            }
            else
            {
               listV.Items.Clear(); 
               cl2.Search(tbSearch.Text);  // Give a value to Method in Class2
            }
        }
    }

2)然后在Class2我做一些互联网搜索并返回arrays结果:

public async void Search(string search_value)
    {
            /*** Read the XML Data that i've got from Response ****/

            foreach (XmlNode node in XMLlist)
            {
                /****** Get the values that i need and write them into an array *******/

                string[] result = new string[10];

                result[0] = series_title;
                result[1] = series_type;
                result[2] = series_episodes;
                result[3] = series_score;
                result[4] = series_id;
                result[5] = series_title_english;
                result[6] = series_status;
                result[7] = series_start_date;
                result[8] = series_end_date;
                result[9] = series_image;

                Form1 fm1 = new Form1();
                fm1.Update_SearchList(result); // Return an array to Form1
            }
    }

3)最后我尝试使用返回的array(Form1再次)填充ListView:

public void Update_SearchList(string [] array)
    {
        ListViewItem item = new ListViewItem(array);
        this.listV.BeginUpdate();                
        this.listV.Items.Add(item); // Here the Item.Add() Method doesn't add new Items to the ListView or they just aren't being shown.
        this.listV.EndUpdate();          
    }

listView.View设置为Details,并且正在Form.Load生成列。

我是如何执行listView.Items.Add();方法的问题还是存在其他问题?

当我尝试在一个private void tbSearch_KeyDown(object sender, KeyEventArgs e)时,每个人都可以完成整个操作。

感谢您的时间和美好的一天!

1 个答案:

答案 0 :(得分:0)

您在Form1中创建了Form1 fm1 = new Form1();的新实例,该实例不是您的来电者的实例。

我建议您从Search()返回结果并在Form1中处理,或者更好的是回调函数。

我还没有尝试,但快速旁路解决方案可以通过Form1作为Search()功能的参考,但TBH对我来说看起来很讨厌。

private void tbSearch_KeyDown(object sender, KeyEventArgs e) {
    //...
           cl2.Search(tbSearch.Text, ref this); // pass the ref of current instance to cl2
        }
    }
}

public async void Search(string search_value, ref Form1 frm) {
    //...
    foreach (XmlNode node in XMLlist) {
        // ...
        frm.Update_SearchList(result); // use the frm reference instead
    }
}

public void Update_SearchList(string [] array) {
    if (InvokeRequired)
        BeginInvoke(new MethodInvoker(() => Update_SearchList(array)));
    else {
        ListViewItem item = new ListViewItem(array);
        this.listV.BeginUpdate();                
        this.listV.Items.Add(item);
        this.listV.EndUpdate();  
    }        
}

注意:代码未经过测试,只是一个简单的想法!!!

此外,如果在非异步功能中调用异步,我不会想到你的异步是否会按预期工作。

修改

您还可以尝试返回结果并以主窗体继续。查找草稿代码如下,但它已同步并可能阻止您的UI线程。代码未经测试

private void tbSearch_KeyDown(object sender, KeyEventArgs e) {
    //...
            var results = cl2.Search(tbSearch.Text);
            foreach (var item in results) Update_SearchList(item);
        }
    }
}

public List<xxx> Search(string search_value) {
    //...
    var results = new List<xxx>(); // change type to the correct type
    foreach (XmlNode node in XMLlist) {
        // ...
        results.Add(result);
    }
    return results;
}