PDA

View Full Version : سوال: ایجاد گالری تصویر با DataList



caspiansea
سه شنبه 07 شهریور 1402, 12:36 عصر
سلام.من یک مجموعه تصویر دارم که توی بانک ذخیره شدن و میخوام توی یه DataList نشون داده بشن که بعد با کلیک بر روی هر تصویر یک صفحه جدید باز بشه.
خیلی روش کار کردم ولی نتونستم انجام بدم.ممنونم میشم کمک کنید

mazoolagh
چهارشنبه 08 شهریور 1402, 10:01 صبح
سلام و روز خوش

پیش از هر چیز پیشنهاد میکنم با توجه به این که تصاویر به صورت باینری در دیتابیس ذخیره شدن،
از کمپوننت های مناسب این کار استفاده کنین چون مستقیما اجازه bind کردن به دیتا باینری رو به شما میدن؛
نمونه زیر رو ببینین:

DevExpress Image Slider - Binding to Binary Data (https://demos.devexpress.com/ASPxImageAndDataNavigationDemos/ImageSlider/BindingToBinaryData.aspx)

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

با این وجود، اگر هدف آموزش و یادگیری هست روش کار رو در پست های بعدی توضیح میدم (دست کم یکی از روشهای ممکن).

mazoolagh
چهارشنبه 08 شهریور 1402, 10:38 صبح
بهتره مسئله رو به بخش های کوچکتر تقسیم و یکی یکی اونها رو حل کنیم.

اول باید یک روتین بنویسیم که تصویر رو از دیتابیس بخونه و اون رو به شکل یک url در بیاره تا بتونیم source در کنترل image ازش استفاده کنیم.

مشابه این روتین رو قبلا در تاپیک زیر آوردم (پست شماره 8):

create captcha text and save in session, captcha image as stream in C sharp (https://barnamenevis.org/showthread.php?575363-%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%A7%D8%B2-%DA%A9%D9%BE%DA%86%D8%A7%DB%8C%DB%8C-%DA%A9%D9%87-%D9%86%D9%88%D8%B4%D8%AA%D9%85-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%DA%A9%D9%86%D9%85%D8%9F&p=2460145&viewfull=1#post2460145)

در این روش یک page میسازیم که content اون رو از نوع image تعریف میکنیم و محتوای تصویر رو بصورت یک استریم در اون مینویسیم.

روش همین هست با این تفاوت که اونجا تصویر بصورت رندوم در حافظه ساخته میشد، و اینجا نیاز هست یک تصویر معین بر اساس یک ID از دیتابیس خونده بشه.

فرض میکنیم تصاویر در یک جدول (Pictures) با فیلدهای ID, Description, PictureData ذخیره شدن.
این ID رو در querystring به صفحه میفرستیم و در page load کد زیر رو مینویسیم:
response.contenttype= "image/png"

DIM id AS LONG= request.querystring("ID")
USING conn AS SQLCONNECTION= new SQLCONNECTION(your connection string)
conn.open()
USING comm AS NEW SQLCOMMAND("SELECT PictureData FROM Pictures WHERE ID=@ID" , conn)
comm.parameters.add("@ID" , sqldbtype.int).value= id
USING rdr AS SQLDATAREADER= comm.executereader
rdr.read
DIM image AS BYTE()= rdr("PictureData")
response.outputstream.write(image , 0 , image.length)
END USING
END USING
END USING

حالا اگر این صفحه رو فرضا به اسم GetImage.aspx ذخیره کرده باشیم، برای گرفتن تصویر با ID به شماره 123 کافی هست آدرس زیر رو وارد کنیم:

GetImage.aspx?ID=123

mazoolagh
چهارشنبه 08 شهریور 1402, 11:16 صبح
در itemtemplate دیتالیست یک htmlcontrol از نوع img اضافه میکنیم.
حالا کافی هست آدرسی رو که برای گرفتن تصویر داریم به عنوان src این کنترل معرفی کنیم.

چون دیتالیست به یک sqldatasource بایند شده، به ID دسترسی داریم: Eval("ID")
پس کنترل img رو به شکل زیر مینویسیم:

<img src='<%# "GetImage.aspx?ID=" & Eval("ID") %>' />

mazoolagh
چهارشنبه 08 شهریور 1402, 11:26 صبح
البته میتونیم به جای html control از کنترل سمت سرور هم استفاده کنیم:

<asp:image id="image" runat="server" imageurl='<%# "~/GetImage.aspx?ID=" & Eval("ID") %>' />

اما تا زمانی که واقعا نیازی به رخدادها یا پراپرتی های سمت سرور نداشته باشیم توجیهی نداره.

mazoolagh
چهارشنبه 08 شهریور 1402, 11:49 صبح
بخش آخر این بود که با کلیک روی عکس یک صفحه جدید باز بشه.
فرض کنیم یک صفه دیگه داریم به اسم ProductDetails.aspx که با گرفتن ID در querystring مشخصات محصولی که روی عکسش کلیک شده رو نمایش میده.

اول یک script مینویسیم که با گرفتن ID این صفحه رو باز کنه:
<script>
function ShowDetails(ID) {
window.open('ProductDetails.aspx?ID=' + ID);
}
</script>

و شکل نهایی کنترل img به صورت زیر خواهد بود:

<img src='<%# "GetImage.aspx?ID=" & Eval("ID") %>' onclick='ShowDetails(<%#Eval("ID") %>)' />

همین!

caspiansea
چهارشنبه 08 شهریور 1402, 11:54 صبح
سلام.بسیار هم عالی
مشکل حل شد:خجالت::قلب: