Auflistung von Bildern in vorgegebenem Raster für Drag & Drop



  • Hallo,

    ich suche schon eine Weile herum und habe auch schon einiges probiert.
    Leider finde ich nicht das was ich brauche.

    Ich suche eine Möglichkeit mehrere Bilder in einem Steuerelement aufzulisten. Dabei soll in einer selbst definierbaren Matrix (z.B. 10 x 10 Elemente) Bilder angezeigt werden können. Jedes dieser Bilder muss als Drag & Drop Quelle und Ziel dienen können.

    Dafür habe ich z.B. schon mal TableLayoutPanel Probiert und es mit PictureBox Steuerelementen gefüllt. Leider bekomme ich hier das Drag & Drop nicht zum laufen.
    Ein anderes Problem ist, dass ich mit diesem Steuerelement keine Scrollbar hin bekomme, wenn sich zu viele (oder zu große) Elemente in der "Auflistung" befinden.

    Hat vielleicht jemand einen Tipp, wie ich vorgehen kann?

    Gruß Marco



  • Winforms?

    Hi,

    ich hatte mal eine ähnliche Anforderung und sie mit einer ListView umgesetzt. Inklusive Drag&Drop zwischen zwei solcher ListViews. Kommt natürlich von Haus aus mit einer Scrollbar.

    Nachteilig ist, dass man zu wenig Einfluss auf die Bildgröße und -skalierung hat. Es gibt, wenn ich mich richtig erinnere, nur wenige fest vorgegebene Bildgrößen die darstellbar sind. (Ist schon eine Weile her, sorry falls Falschinformation).
    Wenn Du also eine Matrix aus exakt 10x10 Bildern auf einer Form und ohne Scrollbar darstellen willst, wirst Du das mit der ListView nicht hinbekommen. Dann wäre Gefrickel angesagt, ein eigenes Control ... der Ansatz mit dem Tablelayoutpanel hört sich doch schonmal ganz sinnvoll an.

    Ich könnte Dir am Montag Codefetzen zur Lösung mit der ListView posten, falls das irgendwie weiterhilft. Konkrete Fragen?



  • Hallo, danke für den Tipp an dem TableLayoutPanel festzuhalten.
    Das habe ich jetzt auch mal gemacht.
    Drag & Drop funktioniert jetzt auch, leider funktioniert das Verschieben noch nicht. Ich weiß nicht so recht, wie ich aus dem Event "pb_DragDrop" das Bild auf der Quell-PictureBox bekommen kann.

    Hier mal mein eben erstelltes TestProgramm:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace DragDropBeispiel3
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          // tlp1 ist das Quell-TableLayoutPanel
          // tlp2 ist das Ziel-TableLayoutPanel
          tlp1.RowCount = 2;
          tlp1.ColumnCount = 2;
          tlp1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
          tlp1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
          tlp1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
          tlp1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
          tlp2.RowCount = 2;
          tlp2.ColumnCount = 2;
    
          for (int i = 0; i < 2; i++)
          {
            for (int j = 0; j < 2; j++)
            {
              // linke Seite
              PictureBox pbl = new PictureBox();
              pbl.SizeMode = PictureBoxSizeMode.Zoom;
              pbl.Load(@"C:\Temp\Lederhose.jpg");
              pbl.AllowDrop = true;
              pbl.MouseDown += new MouseEventHandler(pb_MouseDown);
              tlp1.Controls.Add(pbl, i, j);
    
              // rechte Seite
              PictureBox pbr = new PictureBox();
              pbr.SizeMode = PictureBoxSizeMode.Zoom;
              pbr.AllowDrop = true;
              pbr.DragEnter += new DragEventHandler(pb_DragEnter);
              pbr.DragDrop += new DragEventHandler(pb_DragDrop);
              tlp2.Controls.Add(pbr, i, j);
            }
          }
        }
    
        void pb_MouseDown(object sender, MouseEventArgs e)
        {
          PictureBox pic = (PictureBox)sender; 
          if (pic.Image != null)
            pic.DoDragDrop(pic.Image, DragDropEffects.Copy | DragDropEffects.Move); 
        }
    
        private void pb_DragEnter(object sender, DragEventArgs e)
        {
          if (e.Data.GetDataPresent(DataFormats.Bitmap))
            // wenn die Strg-Taste gedrückt ist 
            if ((e.KeyState & 8) == 8)
              e.Effect = DragDropEffects.Copy;
            // wenn nur die linke Maustaste gedrückt ist 
            else
              e.Effect = DragDropEffects.Move;
          else
            e.Effect = DragDropEffects.None;
        }
    
        private void pb_DragDrop(object sender, DragEventArgs e)
        {
          PictureBox pic = (PictureBox)sender;
          // die empfangenen Daten in den Typ Image konvertieren 
          pic.Image = (Image)e.Data.GetData(DataFormats.Bitmap);      
        }
      }
    }
    


  • Hallo,

    merke dir im MouseDown-Event in einer Membervariablen die dortige PictureBox und verwende diese dann in der DragDrop-Eventmethode.


Log in to reply