2013-09-08 17 views
5

Sono nuovo alla programmazione e C# e sembrava aver lavorato me stesso in un po 'di confusione con quanto sopra. Quello che sto cercando di fare è creare un front-end per il PC multimediale del salotto niente a cui pensare per cominciare, perché ho capito che questo è un compito mamoth per un noobie totale come me. Ive è sbalordito e sto completamente bene con il lancio di file esterni, memorizzando/caricando le risorse ecc. Ed è stato molto contento dei miei risultati per il mio surf di 2 settimane.Riempire Listview & Imagelist elemento selezionato confusione C#

Quindi sto iniziando il mio progetto lanciando un emulatore per iniziare e quello che vorrei fare è scansionare una cartella per file zip e file immagine e se trova immagini corrispondenti e file zip mostra un'immagine in un visualizzazione elenco per ogni zip trovata.

Così popolo le mie listbox in questo modo e ottengo i miei 2 listbox che mostrano le cose che voglio vedere.

PopulateListBox(listBox1, "\\SomePath\\", "*.zip"); 
PopulateListBox(listBox2, "\\Images\\", "*.jpg"); 

private void PopulateListBox(ListBox lsb, string Folder, string FileType) 
    { 
     DirectoryInfo dinfo = new DirectoryInfo(Folder); 
     FileInfo[] Files = dinfo.GetFiles(FileType); 
     foreach (FileInfo file in Files) 
     { 
      lsb.Items.Add(file.Name); 
     } 
    } 

Così ora ho i miei 2 listboxes e potete vedere ho game1.zip e game1.jpg, grande ora posso riempire la mia ListView con l'immagine game1 e lanciare l'emulatore ha detto di semplice.

Questo è il modo in cui attualmente sto compilando il listview.

PopulateListView(); 
private void PopulateListView() 
{ 
    if (listBox1.Items.Contains("game1.zip")) 
{ 
    if (File.Exists("\\Images\\game1.jpg")) 
    { 
    imageList1.Images.Add(Image.FromFile("\\Images\\game1.jpg")); 
    listView1.Items.Add("", 0); 
    } 
} 

if (listBox1.Items.Contains("game2.zip")) 
{ 
    if (File.Exists("\\Images\\game2.jpg")) 
    { 
    imageList1.Images.Add(Image.FromFile("\\Images\\game2.jpg")); 
    listView1.Items.Add("", 1); 
    } 
} 
} 

Questo è il modo in cui sto avviando attualmente e funziona bene.

// launch item 
private void listView1_MouseDoubleClick(object sender, MouseEventArgs e) 
{ 
    if (listView1.Items[0].Selected == true) 
    { 
     string rom = "\\" + listBox1.Items[0].ToString(); 
     // Launch code in here 
    } 

    if (listView1.Items[1].Selected == true) 
    { 
     string rom = "\\" + listBox1.Items[1].ToString(); 
     // Launch code in here 
    } 
    } 

Quindi quale potrebbe essere il problema? Invece di continuare a digitare tutte le informazioni per ogni articolo, voglio usare un qualche tipo di statuto se possibile e non so cosa cercare per quale non aiuta. Il nome dell'immagine corrisponderà sempre al nome zip, basta perdere le estensioni dei file in modo da popolare la lista come qualcosa del genere.

if (listbox1 item = listbox2 item) 
{ 
    add to imagelist and listview automaticly with same index 
} 

Quindi voglio essere in grado di lanciare usando solo qualcosa come questo.

private void listView1_MouseDoubleClick(object sender, MouseEventArgs e) 
{ 
     string rom = "\\" + listview.selected.item.tostring; 
     // Launch code in here 
} 

im Speranza rendendo senso im alla mia fine Witts.

saluti

Derek

risposta

3

Se ho capito bene, si vuole leggi, confronta e mostra a livello di codice tutte le immagini e le cerniere uguali e quando l'utente fa clic su una riga di visualizzazione elenco per avviare la rom. Questo può essere fatto come segue:

  • leggi tutte le immagini - non c'è bisogno di controllare se il file esiste, perché se non lo fa, allora GetFiles non lo troverà!
  • leggi tutte le rom, come sopra!
  • prendere tutti i nomi che hanno sia il file zip di immagine e (che sono la stessa cosa) elenco delle immagini
  • riempimento e visualizzazione elenco, allo stesso tempo
  • legano visualizzazione elenco voce con l'immagine corretta
  • negozio rom posizione
  • maniglia clic del mouse sulla riga e recuperare posizione rom
  • fare qualcosa con il file ROM

Il codice:

public ListForm() 
    { 
     InitializeComponent(); 

     // path to images and roms 
     const string location = @"d:\temp\roms\"; 
     // bind image list with list view 
     listViewControl.SmallImageList = imageList; 
     // get all images without extension 
     var images = System.IO.Directory.GetFiles(location, "*.gif").Select(f => System.IO.Path.GetFileNameWithoutExtension(f)).ToList(); 
     // get all roms without extension 
     var zips = System.IO.Directory.GetFiles(location, "*.zip").Select(f => System.IO.Path.GetFileNameWithoutExtension(f)).ToList(); 
     // find all entries (images and zips) that have the same name 
     var matching = images.Intersect(zips); 
     var imageIndex = 0; 
     // fill image list and list view at the same time and store rom location 
     foreach (var match in matching) 
     { 
      // path to file without extension 
      var file = System.IO.Path.Combine(location, match); 
      // add image to image list 
      imageList.Images.Add(match, Bitmap.FromFile(string.Format("{0}.gif", file))); 
      // create list view item 
      var lvi = new ListViewItem(match); 
      // and set list view item image 
      lvi.ImageIndex = imageIndex; 
      // store rom location 
      lvi.Tag = string.Format("{0}.zip", file); 
      imageIndex++; 
      // and show 
      listViewControl.Items.Add(lvi); 
     } 
    } 

    private void listViewControl_MouseClick(object sender, MouseEventArgs e) 
    { 
     // when user clicks an item, fetch the rom location and go 
     var item = listViewControl.GetItemAt(e.X, e.Y); 
     if (item != null) 
     { 
      var pathToRom = item.Tag as string; 
      // do something with rom ... 
     } 
    } 

Non è necessario gestire separatamente l'elenco di immagini e la vista elenco. L'output è simile:

enter image description here

+0

Grazie così tanto che è perfetto il commento è eccellente questo mi aiuterà così tanto non posso ringraziarvi abbastanza (che Goe a tutti coloro che hanno risposto) –

0

Se ho la comprensione il vostro problema in modo corretto, è possibile passare dalla vostra torre di if dichiarazioni con questo:

var item = listView1.SelectedItem 
string rom = "\\" + item.ToString() 
// Launch code in here 

E per popolarla, si può cambiare questo:

if (listBox1.Items.Contains("game2.zip")) 
{ 
    if (File.Exists("\\Images\\game2.jpg")) 
    { 
     imageList1.Images.Add(Image.FromFile("\\Images\\game2.jpg")); 
     listView1.Items.Add("", 1); 
    } 
} 

A questo:

List<string> files = new List<string> { "game1.zip", "game2.zip" }; 

var index = 0; 
foreach (var file in files) 
{ 
    if (File.Exists("\\Images\\" + file)) 
    { 
     imageList1.Images.Add(Image.FromFile("\\Images\\" + file.Replace(".zip", ".jpg"))); 
     listView1.Items.Add("", index); 
     index++; 
    } 
} 
+0

nuovo thx sarà check this out –

0

è possibile popolare le immagini utilizzando i nomi dalla listView:

private void PopulateListView() 
    { 
    foreach (string curr in listBox1.Items) 
    { 
     string changed = "\\Images\\" + curr.Replace(".zip", ".jpg"); 

     if (File.Exists(changed)) 
     { 
      imageList1.Images.Add(Image.FromFile(changed)); 
      listView1.Items.Add("", 1); 
     } 
    } 
    } 

e utilizzare l'elemento selezionato in caso MouseDoubleClick

// launch item 
    private void listView1_MouseDoubleClick(object sender, MouseEventArgs e) 
    { 
    string selected = (string) listBox1.SelectedItem; 
    string rom = "\\" + selected; 
    // Launch code in here 
    } 
+0

grazie saranno controllarlo fuori –

Problemi correlati