2016-05-10 5 views
0

Ich speichere alle Werte von listView im Dictionary-Wert im Dictionary und speichere den Index in Dictionary-Keys beim Laden des Formulars. Ich benutze Wörterbuch als ein Medium des Indexspeichers für entsprechende übertragene listitems.So übertragen Sie Daten von a nach b Listenansicht

Jetzt übertrage ich von a nach b auf einen Knopfklick (ein Listenbild ist voll und b ist leer), dann übertrage ich das gleiche Element erneut von b auf ein anderes, auf einen anderen Knopf klicken. Es ist jetzt endlich beigefügt, wenn ich zurück zu b-> eine Übertragung mache. Aber ich möchte, dass es an den gleichen Index angehängt wird, auf dem es vor der Übertragung nach a-> b war.

ich meine, wenn ich b- tun> ein Transfer dann muss es auf denselben Index gehen, wo es vor

Mein Code verwendet zu bleiben ist dies (bitte korrigieren Sie mich, wenn ich falsch bin und geben Sie mir bitte eine Lösung)

 private void Form1_Load(object sender, EventArgs e) 
     { 
     //storing data in dictionary    
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      MoveSelectedItems(listView1, listView2,0); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      MoveSelectedItems(listView2, listView1,1); 
     } 
     private void MoveSelectedItems(ListView source, ListView target, int flag) 
     { 
       ListViewItem temp = source.SelectedItems[0]; 
       source.Items.Remove(temp); 
       if(flag==0)//called when i do a->b 
       { 
        target.Items.Add(temp); 
       } 
       else 
       { 
        int index=getIndex(temp); 
        target.Items.Insert(index, temp); 
       } 
     } 

     private int getIndex(ListViewItem temp) 
     { 
      int index = 0; 
      if (dictList.ContainsValue(temp.Text)) 
      { 
       foreach (KeyValuePair<int, string> pair in dictList) 
        if (temp.Text.Equals(pair.Value)) 
        { 
         index=Convert.ToInt32(pair.Key); 
         return index; 
        }    
      }  
      return index; 
     }  
+0

Sie können Mit einem 'Dictionary' erreichst du nicht, was du willst. Siehe diese andere Frage für weitere Informationen: http://stackoverflow.com/questions/7918328/adding-a-dictionary-element-at-a-spezifischen- –

+0

@GuillaumeBeauvois Keine andere Alternative? –

+0

@GuillaumeBeauvois bitte lesen Sie sorgfältig, was ich versuche zu erreichen .. Ich möchte in listview (nicht im Wörterbuch ') –

Antwort

1

Was Sie wirklich brauchen, ist, nach dem gewünschten Index aus dem Wörterbuch nehmen, die Elemente zur Zeit in der Listenansicht zu suchen und die tatsächliche Einsatzposition finden.

Es gibt verschiedene Art und Weise Sie das tun können, hier ist eine binäre Suche:

else 
{ 
    foreach (ListViewItem item in source.SelectedItems) 
    { 
     ListViewItem lvItem = item.Clone() as ListViewItem; 
     int index = dictList[item.Text]; 
     // Insert at appropriate position based on index value 
     if (index == 0) // Always first 
      target.Items.Insert(0, lvItem); 
     else if (index == dictList.Count - 1) // Always last 
      target.Items.Add(lvItem); 
     else 
     { 
      // Binary search the current target items 
      int lo = 0, hi = target.Items.Count - 1; 
      while (lo <= hi) 
      { 
       int mid = lo + (hi - lo)/2; 
       if (index < dictList[target.Items[mid].Text]) 
        hi = mid - 1; 
       else 
        lo = mid + 1; 
      } 
      // Here lo variable contains the insert position 
      target.Items.Insert(lo, lvItem); 
     } 
     source.Items.Remove(item); 
    } 
} 

EDIT: Hier ist ein [MCVE] beweisen, dass es funktioniert:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 

namespace Samples 
{ 
    static class Program 
    { 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 

      var form = new Form(); 
      var splitView = new SplitContainer { Dock = DockStyle.Fill, Parent = form, Orientation = Orientation.Vertical }; 
      var listView1 = new ListView { Dock = DockStyle.Fill, Parent = splitView.Panel1, View = View.List }; 
      var listView2 = new ListView { Dock = DockStyle.Fill, Parent = splitView.Panel2, View = View.List }; 
      var buttonPanel = new Panel { Dock = DockStyle.Bottom, Parent = form }; 
      var button1 = new Button { Parent = buttonPanel, Left = 16, Top = 8, Text = ">" }; 
      var button2 = new Button { Parent = buttonPanel, Left = button1.Right + 16, Top = 8, Text = "<" }; 
      buttonPanel.Height = button1.Height + 16; 

      var dictList = new Dictionary<string, int> 
      { 
       { "first", 0 }, 
       { "second", 1 }, 
       { "third", 2 }, 
       { "fourth", 3 }, 
       { "fifth", 4 }, 
       { "sixth", 5 }, 
       { "seventh", 6 }, 
      }; 
      foreach (var item in dictList) 
       listView1.Items.Insert(item.Value, item.Key); 

      Action<ListView, ListView, int> MoveSelectedItems = (ListView source, ListView target, int flag) => 
      { 
       while (source.SelectedItems.Count > 0) 
       { 
        var item = source.SelectedItems[0]; 
        source.Items.Remove(item); 
        if (flag == 0) 
        { 
         target.Items.Add(item); 
        } 
        else 
        { 
         int index = dictList[item.Text]; 
         // Insert at appropriate position based on index value 
         if (index == 0) // Always first 
          target.Items.Insert(0, item); 
         else if (index == dictList.Count - 1) // Always last 
          target.Items.Add(item); 
         else 
         { 
          // Binary search the current target items 
          int lo = 0, hi = target.Items.Count - 1; 
          while (lo <= hi) 
          { 
           int mid = lo + (hi - lo)/2; 
           if (index < dictList[target.Items[mid].Text]) 
            hi = mid - 1; 
           else 
            lo = mid + 1; 
          } 
          // Here lo variable contains the insert position 
          target.Items.Insert(lo, item); 
         } 
        } 
       } 
      }; 

      button1.Click += (sender, e) => MoveSelectedItems(listView1, listView2, 0); 
      button2.Click += (sender, e) => MoveSelectedItems(listView2, listView1, 1); 

      Application.Run(form); 
     } 
    } 
} 
+0

Sorry, es fügt nichts in listview "a" (wenn ich a-> b tranfer es funktioniert, aber wenn ich zurück zu einem ..then es nicht anyting in a) –

+0

@please siehe meinen gesamten aktualisierten Code, es fügt noch hinzu. –

+0

Ja, ich habe vergessen, 'lvItem' anstelle von' temp' zu verwenden. Ich sehe, du hast es getan. Ist es jetzt ok? –

1

Sie können der Listenansicht einen ListViewItemComparer hinzufügen. So was.

public class ListViewItemComparer : IComparer 
{ 
    public int Compare(object x, object y) 
    { 
     return (((ListViewItem)x).Index > ((ListViewItem)y).Index ? 1 : -1); 
    } 
} 

Und dann in MoveSelectedItems:

this.listView1.ListViewItemSorter = new ListViewItemComparer(); 

Viel Glück.

+0

Bitte erklären Sie auch, wie es funktioniert hat? –

+0

Nun, da Sie den Index selbst im Auge behalten, können Sie diesen im Vergleich verwenden, um die Platzierung im Sortierer zu bestimmen. Der Vergleich prüft den Index für jeden Artikel in der Listenansicht und vergleicht ihn mit jedem anderen Artikel. Wenn es größer ist, gibt der Vergleich 1 (Sortierung vorher) zurück und der Vergleich gibt -1 zurück (Sortierung nach). –

+0

Wirklich gearbeitet? Von dem, was ich sehe, tut es nichts (hält die Gegenstände auf dem Index, wo Sie sie einfügen). –

Verwandte Themen