C# Don';我甚至不知道如何着手解决这个问题
以下是一位客户要求我创建的模型: 以下是我在实际软件中的内容: 问题是我需要能够从下面的控件中删除图片。我不知道如何处理这个问题。有什么指导吗 以下是我制作的自定义用户控件的代码:C# Don';我甚至不知道如何着手解决这个问题,c#,winforms,user-controls,C#,Winforms,User Controls,以下是一位客户要求我创建的模型: 以下是我在实际软件中的内容: 问题是我需要能够从下面的控件中删除图片。我不知道如何处理这个问题。有什么指导吗 以下是我制作的自定义用户控件的代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; u
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WebServiceScanner
{
public partial class selectablePicture : UserControl
{
public selectablePicture(Image image)
{
InitializeComponent();
ptbImage.BackgroundImage = image;
ptbImage.BackgroundImageLayout = ImageLayout.Zoom;
}
public Image GetImage()
{
return ptbImage.BackgroundImage;
}
public bool IsSelected()
{
return chkSelected.Checked;
}
public void DisableCheckbox()
{
this.chkSelected.Enabled = false;
}
private void ptbImage_Click(object sender, EventArgs e)
{
SelectControl();
ptbImage.Focus();
ToggleCheckBox();
}
private void selectablePicture_Click(object sender, EventArgs e)
{
SelectControl();
this.Focus();
ToggleCheckBox();
}
private void ToggleCheckBox()
{
if (!chkSelected.Enabled == false)
{
if (chkSelected.Checked)
{
chkSelected.Checked = false;
}
else
{
chkSelected.Checked = true;
}
}
}
private void chkSelected_Click(object sender, EventArgs e)
{
SelectControl();
chkSelected.Focus();
}
private void SelectControl()
{
if (!chkSelected.Enabled == false)
{
this.BackColor = Color.FromArgb(89, 168, 248);
}
}
private void chkSelected_Leave(object sender, EventArgs e)
{
DeSelectControl();
}
private void ptbImage_Leave(object sender, EventArgs e)
{
DeSelectControl();
}
private void selectablePicture_Leave(object sender, EventArgs e)
{
DeSelectControl();
}
private void DeSelectControl()
{
//If none of the controls inside the usercontrol have focus, set this control to white.
if (!chkSelected.Enabled == false)
{
if (!this.Focused && !this.ptbImage.Focused && !this.chkSelected.Focused)
{
this.BackColor = Color.White;
}
}
}
}
}
下面是我如何使用它:
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 WebServiceScanner
{
public partial class MainForm : Form
{
int pictureXPosition = 0;
List<selectablePicture> Images;
public MainForm()
{
InitializeComponent();
ptbNewestPicture.BackgroundImageLayout = ImageLayout.Zoom;
Images = new List<selectablePicture>();
}
private void button1_Click(object sender, EventArgs e)
{
LoadImageFromScanner();
}
private void scanToolStripMenuItem_Click(object sender, EventArgs e)
{
LoadImageFromScanner();
}
private void scanBatchToolStripMenuItem_Click(object sender, EventArgs e)
{
LoadBatchImagesFromScanner();
}
private void btnScanBatch_Click(object sender, EventArgs e)
{
LoadBatchImagesFromScanner();
}
private void connectionSettingsToolStripMenuItem_Click(object sender, EventArgs e)
{
ShowConfigurationForm();
}
private void LoadImageFromScanner()
{
selectablePicture picture = new selectablePicture(Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg"));
ptbNewestPicture.BackgroundImage = picture.GetImage();
picture.Location = new Point(pictureXPosition + panel1.AutoScrollPosition.X, 0);
panel1.Controls.Add(picture);
pictureXPosition += 130;
}
private void LoadBatchImagesFromScanner()
{
throw new NotImplementedException();
}
private void ShowConfigurationForm()
{
ConnectionSettingsForm connectionConfig = new ConnectionSettingsForm();
connectionConfig.ShowDialog();
}
private void btnDeleteSelected_Click(object sender, EventArgs e)
{
DeleteSelectedPictures();
}
private void DeleteSelectedPictures()
{
foreach (Control c in panel1.Controls)
{
if (((selectablePicture)c).IsSelected())
{
DisablePicture(c);
Images.Remove((selectablePicture)c);
}
}
}
private void DisablePicture(Control c)
{
c.BackColor = Color.Gray;
((selectablePicture)c).DisableCheckbox();
}
}
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
命名空间WebServiceScanner
{
公共部分类主窗体:窗体
{
int=0;
列出图像;
公共表格(
{
初始化组件();
ptbNewPicture.BackgroundImageLayout=ImageLayout.Zoom;
图像=新列表();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
LoadImageFromScanner();
}
私有void扫描工具条带菜单项单击(对象发送方,事件参数e)
{
LoadImageFromScanner();
}
私有void scanBatchToolStripMenuItem\u单击(对象发送方,事件参数e)
{
LoadBatchImagesFromScanner();
}
私有void btnScanBatch\u单击(对象发送方,事件参数e)
{
LoadBatchImagesFromScanner();
}
私有无效连接SettingsToolStripMenuItem\u单击(对象发送方,事件参数e)
{
ShowConfigurationForm();
}
私有void LoadImageFromScanner()
{
selectablePicture=new selectablePicture(Image.FromFile(@“C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg”);
ptbnewstpicture.BackgroundImage=picture.GetImage();
picture.Location=新点(PictureExposition+panel1.AutoScrollPosition.X,0);
面板1.控件。添加(图片);
平均值+=130;
}
私有void LoadBatchImagesFromScanner()
{
抛出新的NotImplementedException();
}
私有void ShowConfigurationForm()
{
ConnectionSettingsForm connectionConfig=新的ConnectionSettingsForm();
connectionConfig.ShowDialog();
}
私有void btndeletteselected\u单击(对象发送者,事件参数e)
{
删除所选图片();
}
私有void DeleteSelectedPictures()
{
foreach(控制面板1中的控制c.控制)
{
如果(((selectablePicture)c).IsSelected())
{
禁用图片(c);
图像。删除((selectablePicture)c);
}
}
}
私有无效禁用图片(控制c)
{
c、 背景色=颜色。灰色;
((selectablePicture)c).禁用复选框();
}
}
}
我曾想过维护一个用户控件列表,并在每次更改时重新绘制整个列表,但这并不好,因为如果有很多图片会发生什么
有什么指导吗
如果我想拖动和重新排序图片,需要执行哪些步骤?谢谢 一种解决方案是根本不将它们渲染为控件,而是创建一个从左到右渲染缩略图的控件(根据选定图像是否被选中修改其渲染) 删除一个图像现在是微不足道的,它只是,删除。这样您就不必再担心它了,它不再在您的渲染列表中。无需拆除控制装置 此自定义控件的开销将更小(每个图像有1个控件和N个控件) 现在,您还可以轻松实现许多其他优势,例如将效果应用于附近的图像等。。当然,这可以通过单独的控制来完成,但这样的话,球就不会那么疼了 一些指标
N = Total number of images
T_WIDTH = Thumbnail width
MARGIN_W = Margin you want either side of the thumbnail
CELL_W = T_WIDTH + (MARGIN_W * 2) (Total width of a cell that contains a thumbnail)
// Pseudo code here!!!
Scrollbar.Width = CELL_W * N
Scrollbar.PageWidth = Control.ClientWidth / CELL_W
开始渲染的图像索引
Scrollbar.Pos / CELL_W
记住根据滚动条位置在单元格内的位置偏移开始渲染的实际x位置。使用
FlowControlPanel
而不是简单的面板。然后,您可以在其中添加和删除控件,这些控件将自动对齐。您的代码有什么问题DeleteSelectedPictures()
在我看来应该可以。您的列表中可能有很多图片,但您应该只需要重新绘制半打左右的图片,以适合屏幕。