PDA

View Full Version : نمایش عکس در gridview و استخراج آن از sql



fatemesharifi
سه شنبه 02 خرداد 1391, 15:53 عصر
سلام
من میخوام توی asp.net
و با زبان c#
عکس توی sql ذخیره کنم و بعد هم توی
gridviewام ببینمش
ولی میخوام حتما کد نویسیش سی شارپ باشه تو سایت نمونه ی
vb,html
زیاده من سی شارپیش لازممه
مرسی دوستان

naser_feb8646
سه شنبه 02 خرداد 1391, 17:41 عصر
سلام دوست عزیز چزا میخوان عکس رو ذخیره کنید اینطوری هم حجم دیتابیس میره بالا و هم سرعت واکشی اطلاعات میاد پایین. پیشنهاد میکنم نام عکس ها رو در دیتابیس ذخیره کنید و بعد ازشون استفاده کنید که اگر این روش رو خواستید بفرمایید تا راهنمایی کنم

fatemesharifi
چهارشنبه 03 خرداد 1391, 07:38 صبح
بله این روش را میخوام لطفا توضیح میدین به زبون سی شارپ توضیح بدین باwizardنباشه لطفا کدنویسی باشه
مرسی

naser_feb8646
چهارشنبه 03 خرداد 1391, 11:21 صبح
سلام دوست عزیز

خب من از ابتدا براتون توضیح میدم
ابتدا یه جدول ساختم با نام Table1 با فیلدها name , family, pic که بوسیله کد زیر اطلاعات رو از دوتا TextBox و یک کنترل FileUpload گرفتم و صحت اطلاعات FileUpload رو چک کردم و بعد توی جدول ذخیره کردم

//{شروع مراحل ذخیره تصویر
// بدست آوردن محل ذخیره تصویر
string path = Server.MapPath("PIC/");

//چک کردن پسوند تصاویر
string[] Validext = { ".jpg", ".png", ".gif" };
string ext = System.IO.Path.GetExtension(FileUpload1.PostedFile .FileName);
if ((Array.IndexOf(Validext, ext.ToLower()) < 0))
{
lbl_error.Text = "خطا : .پسوند تصویر معتبر نیست";
return;
}

// چک کردن حجم تصاویر
long size = FileUpload1.PostedFile.ContentLength;
size = size / 1024;
if (size > 300)
{
lbl_error.Text = "خطا : حجم تصویر بزرگتر از KB 100 است";
return;
}

// چک کردن بودن تصویری با همین نام بر روی سرور
string FileName = FileUpload1.PostedFile.FileName;
while (System.IO.File.Exists((path + FileName)))
{
FileName = ("1" + FileName);
}

// ذخیره تصویر بر روی هاست
FileUpload1.SaveAs(path + FileName);

//} پایان مراحل ذخیره تصویر

//شروع مراحل ذخیره سازی{

string sqlcon = ConfigurationManager.ConnectionStrings["SQLCon"].ConnectionString;
SqlConnection conn = new SqlConnection(sqlcon);
SqlCommand cmd = conn.CreateCommand();
try
{
cmd.CommandText = "INSERT INTO Table1 (name ,family ,pic) VALUES (@name ,@family ,@pic)";
cmd.Parameters.AddWithValue("@name", TextBox1.Text);
cmd.Parameters.AddWithValue("@family", TextBox2.Text);
cmd.Parameters.AddWithValue("@pic", FileName);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
catch (Exception ex)
{
lbl_error.Text = (ex.Message);
}
//پایان مراحل ذخیره سازی{

تو مرحله بعد یه GridView گذاشتم و از طریق SqlDataSource به جدول بایندش کردم
بعد اومدم توی GridView یه تغییراتی دادیم یعنی اومدم در ستون آخر که فیلد pic یا همون تصویر ما هست بجای BoundField از TemplateField استفاده کردم و توش یه تابع رو فراخوانی کردم و در آخر توی تابع کد img رو تولید کردم که بتونه عکس رو نمایش بده


<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataSourceID="SqlDataSource1">
<Columns>
<asp:BoundField DataField="name" HeaderText="نام" SortExpression="name" />
<asp:BoundField DataField="family" HeaderText="نام خانوادگی"
SortExpression="family" />
<asp:TemplateField HeaderText="تصویر">
<ItemTemplate>
<%# ShowImage(Eval("pic"))%>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:SQLCon %>"
SelectCommand="SELECT * FROM [Table1]"></asp:SqlDataSource>و اینم تابع ShowImage

public string ShowImage(object picname)
{
string html = null;
html = "<img src='pic/" + picname.ToString() + "'>";
return html;
}

یاعلی

karim orooji
چهارشنبه 03 خرداد 1391, 16:49 عصر
سلام
به پست شماره 5 برو برنامه رو دانلود کن
http://barnamenevis.org/showthread.php?287957-آرشیو-سورس-های-کاربردی-و-بدردبخور

یا علی

fatemesharifi
پنج شنبه 04 خرداد 1391, 12:12 عصر
مرسی درست شد وولی چون سایز عکسام بزرگه خونه های گریدم بزرگ شدند چه جوری سایزشونو حتی اگر عکس بزرگ بود کوچیک کنم؟

naser_feb8646
پنج شنبه 04 خرداد 1391, 14:32 عصر
مرسی درست شد وولی چون سایز عکسام بزرگه خونه های گریدم بزرگ شدند چه جوری سایزشونو حتی اگر عکس بزرگ بود کوچیک کنم؟

نمیدونم از روش من استفاده کردین یا نه ولی در هر حال دوتا کار میشه کرد که:
1- توی کنترل img که تولید میکنید اندازه رو هم تعیین کنید(که پیشنهاد نمیشه چون فقط اندازه عکس کوچک میشه و حجم اون تغییر نمیکنه)
2- در هنگام آپلود عکس یک نمونه thumbnail از اون بسازید و موقع فراخوانی thumbnail اون را اجرا کنید
برای راه کار دوم قسمت دوم مقاله زیر رو بخونید
کوچک نمایی تصاویر با نسبت یکسان ( thumbnail image ) (http://www.how2learnasp.net/article.aspx?code=37d01551-0901-418b-8f81-9a2043413a53)

fatemesharifi
شنبه 06 خرداد 1391, 07:33 صبح
این سایته تو کامپیوترم باز نمیشه یه چیز دیگه معرفی میکنید لطفا؟

sepide_68_91
شنبه 06 خرداد 1391, 09:52 صبح
سلام دوست عزیز

خب من از ابتدا براتون توضیح میدم
ابتدا یه جدول ساختم با نام Table1 با فیلدها name , family, pic که بوسیله کد زیر اطلاعات رو از دوتا TextBox و یک کنترل FileUpload گرفتم و صحت اطلاعات FileUpload رو چک کردم و بعد توی جدول ذخیره کردم

//{شروع مراحل ذخیره تصویر
// بدست آوردن محل ذخیره تصویر
string path = Server.MapPath("PIC/");

//چک کردن پسوند تصاویر
string[] Validext = { ".jpg", ".png", ".gif" };
string ext = System.IO.Path.GetExtension(FileUpload1.PostedFile .FileName);
if ((Array.IndexOf(Validext, ext.ToLower()) < 0))
{
lbl_error.Text = "خطا : .پسوند تصویر معتبر نیست";
return;
}

// چک کردن حجم تصاویر
long size = FileUpload1.PostedFile.ContentLength;
size = size / 1024;
if (size > 300)
{
lbl_error.Text = "خطا : حجم تصویر بزرگتر از KB 100 است";
return;
}

// چک کردن بودن تصویری با همین نام بر روی سرور
string FileName = FileUpload1.PostedFile.FileName;
while (System.IO.File.Exists((path + FileName)))
{
FileName = ("1" + FileName);
}

// ذخیره تصویر بر روی هاست
FileUpload1.SaveAs(path + FileName);

//} پایان مراحل ذخیره تصویر

//شروع مراحل ذخیره سازی{

string sqlcon = ConfigurationManager.ConnectionStrings["SQLCon"].ConnectionString;
SqlConnection conn = new SqlConnection(sqlcon);
SqlCommand cmd = conn.CreateCommand();
try
{
cmd.CommandText = "INSERT INTO Table1 (name ,family ,pic) VALUES (@name ,@family ,@pic)";
cmd.Parameters.AddWithValue("@name", TextBox1.Text);
cmd.Parameters.AddWithValue("@family", TextBox2.Text);
cmd.Parameters.AddWithValue("@pic", FileName);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
catch (Exception ex)
{
lbl_error.Text = (ex.Message);
}
//پایان مراحل ذخیره سازی{

تو مرحله بعد یه GridView گذاشتم و از طریق SqlDataSource به جدول بایندش کردم
بعد اومدم توی GridView یه تغییراتی دادیم یعنی اومدم در ستون آخر که فیلد pic یا همون تصویر ما هست بجای BoundField از TemplateField استفاده کردم و توش یه تابع رو فراخوانی کردم و در آخر توی تابع کد img رو تولید کردم که بتونه عکس رو نمایش بده


<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataSourceID="SqlDataSource1">
<Columns>
<asp:BoundField DataField="name" HeaderText="نام" SortExpression="name" />
<asp:BoundField DataField="family" HeaderText="نام خانوادگی"
SortExpression="family" />
<asp:TemplateField HeaderText="تصویر">
<ItemTemplate>
<%# ShowImage(Eval("pic"))%>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:SQLCon %>"
SelectCommand="SELECT * FROM [Table1]"></asp:SqlDataSource>و اینم تابع ShowImage

public string ShowImage(object picname)
{
string html = null;
html = "<img src='pic/" + picname.ToString() + "'>";
return html;
}

یاعلی


سلام
ممنون از اموزشتون
من یک سوال داشتم:
اینکه
من یک گرید دارم با ستون های نام و سن مدرک و شهر تولد که از بانک پرش میکنم یک فولدر عکس هم در قسمت سولوشن سایتم دارم
توی صفحه اصلی سایت با چند تا تکست باکس اطلاعات رو میگبرم و در بانک ذخیره میکنم و نهایتا در گرید نشونشون میدم
سوالم اینجاست که آیا راهی هست که توی نمایش اطلاعات در گرید شرطی بذارم که موقع نمایش اطلاعات از بانک در گرید, اگر توی ستون شهر تولد مثلا شیراز درج شده بود از فولدری که گفتم توی قسمت سولوشن سایتم دارم عکس ارامگاه سعدی لود بشه و جای شیراز در ستون شهر تولد توی گرید نمایش داده بشه؟
(یعنی هیچ عکس و ادرس عکسی در بانک ذخیره نشه و فقط در ظاهر عکس نمایش داده بشه)
ممنون میشم لطف کنید و راهنماییم کنید:گریه:

naser_feb8646
شنبه 06 خرداد 1391, 10:36 صبح
سلام
ممنون از اموزشتون
من یک سوال داشتم:
اینکه
من یک گرید دارم با ستون های نام و سن مدرک و شهر تولد که از بانک پرش میکنم یک فولدر عکس هم در قسمت سولوشن سایتم دارم
توی صفحه اصلی سایت با چند تا تکست باکس اطلاعات رو میگبرم و در بانک ذخیره میکنم و نهایتا در گرید نشونشون میدم
سوالم اینجاست که آیا راهی هست که توی نمایش اطلاعات در گرید شرطی بذارم که موقع نمایش اطلاعات از بانک در گرید, اگر توی ستون شهر تولد مثلا شیراز درج شده بود از فولدری که گفتم توی قسمت سولوشن سایتم دارم عکس ارامگاه سعدی لود بشه و جای شیراز در ستون شهر تولد توی گرید نمایش داده بشه؟
(یعنی هیچ عکس و ادرس عکسی در بانک ذخیره نشه و فقط در ظاهر عکس نمایش داده بشه)
ممنون میشم لطف کنید و راهنماییم کنید:گریه:

سلام دوست عزیز
اگر درست متوجه شده باشم شما میخواید توی اون فولدر عکس بگرده اگر عکسی در مورد شهر مورد نظر بود که عکس رو بزاره اگر نبود اسم خود شهر رو بنویسه درسته؟

naser_feb8646
شنبه 06 خرداد 1391, 10:38 صبح
این سایته تو کامپیوترم باز نمیشه یه چیز دیگه معرفی میکنید لطفا؟

دوست عزیز لینک رو درست کردم میتونید الان استفاده کنید

sepide_68_91
شنبه 06 خرداد 1391, 12:01 عصر
سلام دوست عزیز
اگر درست متوجه شده باشم شما میخواید توی اون فولدر عکس بگرده اگر عکسی در مورد شهر مورد نظر بود که عکس رو بزاره اگر نبود اسم خود شهر رو بنویسه درسته؟

سلام
تقریبا اره
میخوام یک سری عکس محدود باشه
مثلا پنج تا عکس با نام های یک تا پنج باشه(توی فولدر) داشته باشم
بعد شرط بذارم اگر توی ستون شهر تولد , شیراز بود , عکس با نام یک از فولدر لود بشه و در گرید نمایش داده بشه و یا اگر اصفهان بود , عکس دو و اگر یزد بود , عکس سه و الی آخر
خواهش میکنم راهنمایی کنید

fakhravari
شنبه 06 خرداد 1391, 12:18 عصر
شما در قسمت onrowdatabound="GridView1_RowDataBound" میتوانید این کار را انجام دهید.

naser_feb8646
شنبه 06 خرداد 1391, 12:42 عصر
سلام دوست عزیز

و اینم تابع ShowImage

public string ShowImage(object picname)
{
string html = null;
html = "<img src='pic/" + picname.ToString() + "'>";
return html;
}

یاعلی

دوست عزیز شما از همون مثال قبل استفاده کنید و بعد توی تابع ShowImage بیاین مقدار موجود در فیلد شهر رو با مقادیر مورد نظرتون چک کنید اگر درست بود عکس مورد نظرتون رو نمایش بدین

public string ShowImage(object picname)
{
string html = null;
switch (Convert.ToString(picname))
{
case "شیراز":
html = "<img src='pic/01.jpg'>";
break;
case "یزد":
html = "<img src='pic/02.jpg'>";
break;
case "اصفهان":
html = "<img src='pic/03.jpg'>";
break;
case "مشهد":
html = "<img src='pic/04.jpg'>";
break;
}

return html;
}

sepide_68_91
شنبه 06 خرداد 1391, 17:17 عصر
دوست عزیز شما از همون مثال قبل استفاده کنید و بعد توی تابع ShowImage بیاین مقدار موجود در فیلد شهر رو با مقادیر مورد نظرتون چک کنید اگر درست بود عکس مورد نظرتون رو نمایش بدین

public string ShowImage(object picname)
{
string html = null;
switch (Convert.ToString(picname))
{
case "شیراز":
html = "<img src='pic/01.jpg'>";
break;
case "یزد":
html = "<img src='pic/02.jpg'>";
break;
case "اصفهان":
html = "<img src='pic/03.jpg'>";
break;
case "مشهد":
html = "<img src='pic/04.jpg'>";
break;
}

return html;
}

سلام
ممنونم
اما کدها رو امتحان کردم
جواب نداد..!!
خواهش میکنم ازتون اگه ممکنه لطف کنید و یک نمونه برام بذارید(خودتون توی یک نمونه وب سایت ساده انجامش بدید)(لطفا)(خواهش میکنم)
خودم هر چقدر با کدها رو کم و زیاد کردم , جواب نداد..
ممنون

naser_feb8646
یک شنبه 07 خرداد 1391, 00:56 صبح
سلام
ممنونم
اما کدها رو امتحان کردم
جواب نداد..!!
خواهش میکنم ازتون اگه ممکنه لطف کنید و یک نمونه برام بذارید(خودتون توی یک نمونه وب سایت ساده انجامش بدید)(لطفا)(خواهش میکنم)
خودم هر چقدر با کدها رو کم و زیاد کردم , جواب نداد..
ممنون

سلام دوست عزیز بفرمایید

http://naserfeb8646.persiangig.com/document/WebSite5.rar

sepide_68_91
یک شنبه 07 خرداد 1391, 11:18 صبح
سلام
واقعا ازتون ممنونم که لطف کردید و برام نمونه گذاشتید
فقط یه سوال:
من گریدم رو با کدنویسی در لود صفحه با این کدها پر میکنم

string str = "Data Source=.;Initial Catalog=Test;Integrated Security=True;";
SqlConnection con = new SqlConnection(str);
con.Open();
string sql = "select id,name,famil,age,shahretavalod from info ";
SqlDataAdapter da = new SqlDataAdapter(sql,con);
DataTable dt = new DataTable();
da.Fill(dt);

GridView1.DataSource = dt;
GridView1.DataBind();

con.Close();

کدهای شما رو امتحان کردم(قسمت ایتم تمپلیت رو اضاف کردم)
اما
جواب نداد
میشه راهنمایی بفرمایید چه تغییری باید بدم؟:ناراحت:
ممنونم
(بازم ببخشید و تشکر):تشویق:

naser_feb8646
یک شنبه 07 خرداد 1391, 16:37 عصر
سلام دویت عزیز
چرا از SqlDataSource استفاده نمیکنید
اگر بخواهید از روش کد نویسی استفاده کنید راهی به نظرم نمیرسد جز یکبار پیماشی dataTable و جایگزینی کردن تگ img

sepide_68_91
دوشنبه 08 خرداد 1391, 16:54 عصر
سلام
تا همین جا هم ممنون دوست من
زحمت کشیدید
فقط راهی هست وقتی اطلاعات رو کاربر با زدن کلید درج در بانک ذخیره میکنه گرید هم به روز بشه؟؟
ممنونم ازتون

sepide_68_91
دوشنبه 08 خرداد 1391, 16:56 عصر
سلام
تا همین جا هم ممنون دوست من
زحمت کشیدید
فقط راهی هست وقتی اطلاعات رو کاربر با زدن کلید درج در بانک ذخیره میکنه گرید هم به روز بشه؟؟
ممنونم ازتون

hashemi85sep
دوشنبه 08 خرداد 1391, 17:04 عصر
سلام
تا همین جا هم ممنون دوست من
زحمت کشیدید
فقط راهی هست وقتی اطلاعات رو کاربر با زدن کلید درج در بانک ذخیره میکنه گرید هم به روز بشه؟؟
ممنونم ازتون

سلام
موقعی که دستور insert انجام شد, بعدش شما کد نمایش اطلاعات رو فراخوانی کنید تا گرید هم به روز بشه

naser_feb8646
دوشنبه 08 خرداد 1391, 20:47 عصر
سلام دوست عزیز
بفرمایید این هم کاری که میخواستید بوسیله کد نویسی و هم پر کردن گرید ویو بعد از insert

http://naserfeb8646.persiangig.com/document/WebSite.rar

sepide_68_91
سه شنبه 09 خرداد 1391, 09:43 صبح
سلام دوست عزیز
بفرمایید این هم کاری که میخواستید بوسیله کد نویسی و هم پر کردن گرید ویو بعد از insert

http://naserfeb8646.persiangig.com/document/WebSite.rar

سلام
ممنونم دوست من
خیلی ماه اید
فقط یه توضیح درباره این خطوط (و خطوط مشابه) میفرمایید؟(لطفا)


<asp:TemplateField HeaderText="نام">
<ItemTemplate>
<asp:Label ID="lbl1" runat="server" Text='<%#Bind("Name") %>' CssClass="rowHeader"></asp:Label>
</ItemTemplate>
</asp:TemplateField>

چرا و چگونه اضافشون کنم(توی پروژه خودم)
بازم ممنون
موفق و سربلند باشید(دوست من)

hashemi85sep
سه شنبه 09 خرداد 1391, 09:54 صبح
دوست عزیز
توی قسمت TemplateField یه کنترل بزار و به هرکدوم ازفیلد های بانکه که میخوای بایند کن ...

naser_feb8646
سه شنبه 09 خرداد 1391, 11:39 صبح
سلام
ممنونم دوست من
خیلی ماه اید
فقط یه توضیح درباره این خطوط (و خطوط مشابه) میفرمایید؟(لطفا)


<asp:TemplateField HeaderText="نام">
<ItemTemplate>
<asp:Label ID="lbl1" runat="server" Text='<%#Bind("Name") %>' CssClass="rowHeader"></asp:Label>
</ItemTemplate>
</asp:TemplateField>

چرا و چگونه اضافشون کنم(توی پروژه خودم)
بازم ممنون
موفق و سربلند باشید(دوست من)



سلام خواهش میکنم دوست عزیز

ببینید چون شما گرید رو از طریق کد نویسی پر میکنید برای اینکه بتونید به گرید شکل بدین از TemplateFieldها استفاده میکنید و یه کنترل Lable یا Literal توش میزارید و مقدارش رو از طریق متد bind پر میکنید

sepide_68_91
سه شنبه 09 خرداد 1391, 21:59 عصر
سلام خواهش میکنم دوست عزیز

ببینید چون شما گرید رو از طریق کد نویسی پر میکنید برای اینکه بتونید به گرید شکل بدین از TemplateFieldها استفاده میکنید و یه کنترل Lable یا Literal توش میزارید و مقدارش رو از طریق متد bind پر میکنید

سلام
بازم ممنون
موفق باشید دوست من
(فقط شما نمیدونید حالا چطور سایتم رو روی iis اپلود کنم که هر جا ادرسش رو در مرورگر زدم سایتم قابل دسترس باشه؟(تاپیک زدم اما نتیجه ای هنوز نگرفتم):گریه::ناراحت:
ممنون