2016-10-25 31 views
1

私は、敵の情報(場所、健康など)をすべて読み込んでそれに応じてリストビューに保存するゲームをハックしています。私は現在、この方法を使用しています:リストビュー内のテキストを更新せずに更新する方法

 listView1.Items.Clear(); 
     string[] arr = new string[6]; 
     ListViewItem item; 

     for (int i = 0; i < engine.maxPlayers; i++) 
     { 
      engine.enemy[i].readInfo(i); 
     arr[0] = i.ToString() 
     arr[1] = engine.enemy[i].name.ToString(); 
     arr[2] = engine.enemy[i].getRank(csgo.enemy[i].compRank); 
     arr[3] = engine.enemy[i].Wins.ToString(); 
     arr[4] = engine.enemy[i].health.ToString(); 
     arr[5] = engine.enemy[i].armor.ToString(); 

     item = new ListViewItem(arr); 
     listView2.Items.Add(item); 
     } 

これは、リアルタイム情報を保証するために200 msごとに行われています。 これはある程度機能します。それはすべてを正しく示しています。しかし、2つの大きな欠陥があります。 1:データを消去して書き換えたときに常に点滅します。 2:リストビューの長さが10列しかなく、20人のプレーヤーのデータを読み取る必要がある場合、スクロールバーが消えるたびに最後の10人のプレーヤーを表示することができません。

特定のテキストのテキストのみを更新することは可能ですか?私は敵の健康を更新し、残りのものを残したいとします。これはできますか?ゲーム中に変更されないため、勝利やランクなどの情報を再描画する必要はありません。

+0

'listView2.Items [row] .SubItems [列]。テキスト ' – Slai

+0

ちらつきを防止する方法はありますか? – LegitGodmode

+0

ゲーム中にDoubleBuffered http://stackoverflow.com/questions/442817/c-sharp-flickering-listview-on-update – Slai

答えて

0

はい、インデクサーを使用して、更新するアイテムを直接参照することができます。例えば:あなたのゲームエンジンには、この相対的を達成するためとして

listView2.Items[playerIndex] = new ListViewItem(arr); 

、次の特定のゲームエンジンリスト(マスター)、およびリストビュー(ターゲット)を必要とする和解デザインパターンを、使用することをお勧めします:

  1. ターゲットに一時的なアイテムまたはキーを作成します。このToDeleteと呼んでください。
  2. ステップスルーマスターで、ターゲットにないエントリを追加し、ターゲットにないエントリを追加します。ターゲットとの一致ごとにToDeleteから削除します。
  3. ToDeleteに残っているすべてのアイテムを対象から削除します。

更新:Slaiが指摘するように、行全体を置換したくない場合は、SubItemsメンバーから更新できます。

0

リストビューに最初の呼び出しからのデータを入力してから、500ms-1000ms毎に(200msは何も提供しないと思う)、新しいデータでリストビューを更新する必要があると思います。私はengine.enemy[i].nameは、各palyerに対して一意であることを前提と

 private void InitialPopulation() 
     { 
      var listOfItems = new List<ListViewItem>(); 

      for (int i = 0; i < engine.maxPlayers; i++) 
      { 
       engine.enemy[i].readInfo(i); 

       var item = new ListViewItem(i.ToString()); 
       item.Name = engine.enemy[i].name; 
       item.SubItems.Add(engine.enemy[i].name); 
       item.SubItems.Add(engine.enemy[i].getRank); 
       item.SubItems.Add(engine.enemy[i].Wins); 
       item.SubItems.Add(engine.enemy[i].health); 
       item.SubItems.Add(engine.enemy[i].armor); 

       listOfItems.Add(item); 
      } 

      listView1.BeginUpdate(); 
      listView1.Items.Clear(); 
      listView1.Items.AddRange(listOfItems.ToArray()); 
      listView1.EndUpdate(); 
     } 

     private void RefreshData() 
     { 
      listView1.BeginUpdate(); 
      var listOfItems = new List<ListViewItem>(); 
      var playersNames = new List<string>(); 
      var itemsNames = new List<string>(); 


      for (int i = 0; i < engine.maxPlayers; i++) 
      { 
       engine.enemy[i].readInfo(i); 

       playersNames.Add(engine.enemy[i].name); 

       var items = listView1.Items.Find(engine.enemy[i].name, false); 

       switch (items.Length) 
       { 
        case 1: // update 
         items[0].SubItems[0].Text = engine.enemy[i].name; 
         items[0].SubItems[1].Text = engine.enemy[i].getRank; 
         items[0].SubItems[2].Text = engine.enemy[i].Wins; 
         items[0].SubItems[3].Text = engine.enemy[i].health; 
         items[0].SubItems[4].Text = engine.enemy[i].armor; 
         break; 

        case 0: // add 
         var item = new ListViewItem(i.ToString()); 
         item.Name = engine.enemy[i].name; 
         item.SubItems.Add(engine.enemy[i].name); 
         item.SubItems.Add(engine.enemy[i].getRank); 
         item.SubItems.Add(engine.enemy[i].Wins); 
         item.SubItems.Add(engine.enemy[i].health); 
         item.SubItems.Add(engine.enemy[i].armor); 
         listOfItems.Add(item); 
         break; 
       } 
      } 


      if (listOfItems.Count > 0) 
       listView1.Items.AddRange(listOfItems.ToArray()); 

      foreach (ListViewItem item in listView1.Items) 
       itemsNames.Add(item.Name); 


      // check if there are more listview items than data. 
      if (itemsNames.Count > playersNames.Count) 
       foreach (var name in itemsNames.Except(playersNames)) 
        listView1.Items.RemoveByKey(name); 

      listView1.EndUpdate(); 
     } 

:よう
何か。

多分私は長い間winformsのための何も書いていないので、コードにいくつかのエラーがありますが、私はあなたが意味を得るべきだと思います。

関連する問題