2017-06-01 8 views
0

おはよう、C#:リストビューは別のクラスからの項目を追加しません

私はプログラミング全体には新しく、解を見つけることができません。 私はListViewに別のクラスから来たアイテムを取り込もうとしています。 Class2Arrayを返すとき、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)そして最後に、私は返さとリストビューを移入しよう(再度のForm1):

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.ViewDetailsに設定され、列はForm.Loadに生成されています。

listView.Items.Add();メソッドの実行方法に問題がありますか、それとも別の問題がありますか?

私はこの全体の操作を1つの単一で行うようにしようとすると、private void tbSearch_KeyDown(object sender, KeyEventArgs e)すべてが動作します。

ありがとうございました。

答えて

0

Form1の新しいインスタンスを呼び出し元のインスタンスではないForm1 fm1 = new Form1();に作成しました。

Search()の結果を返信し、Form1以上の処理をコールバック関数に追加することをお勧めします。

私は試したことがありませんが、クイックバイパスソリューションは関数への参照としてForm1を渡すことができますが、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; 
} 
+0

ありがとうございます。私はあなたが提案したようにしてやろうとしました。同期方法を変更しました。しかし、私は、「は要素が読み取り専用であるため、refまたはout引数として渡すことはできません。' – idkWhatToDo

+0

@idkWhatToDo不思議なことはありません:)それはちょっと考えました。変数を渡すためにイベントを使用する私の以前のソリューションを試すことができますか? https://stackoverflow.com/questions/44131608/duplicate-windows-in-all-screens-with-function –

+0

あなたのイベントのソリューションは理解しにくいですが、2番目の提案が有効です。アイテムがリストに追加されています。機能が働くと小さなフリーズで暮らすことができます。今、私はそれらを私が望むように加える方法を見つけなければならないが、これは別の話である。時間をかけて私を助けてくれてありがとう! – idkWhatToDo