как я могу выбрать изображения, загруженные в форму Windows на c#?

#c# #winforms

Вопрос:

У меня есть несколько фотографий в базе данных, которые я извлекаю . Чтобы загрузить эти изображения, я создал «Элемент управления вкладками» в форме Windows, в которой есть «Страница вкладок1«. при запуске программы для каждого изображения будет создано групповое поле, содержащее поле с картинками (и некоторые другие текстовые поля). мои фотографии можно загрузить в эти графические поля, и у меня будет список групповых полей(gbList). Однако я не могу выбрать эти фотографии во время запуска. Кто-нибудь может предложить решение?

  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);
 

//для извлечения изображений из базы данных в классе ProductImages: (вывод является результатом запроса базы данных)

             ProductImages pI = output[i];

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

//чтобы добавить список групповых полей на странице вкладок:

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

вот моя проблема. Я хочу, чтобы пользователь мог выбирать изображения (затем я хочу сохранить эти выбранные элементы). Но «результат» всегда пуст:

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

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

Как я узнал из другого поста, я определил SelectablegroupBox» как:

 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);
        }
    }
}
 

заранее спасибо

Комментарии:

1. На что вы нацелены: Winforms, WPF, ASP..? ВЫ всегда должны правильно помечать свои вопросы, чтобы их можно было увидеть на странице вопросов! — Вы уверены, что им показывают групповые ящики? Групповые ящики являются контейнерами и обычно не принимают фокус и не отображают изображения..

2. Я использую форму Windows. и я ищу способ, чтобы иметь возможность выбирать изображения.

3. Вы написали это, но где загружены изображения? В коробках с картинками? Панели?? Этикетки??? Другие элементы управления? — Также: «Этот код не работает» — это всегда плохое/бесполезное описание! Что происходит? Ошибка компиляции? Неправильный результат? Никакого результата? — Также: Только один элемент управления (если таковой имеется) может когда-либо иметь фокус! Существует большая разница между Фокусом и Выбранным !!

4. Вашего показанного кода просто недостаточно, чтобы увидеть вашу проблему. Попробуйте добавить больше кода, из которого вы хотите выбрать изображения и где вы хотите их отобразить?

5. Я не вижу никакого кода, который бы «выбирал» либо групповое поле, либо поле с картинками. Норте, который Focus() только устанавливает фокус клавиатуры на элемент управления, тем самым крадет его у любого элемента управления, у которого он мог быть раньше. — Почему бы тебе не дать своему классу Selected собственность? — Также позвольте пользователю выбирать практичным способом, например, нажав вместо простого ввода!!

Ответ №1:

Ваш класс SelectableGroupBox не подходит для того, чтобы позволить пользователю выбрать одно или несколько изображений. В вашем приложении может быть не более одного сфокусированного элемента управления — это, вероятно, кнопка в вашей форме, которую пользователь нажимает, чтобы сохранить выбранные изображения.
Одним из простых решений было бы использование CheckBox элементов управления со значением свойства Appearance Button . Кроме того, вам не нужно компоновать изображения вручную, позвольте панели FlowLayoutPanel выполнить эту работу.
Во-первых, добавьте к себе FlowLayoutPanel имя flowLayoutPanel tabPage2 и задайте следующие свойства:

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

Затем измените соответствующий код в форме 2 на:

 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);
    }
}
 

Вот как вы получаете выбранные фотографии:

 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.
    }
}
 

Комментарии:

1. Большое вам спасибо @Steeeve. Это было большое подспорье!