2009-09-30 3 views
0

J'ai une liste de visualisation et de chargement des images miniatures. Je voudrais sélectionner l'image miniature pour afficher l'image réelle dans le contrôle de l'utilisateur. Lorsque je sélectionne la première image, elle n'apparaît pas dans le contrôle utilisateur. Mais quand je sélectionne la 3ème image ça marche bien. Quel est le problème avec le code suivant?Listview SelectedIndexChanged problème

  string pname; 
      Image myImage; 
      for (i = 0; i <= files.Length ; i++) 
      { 
       pname = System.IO.Path.GetFullPath(files[i]); 
       myImage = Image.FromFile(pname); 
       ImgListView.Images.Add(getThumbnaiImage(ImgListView.ImageSize.Width, myImage)); 
       myImage = null; 
      } 


      for (i = 0; i <= files.Length ; i++) 
      { 
       fname = System.IO.Path.GetFileName(files[i]); 
       ListViewItem lvwItem = new ListViewItem(fname, i); 
       lvwItem.Tag = files[i]; 

       lstThumbNailView.Items.AddRange(new ListViewItem[] { lvwItem }); 
       lvwItem = null; 
      } 

private void listView_SelectedIndexChanged(Object sender, EventArgs e) 
{ 
    ListView.SelectedListViewItemCollection selectedItems = lstThumbNailView.SelectedItems; 

     ListViewItem lvi = lstThumbNailView.SelectedItems[0]; 
     string s = (string)lvi .Tag; 
     this.viewer1.Image = Image.FromFile(s); 

} 
+1

Est-ce ASP.NET, Winforms ou WPF? –

+0

Votre code devrait réellement lancer une exception IndexOutOfRangeException dans votre boucle, comme votre condition est (i <= files.Length) au lieu de (i

+0

Utilisation de Winforms. –

Répondre

2

pas Si les boucles sont:

 for (i = 0; i < files.Length ; i++) 

?

C'est le modèle standard pour un tableau/collection qui a une propriété Length.

+0

Je reçois une exception de référence null avec files.Length. Si j'utilise des fichiers. Longueur - 2 cela fonctionne très bien. Mais j'ai toujours le même problème. –

+0

Donc je suppose que vous attrapez l'exception quelque part, empêchant la seconde boucle d'être exécutée. Montrer plus de code, s'il vous plaît. –

0

Voici ce que j'essaie de faire.

backgroundWorker_DoWork private void (object sender, DoWorkEventArgs e) {{ essayer int progress = 0;

 string pname; 
     Image myImage; 
     max_length = files.Length - 2; 

     for (i = 0; i < files.Length; i++) 
     { 
      ProgressInfo info = new ProgressInfo(); 

      pname = System.IO.Path.GetFullPath(files[i]); 
      myImage = Image.FromFile(pname); 
      info.Image = myImage; 
      info.ImageIndex = i; 
      backgroundWorker1.ReportProgress(progress, info); 
      myImage = null; 
     } 

     } 
     catch (TargetInvocationException tiEx) 
     { 
      throw tiEx.InnerException; 
     } 
     catch (Exception ex) 
     { 
      throw ex.InnerException; 
     } 
    } 


    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     try 
     { 
      ProgressInfo img = e.UserState as ProgressInfo; 
      //Set image to ListView here. 
      ImgListView.Images.Add(getThumbnaiImage(ImgListView.ImageSize.Width, img.Image)); 
      fname = System.IO.Path.GetFileName(files[img.ImageIndex]); 
      ListViewItem lvwItem = new ListViewItem(fname, img.ImageIndex); 
      lvwItem.Tag = files[i]; 

      lstThumbNailView.Items.AddRange(new ListViewItem[] { lvwItem }); 

     } 
     catch (TargetInvocationException tiEx) 
     { 
      throw tiEx.InnerException; 
     } 
     catch (Exception ex) 
     { 
      throw ex.InnerException; 
     } 
    } 

class ProgressInfo 
{ 
    public Image m_Image; 
    public int m_ImageIndex; 
      public Image Image 
    { 
     set { m_Image = value; } 
     get { return m_Image; } 
    } 

    public int ImageIndex 
    { 
     set { m_ImageIndex = value; } 
     get { return m_ImageIndex; } 
    } 
}