Zahra
Zahra

Reputation: 11

how can I select the pictures loaded in windows Form in c#?

I have some pictures in a database which I retrieve them . To load these pictures, I made a "Tab Control" in Windows Form, which has a "Tab page1". when the program runs, a group box, containing a PictureBox (and some other text boxes), will be created for each picture. my pictures can be load in these picture boxes, and I will have a list of group boxes(gbList). However, I can not select these pictures during the run. Can anybody suggest a solution?

 private void Form2_Load(object sender, EventArgs e)
    {
        tabPage1.Controls.Clear();

        int x = 0, y = 0;
        int j = 0;
        for (int i = 0; i < output.Count - 1; i++)
        {
            PictureBox pic = new PictureBox();
            pic.SizeMode = PictureBoxSizeMode.StretchImage;
            SelectablegroupBox gb = new SelectablegroupBox();
            gb.Controls.Add(pic);

            gbList.Add(gb);

//to retrieve the images from the database in ProductImages class: (output is the result of a query of database)

            ProductImages pI = output[i];

                imgbyte = pI.Pic;            
            using (MemoryStream ms = new MemoryStream(imgbyte))
            {
                Image img = Image.FromStream(ms);
                pic.Image = img;
            }

//to add the group box list o the tabpage:

            tabPage1.Controls.Add(gbList[j]);
            gbList[j].Location = new Point(x, y);
            y += gbList[i].Height;
            j++;
              }

here is my problem. I want the user to be able to select the images (Then I want to save these selected Items). But the "result" is always empty:

var result = from s in gbList
                     where s.Focused ==true
                     select s;

            foreach (var s in result)
        { //save the selected images}
   

As I learned from another post, I defined SelectablegroupBox" as:

class SelectablegroupBox : GroupBox
{
    public SelectablegroupBox()
    {
        this.SetStyle(ControlStyles.Selectable, true);
        this.TabStop = true;
    }
    
    protected override void OnEnter(EventArgs e)
    {
        this.Focus();
        this.Invalidate();
        base.OnEnter(e);
    }
    
    protected override void OnPaint(PaintEventArgs pe)
    {
        base.OnPaint(pe);
        if (this.Focused)
        {
            var rc = this.ClientRectangle;
            rc.Inflate(-2, -2);
            ControlPaint.DrawFocusRectangle(pe.Graphics, rc);
        }
    }
}

thanks in advance

Upvotes: 0

Views: 739

Answers (1)

Steeeve
Steeeve

Reputation: 915

Your class SelectableGroupBox is not suitable to let the user select one or more images. There can be at most one focused control in your app - this will be probably a button on your form which the user clicks to save the selected images.
One simple solution would be to use CheckBox controls with the Appearance property set to Button. Also, you don't have to layout the images manually, let a FlowLayoutPanel do the job.
First, add a FlowLayoutPanel named flowLayoutPanel to your tabPage2 and set the following Properties:

flowLayoutPanel.AutoScroll = true;
flowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;

Then change the appropriate code in Form2 to:

private const int imageWidth = 128;
private const int imageHeight = 128;

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    for (int i = 0; i < output.Count; i++)
    {
        CheckBox cb = new CheckBox();
        cb.Appearance = Appearance.Button;
        cb.Size = new Size(imageWidth, imageHeight);
        cb.BackgroundImageLayout = ImageLayout.Zoom;
        ProductImages pI = output[i];
        //Don't dispose the MemoryStream, the Image class will need it!
        var ms = new MemoryStream(pI.Pic);
        cb.BackgroundImage = Image.FromStream(ms);
        flowLayoutPanel.Controls.Add(cb);
    }
}

This is how you get your selected pictures:

private void SaveButton_Click(object sender, EventArgs e)
{
    var selected = flowLayoutPanel.Controls.OfType<CheckBox>().Where(x => x.Checked);
    Debug.Print("Selected images: {0}", selected.Count());
    foreach (var item in selected)
    {
        //Save the picture from item.BackgroundImage.
    }
}

Upvotes: 1

Related Questions