Lorsque je clique sur le bouton Supprimer la sélection, la mauvaise image est en cours de suppression. La plupart du temps, il a supprimé l'image sur la droite d'une image sélectionnée. D'autres fois, par exemple lorsque tout est sélectionné, il ne supprime qu'une seule image.Les images incorrectes sont supprimées
Je ne sais pas ce qui se passe. Voici une photo pour illustrer ce qui se passe:
Voici le code pour les contrôles utilisateur que je utilise: HorizontalPictureScroller et SelectablePicture.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections.ObjectModel;
using System.Runtime.Serialization;
using System.ComponentModel.Design.Serialization;
namespace WinformsPlayground
{
public partial class HorizontalPictureScroller : UserControl
{
public HorizontalPictureScroller()
{
InitializeComponent();
Pictures = new ObservableCollection<SelectablePicture>();
Pictures.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Pictures_CollectionChanged);
}
#region "Properties"
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public ObservableCollection<SelectablePicture> Pictures { get; set; }
private int PositionControlX = 0;
#endregion
#region "Methods"
private void RedrawPictures()
{
PositionControlX = 0;
foreach (var picture in Pictures)
{
picture.Location = new Point(PositionControlX + panelPicturesWrapper.AutoScrollPosition.X, 0);
PositionControlX += 130;
panelPicturesWrapper.Controls.Add(picture);
}
}
public void AddPicture(SelectablePicture picture)
{
Pictures.Add(picture);
}
public void RemovePicture(SelectablePicture picture)
{
Pictures.Remove(picture);
}
public void MovePictureLeft(int index)
{
SelectablePicture tmpPicture = Pictures[index];
Pictures[index] = Pictures[index - 1];
Pictures[index - 1] = tmpPicture;
}
public void MovePictureRight(int index)
{
SelectablePicture tmpPicture = Pictures[index];
Pictures[index] = Pictures[index + 1];
Pictures[index + 1] = tmpPicture;
}
public void SelectAllImages()
{
foreach (var picture in panelPicturesWrapper.Controls)
{
((SelectablePicture)picture).SelectPicture();
}
}
public void DeselectAllImages()
{
foreach (var picture in panelPicturesWrapper.Controls)
{
((SelectablePicture)picture).DeselectPicture();
}
}
public void DeleteSelectedImages()
{
foreach (var picture in panelPicturesWrapper.Controls)
{
if (((SelectablePicture)picture).IsSelected())
{
this.RemovePicture((SelectablePicture)picture);
}
}
}
#endregion
#region "Events"
void Pictures_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
RedrawPictures();
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Serialization;
namespace WinformsPlayground
{
public partial class SelectablePicture : UserControl
{
public SelectablePicture()
{
InitializeComponent();
panel1.BackgroundImageLayout = ImageLayout.Zoom;
}
public SelectablePicture(Image image)
{
InitializeComponent();
panel1.BackgroundImage = image;
panel1.BackgroundImageLayout = ImageLayout.Zoom;
}
#region "Properties"
public Image Image()
{
return panel1.BackgroundImage;
}
public bool IsSelected()
{
return chkSelected.Checked;
}
#endregion
#region "Methods"
public void ToggleCheckBox()
{
chkSelected.Checked = chkSelected.Checked ? false : true;
}
public void VisuallySelect()
{
this.BackColor = Color.FromArgb(51, 153, 255);
}
public void VisuallyDeselect()
{
//If none of the controls inside the usercontrol have focus, set this control to white.
if (!this.Focused && !this.panel1.Focused && !this.chkSelected.Focused)
{
this.BackColor = Color.White;
}
}
public void SelectPicture()
{
this.chkSelected.Checked = true;
}
public void DeselectPicture()
{
this.chkSelected.Checked = false;
}
#endregion
#region "Events"
private void panel1_Click(object sender, EventArgs e)
{
VisuallySelect();
ToggleCheckBox();
panel1.Focus();
}
private void chkSelected_Click(object sender, EventArgs e)
{
VisuallySelect();
ToggleCheckBox();
chkSelected.Focus();
}
private void SelectablePicture_Click(object sender, EventArgs e)
{
VisuallySelect();
ToggleCheckBox();
this.Focus();
}
private void panel1_Leave(object sender, EventArgs e)
{
VisuallyDeselect();
}
private void chkSelected_Leave(object sender, EventArgs e)
{
VisuallyDeselect();
}
private void SelectablePicture_Leave(object sender, EventArgs e)
{
VisuallyDeselect();
}
#endregion
}
}
Le code est assez simple. J'ai utilisé des points d'arrêt et je peux confirmer que la méthode HorizontalPictureScroller.DeleteSelectedImages() parcourt correctement les images sélectionnées. Je ne suis pas sûr de ce que je pourrais faire d'autre pour voir ce qui se passe. Je suis perplexe!
Des idées? Peut-être que la méthode .Remove() fournie avec le type ObservableCollection ne fonctionne pas comme je le pensais.
Vous itérez la même collection que vous supprimez des éléments de? Je ne suis pas sûr de ce que C# fait dans ces cas, mais ça sonne douteux ... –
D'OH! Comment puis je faire ça. :(Permettez-moi de bricoler un peu.Vous n'êtes JAMAIS supposé modifier une collection que vous itérez. * Honte * –
Pouvez-vous poster le code pour Pictures.Remove (image)? – w69rdy