美好的一天,
我是整个编程的新手,无法找出/找到解决方案。
我一直试图使用来自另一个类的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)
时,每个人都可以完成整个操作。
感谢您的时间和美好的一天!
答案 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;
}