Собственно есть такой код, где в цикле создаются PictureBox
foreach (var pars in parsing)
{
var pn = new Panel();
pn.Size = new Size(166, 260);
flow.Controls.Add(pn);
var lb = new Label();
lb.Text = parsing[i].NameFilm;
lb.Dock = DockStyle.Bottom;
lb.Font = new Font("Comic Sans MS", 9.0f);
lb.ForeColor = ColorTranslator.FromHtml("#FFFFFF");
pn.Controls.Add(lb);
var hd = new Label();
hd.Text = parsing[i].Quality;
hd.Location = new Point (0,0);
hd.Font = new Font("Comic Sans MS", 9.0f);
hd.ForeColor = ColorTranslator.FromHtml("#FFFFFF");
//#c70016
hd.BackColor = ColorTranslator.FromHtml("#c70016");
hd.Padding = new Padding(5,2,5,2);
hd.AutoSize = true;
pn.Controls.Add(hd);
var pb = new PictureBox();
pb.SizeMode = PictureBoxSizeMode.StretchImage;
pb.Dock = DockStyle.Top;
pb.Name = "pb" + i.ToString();
pb.Size = new Size(166, 246);
pb.LoadAsync(parsing[i].ImageURl);
pb.MouseClick += new MouseEventHandler((o, a) => Start(parsing[i].UrlFilm));
pn.Controls.Add(pb);
i++;
}
Все хорошо работает, кроме
pb.MouseClick += new MouseEventHandler((o, a) => Start(parsing[i].UrlFilm));
При компиляции выдает ошибку о том, что "Индекс за пределами диапазона".
Если же вместо i написать [i-1]
pb.MouseClick += new MouseEventHandler((o, a) => Start(parsing[i-1].UrlFilm));
Тогда при нажатии на любой pictureBox будет открываться последний, в данном случае фильм.
Как же сделать так, чтоб каждому pictureBox присваивался свой MouseEventHandler?
Прежде всего надо создать класс, наследуемый от Panel, не гоже использовать язык ООП и не применять ООП:
class FilmPanel:Panel
{
public FilmPanel(ClassPars Pars, int PN)
{
Size = new Size(166, 260);
Controls.Add(new Label{
Text = Pars.NameFilm,
Dock = DockStyle.Bottom,
Font = new Font("Comic Sans MS", 9.0f),
ForeColor = ColorTranslator.FromHtml("#FFFFFF"),
});
Controls.Add(new Label{
Text = Pars.Quality,
Location = new Point (0,0),
ForeColor = ColorTranslator.FromHtml("#FFFFFF"),
BackColor = ColorTranslator.FromHtml("#c70016"),
Padding = new Padding(5,2,5,2),
AutoSize = true
});
Controls.Add(FPB(Pars, PN));
}
PictureBox FPB((ClassPars Pars, int pn);
{
var res = new PictureBox{
SizeMode = PictureBoxSizeMode.StretchImage,
Dock = DockStyle.Top,
Name = "pb" + pn,
Size = new Size(166, 246)
};
res.LoadAsync(Pars.ImageURl);
res.MouseClick += new MouseEventHandler((o, a) => Start(Pars.UrlFilm));
return res;
}
}
а далее в коде пишется следующее:
int i=0;
foreach (var pars in parsing)
{
flow.Controls.Add(new FilmPanel(pars,i));
i++;
}
Теперь код удобно читать, и легко править!
Продвижение своими сайтами как стратегия роста и независимости