«Параметр недействителен» при добавлении PictureBox в TabControl - PullRequest
0 голосов
/ 06 февраля 2019

Итак, я получаю эту ошибку в моей программе.Приведенный ниже код показывает, где я динамически добавляю TabControl и PictureBoxes в форму при загрузке.Изображения для PictureBoxes являются либо новым набором снимков экрана, которые делает моя программа, либо, если у пользователя есть незаконченный билет, он загрузит предыдущие снимки экрана в activeticket.Screenshots и использует их вместо этого.Если программа делает новые снимки экрана, приведенный ниже код работает отлично.Однако, если программа пытается загрузить предыдущие снимки экрана, которые сохранены в формате .png и загружены в формате .bmp, я получаю исключение "Parameter not valid" и не могу продолжить.

        //IF COUNT OF SCREENSHOTS IN ACTIVE TICKET IS ZERO
        //TAKE NEW SCREENSHOTS AND ASSIGN TO TABS 
        //ELSE ASSIGN EXISTING SCREENSHOTS TO TABS

        List<Bitmap> screenshots;

        if (activeticket.Screenshots.Count == 0)
        {
            screenshots = clsTools.TakeScreenshotList();
            foreach (Bitmap bmp in screenshots)
            {
                activeticket.Screenshots.Add(bmp);
            }
        }

        //REMOVE DEFAULT TAB
        tabControl1.TabPages.Remove(Tab1);

        foreach (Bitmap bmp in activeticket.Screenshots)
        {
            TabPage tp = new TabPage();
            PictureBox pb = new PictureBox()
            {
                Dock = DockStyle.Fill,
                SizeMode = PictureBoxSizeMode.StretchImage,
                Image = bmp
            };

            tp.Controls.Add(pb); //PARAMETER NOT VALID ON THIS LINE
            tabControl1.Controls.Add(tp);
            tp.Text = "Screen";
            CheckBox cb = new CheckBox()
            {
                Text = "Include in ticket",
                Anchor = AnchorStyles.Bottom | AnchorStyles.Right,
                AutoSize = true,
                Location = new Point(558, 345),
                Checked = true
            };
            tp.Controls.Add(cb);
            cb.BringToFront();
        }

Вот мой код для загрузки изображений.Обратите внимание, что ImageFilenames - это список строк, содержащий пути к изображениям.

       internal void LoadScreenCaptures()
       {
          foreach (string file in ImageFilenames)
          {
             var Screencaps = new Bitmap(file);
             Screenshots.Add(Screencaps);
             Screencaps.Dispose(); //DISPOSE IS HERE SO I CAN DELETE FILES BELOW
       }

        foreach (string file in ImageFilenames)
        {
            File.Delete(file);   
        }
    }

Я пытался использовать ImageConverter, я пробовал около 15 различных способов, включая pb.Image = Image.FromFile(file), и мне не повезло!Вот след стека:

  at System.Drawing.Image.get_FrameDimensionsList()
   at System.Drawing.ImageAnimator.CanAnimate(Image image)
   at System.Drawing.ImageAnimator.ImageInfo..ctor(Image image)
   at System.Drawing.ImageAnimator.Animate(Image image, EventHandler onFrameChangedHandler)
   at System.Windows.Forms.PictureBox.Animate(Boolean animate)
   at System.Windows.Forms.PictureBox.Animate()
   at System.Windows.Forms.PictureBox.OnParentChanged(EventArgs e)
   at System.Windows.Forms.Control.AssignParent(Control value)
   at System.Windows.Forms.Control.ControlCollection.Add(Control value)
   at System.Windows.Forms.TabPage.TabPageControlCollection.Add(Control value)
   at SETL.StartPage.StartPage_Load(Object sender, EventArgs e) in C:\Users\aaminahabdallah\Documents\Code\Ticketing\UI\Main UI\StartPage.cs:line 179
   at System.Windows.Forms.Form.OnLoad(EventArgs e)
   at System.Windows.Forms.Form.OnCreateControl()
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.WmShowWindow(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WmShowWindow(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Любая помощь будет оценена!

1 Ответ

0 голосов
/ 06 февраля 2019

В соответствии с @ Jimi ответом я добавил строку Screenshots.Add ((Bitmap) Screencaps.Clone ());вместо Screenshots.Add (Screencaps);

Затем я немного отредактировал другие части своего кода, чтобы все обошлось, и это сработало!Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...