Как добавить MouseEventHandler к PictureBox?

197
24 декабря 2019, 09:00

Собственно есть такой код, где в цикле создаются 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?

Answer 1

Прежде всего надо создать класс, наследуемый от 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++;
}

Теперь код удобно читать, и легко править!

READ ALSO
Обобщения оператор where

Обобщения оператор where

Подскажите как загуглить что бы почитать о операторе/ключевом слове where в такой конструкции например:

200
Как подсчитать сумму ячеек в строке dataGridView C#

Как подсчитать сумму ячеек в строке dataGridView C#

Нужно подсчитать сумму ячеек для каждой строки таблицы dataGridViewКол-во строк и столбцов заранее не известно

189
Вызов метода из другого скрипта C#

Вызов метода из другого скрипта C#

Есть 2 класса( 2 разных скрипта)Первый:

190
Ошибка обращения к workbook.FileFormat

Ошибка обращения к workbook.FileFormat

Почему возникает данное исключение, что значит этот код "-2146826246" ?

213