在C#.net表单应用程序中动态生成图库 [英] dynamically generate image gallery in C#.net form application
问题描述
我正在使用Image gallery。我在其中动态创建了图片框和标签,用于提供图片名称。现在将所有图片加载到面板中的图片框后,问题在于排列图片框,只有四个连续。当我向下拖动面板并再次调用button1_Click事件时,排列图片框后,图像的位置被从它们中删除。图像加载到不同的位置意味着它正在覆盖。请帮我解决。
图片链接,您可以从中获得确切的想法
http://postimg.org/image / 5tm5gzj87 /
http://postimg.org/image/4sridmuuj/
这是我的代码。
请帮帮我..
代码:
public partial class Form1:Form
{
int photo_Count,a;
PictureBox [] pb;
private string [] imgName;
public static string ImageToShow ;
string _directoryName = @ ./快照跨度>;
图片im;
Bitmap bm;
// System.IO.Directory mydir;
System.IO.DirectoryInfo dirinfo;
public Form1()
{
InitializeComponent();
panel1.Top =( this .ClientSize.Height - panel1.Height)/ 2 ;
panel1.Left =( this .ClientSize.Width - panel1.Width)/ 2 ;
}
private void AddControls( int Count)
{
pb = new System.Windows.Forms.PictureBox [Count]; // 分配号码数组
for ( int i = 0 ; i < 计数; i ++)
{
pb [i] = new System.Windows.Forms.PictureBox(); // 初始化一个变量
}
// 调用此函数时,您可以确定控件的数量
}
// 点击图片的事件
private < span class =code-keyword> void ClickImage( Object sender,System.EventArgs e)
{
// 点击:加载(ImageToShow)图像的(标签)
ImageToShow =((System.Windows.Forms.PictureBox)sender).Tag.ToString();
// PictureBox picBox =(PictureBox)(发送者);
// picBox.BorderStyle = BorderStyle.Fixed3D;
}
private 图片GetCopyImage(字符串路径)
{
a = 1 跨度>;
使用(im = Image.FromFile(path))
{
bm = new 位图(im);
return bm;
}
}
private void button1_Click( object sender,EventArgs e)
{
if (Directory.Exists(_directoryName))
{
imgName = Directory.GetFiles(Application.StartupPath + @ < span class =code-string> \Snapshot);
dirinfo = new System.IO.DirectoryInfo(_directoryName);
photo_Count = dirinfo.GetFiles( * jpg)。Count();
if (photo_Count!= 0 )
{
AddControls(photo_Count);
int xpos = 5 ;
int ypos = 5 ;
// MessageBox.Show(目录中已记录图片的总数为: + photo_Count);
for ( int i = < span class =code-digit> 0 ; i < photo_Count; ++ i)
{
Label name = new Label();
// *******************加载跟踪文件夹中的图像********************* //
im = GetCopyImage(imgName [i]);
pb [i] .Image = im;
if (xpos > 920 )
{
xpos = 5 ; // 在左边留下八个像素
ypos = ypos + 240 跨度>; // 图片高度+ 220
}
pb [i] .Left = xpos;
pb [i] .Top = ypos;
pb [i] .Size = new 大小( 300 , 220 跨度>);
pb [i] .BorderStyle = BorderStyle.None;
pb [i] .SizeMode = PictureBoxSizeMode.Zoom;
pb [i] .BackgroundImageLayout = ImageLayout.Tile;
pb [i] .Cursor = System.Windows.Forms.Cursors.Hand;
panel1.Controls.Add(pb [i]);
pb [i] .BringToFront();
pb [i] .Tag = imgName [i];
pb [i]。点击+ = new System.EventHandler(ClickImage);
var filenNme = Path.GetFileName(imgName [i]);
name.Text = filenNme.ToString();
name.Size = new 大小( 300 , 30 跨度>);
name.Left = xpos;
name.Top = ypos + 220 ;
name.Tag = imgName [i];
panel1.Controls.Add(name);
xpos = xpos + 305 ;
}
}
else
{
MessageBox.Show( 目录中没有跟踪图像...... !!!, 信息,MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
else
{
if (MessageBox.Show( 跟踪图像没有目录...... !!!, 信息,MessageBoxButtons.YesNo,MessageBoxIcon.Information)== DialogResult.Yes);
{
System.IO.Directory.CreateDirectory(_directoryName);
}
}
}
private void btnDELETE_Click( object sender,EventArgs e)
{
File.Delete(ImageToShow);
// button1.PerformClick();
MessageBox.Show( 图像被成功删除... !!!, 信息,MessageBoxButtons.OK,MessageBoxIcon.Information);
}
嗨Dhruv,
从您在问题中显示的代码中我假设您正在尝试各种原型。如果你想这样做更好地实现自定义控件或至少一个组合用户控件(在Label和picturebox之外)。当然,你需要一种列表来呈现/选择单个图片。
我会实现一个自定义控件(OwnerDrawn)并通过绘制图像摆脱无用的PictureBox / Label控件/自定义控件的绘图处理程序中的文本(这应该可以提高性能),您可以更轻松地控制DoubleBuffering之类的东西。
替代方案可以只是使用准备好的控件完成您在代码中显示的内容 -ListView
,其属性查看
设置为View.Tile
您目前的方法有任何具体问题吗?
顺便说一句。对于这种应用程序,我强烈建议使用WPF而不是Windows.Forms作为演示技术。 (但那是另一个故事)
只是我的2美分(或者你用的是什么货币;-)
亲切的问候Johannes
试试这个,
PictureBox picToDelete;
修改此功能。
私有 void ClickImage( Object sender,System.EventArgs e)
{
// On点击:加载(ImageToShow)带图像的(Tag)
ImageToShow =((System.Windows.Forms.PictureBox)sender).Tag.ToString();
PictureBox picToDelete =(PictureBox)(发送者);
}
private void btnDELETE_Click( object sender,EventArgs e)
{
panel1.Controls.Remove(picToDelete);
File.Delete(ImageToShow);
// button1.PerformClick();
MessageBox.Show(& ; 已成功删除... !!!& quot;,& quot; Information& quot;,MessageBoxButtons.OK,MessageBoxIcon.Information);
} < / pre > 跨度>
I am working on Image gallery .In which I have dynamically create picturebox and label for giving image name.Now after getting load all images in to pictureboxes in a panel , issue is in arranging the picture boxes, only four in a row. After arranging the picture boxes when I am drag down the panel and again calling the button1_Click event the place of images getting destructed from them place.The images are loading on different location means it's getting over-write.please help me out.
Images links from where you can get exact idea
http://postimg.org/image/5tm5gzj87/
http://postimg.org/image/4sridmuuj/
here is my code.
please help me out..
CODE:
public partial class Form1 : Form
{
int photo_Count, a;
PictureBox[] pb;
private string[] imgName;
public static string ImageToShow;
string _directoryName = @"./Snapshot";
Image im;
Bitmap bm;
// System.IO.Directory mydir;
System.IO.DirectoryInfo dirinfo;
public Form1()
{
InitializeComponent();
panel1.Top = (this.ClientSize.Height - panel1.Height) / 2;
panel1.Left = (this.ClientSize.Width - panel1.Width) / 2;
}
private void AddControls(int Count)
{
pb = new System.Windows.Forms.PictureBox[Count]; // assign number array
for (int i = 0; i < Count; i++)
{
pb[i] = new System.Windows.Forms.PictureBox(); // Initialize one variable
}
// When call this function you determine number of controls
}
// The Event to click the image
private void ClickImage(Object sender, System.EventArgs e)
{
// On Click: load (ImageToShow) with (Tag) of the image
ImageToShow = ((System.Windows.Forms.PictureBox)sender).Tag.ToString();
//PictureBox picBox = (PictureBox)(sender);
//picBox.BorderStyle = BorderStyle.Fixed3D;
}
private Image GetCopyImage(string path)
{
a = 1;
using (im = Image.FromFile(path))
{
bm = new Bitmap(im);
return bm;
}
}
private void button1_Click(object sender, EventArgs e)
{
if (Directory.Exists(_directoryName))
{
imgName = Directory.GetFiles(Application.StartupPath + @"\Snapshot");
dirinfo = new System.IO.DirectoryInfo(_directoryName);
photo_Count = dirinfo.GetFiles("*jpg").Count();
if (photo_Count != 0)
{
AddControls(photo_Count);
int xpos = 5;
int ypos = 5;
// MessageBox.Show("Total No of traked images in the directory are : " + photo_Count);
for (int i = 0; i < photo_Count; ++i)
{
Label name = new Label();
//*******************Load tracked Images from the folder*********************//
im = GetCopyImage(imgName[i]);
pb[i].Image = im;
if (xpos > 920)
{
xpos = 5; // leave eight pixels at Left
ypos = ypos + 240; // height of image + 220
}
pb[i].Left = xpos;
pb[i].Top = ypos;
pb[i].Size = new Size(300, 220);
pb[i].BorderStyle = BorderStyle.None;
pb[i].SizeMode = PictureBoxSizeMode.Zoom;
pb[i].BackgroundImageLayout = ImageLayout.Tile;
pb[i].Cursor = System.Windows.Forms.Cursors.Hand;
panel1.Controls.Add(pb[i]);
pb[i].BringToFront();
pb[i].Tag = imgName[i];
pb[i].Click += new System.EventHandler(ClickImage);
var filenNme = Path.GetFileName(imgName[i]);
name.Text = filenNme.ToString();
name.Size = new Size(300, 30);
name.Left = xpos;
name.Top = ypos + 220;
name.Tag = imgName[i];
panel1.Controls.Add(name);
xpos = xpos + 305;
}
}
else
{
MessageBox.Show("There is no tracked image in directory...!!!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
else
{
if (MessageBox.Show("There is no directory for Tracked Images...!!!", "Information", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) ;
{
System.IO.Directory.CreateDirectory(_directoryName);
}
}
}
private void btnDELETE_Click(object sender, EventArgs e)
{
File.Delete(ImageToShow);
//button1.PerformClick();
MessageBox.Show("The image is deleted successfully...!!!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
Hi Dhruv,
From the code you showed in your question I assume you are experimenting with kind of prototype. If you want to go that way better implement a custom control or at least a composed user control (out of Label and picturebox). Of course then you need a kind of "list" to present/select the individual pictures.
I would implement a custom control (OwnerDrawn) and get rid of useless PictureBox/Label controls by just painting the Image/Text in a custom control's paint handler (this should boost perfomance) and you can easier control things like DoubleBuffering.
An alternative could be just using a prepared control doing exactly what you showed in your code - aListView
with the propertyView
set toView.Tile
Do you have any specific problems with your current approach?
Btw. for this kind of app I would highly recommend using WPF and not Windows.Forms as presentation technology. (But that's another story)
just my 2 cents (or what currency you use ;-)
kind regards Johannes
Try this,
PictureBox picToDelete;
modify this function.
private void ClickImage(Object sender, System.EventArgs e) { // On Click: load (ImageToShow) with (Tag) of the image ImageToShow = ((System.Windows.Forms.PictureBox)sender).Tag.ToString(); PictureBox picToDelete = (PictureBox)(sender); }
private void btnDELETE_Click(object sender, EventArgs e) { panel1.Controls.Remove(picToDelete); File.Delete(ImageToShow); //button1.PerformClick(); MessageBox.Show("The image is deleted successfully...!!!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); }</pre>
这篇关于在C#.net表单应用程序中动态生成图库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!