#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. Это было большое подспорье!