PDA

View Full Version : مشکل در نمایش عکس موجود در دیتابیس بر روی فرم



M.Soroor
شنبه 27 بهمن 1386, 21:36 عصر
برای نمایش عکس موجود در رکورد انتخاب شده از DataGrid به فرم از این کد استفاده کردم:


PicBox1.Image = DataGrid1.CurrentRow.Cells("pic").Value

که در زمان اجرا پیغام خطا داد
از چه کدی باید استفاده کرد؟

ghafoori
شنبه 27 بهمن 1386, 22:22 عصر
دوست عزیز خطا را هم بنویسید

M.Soroor
شنبه 27 بهمن 1386, 22:41 عصر
InvalidCastException was unhandled
Unable to cast object of type 'System.Byte[]' to type 'System.Drawing.Image'.

nasseritemp
یک شنبه 28 بهمن 1386, 01:10 صبح
منبع: http://planet-source-code.com

M.Soroor
یک شنبه 28 بهمن 1386, 08:27 صبح
ممنون از شما
اما من نیاز به Bind کردن فیلدها ندارم
من فقط می خوام اطلاعات فیلدهای رکوردی که الآن کاربر در DataGrid انتخاب کرده رو در فرم نمایش بدم
برای نمایش مقدارهای Text مشکلی نیست و با گذاشتن این کد در رویداد CellEnter مربوط به DataGrid به نتیجه رسیدم:


TextBox1.Text = DataGrid1.CurrentRow.Cells("FieldName").Value

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

ghafoori
یک شنبه 28 بهمن 1386, 10:16 صبح
دوست عزیز شما باید ارایه ای از byte را به عکس تبدیل کنید برای این کار من این را پیش نهاد می دم


Dim b(100) As Byte
Dim s As IO.Stream
s.Write(b, 0, b.Count)
Dim i As Image = Image.FromStream(s)

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

M.Soroor
یک شنبه 28 بهمن 1386, 12:18 عصر
متاسفانه من از این کد چیزی متوجه نشدم!
ببخشید، مبتدی هستیم دیگه!

اما یه سرچ تو انجمن کردم یه نفر یه روشی رو به طور کلی معرفی کرد، اونم این بود که:
از داخل DataGrid با استفاده از شماره یا id رکورد انتخاب شده و یه دستور SELECT مقدار فیلد تصویر اون رکورد رو (همون عکس مورد نظر ما) بدست بیاریم
و فیلد بدست اومده رو با Bind کردن به یه PictureBox روی فرم نمایش بدیم
من هم از همین روش استفاده کردم و در رویداد CellEnter مربوط به DataGrid از این کد استفاده کردم:
(مقدار Label1 همون id بدست اومده هست)


objCommand = New OleDbCommand("SELECT pic FROM info WHERE id=@id", objConnection)
objDataAdapter = New OleDbDataAdapter(objCommand)
objDataSet = New DataSet
objCommand.Parameters.Clear()
objCommand.Parameters.AddWithValue("id", Label1.Text)
objCommand.CommandType = CommandType.Text
objDataAdapter.Fill(objDataSet, "info")
objDataView = New DataView(objDataSet.Tables("info"))
PicBox1.DataBindings.Clear()
PicBox1.DataBindings.Add("Image", objDataView, "pic")

اما تو خط آخر این پیغام خطا رو میده:
Cannot format the value to the desired type.

فکر کنم خطا رو تو قسمت ("Image", می گیره، چون من از همین روش برای نمایش مقدارهای Text استفاده کردم و جواب داد
به جای Image چه مقداری باید گذاشت؟

ghafoori
یک شنبه 28 بهمن 1386, 13:01 عصر
در این روش جدول و picturebox به یک منبع داده متصل میشود با حرکت داخل منبع داده توسط جدول عکس picturebox هم عوض می شود البته من خودم این کار را امتحان نکردم
در کورد کد من هم خروجی سلول ارایه از بایت است درجالی که picturebox ورودی عکس میخواهد که با کد بالا می توانی تبدیل کنی

visual_sadegh
یک شنبه 28 بهمن 1386, 13:48 عصر
PicBox1.Image = DataGrid1.CurrentRow.Cells("pic").Value
اینو امتحان کن ببین جواب میده

PicBox1.Image = image.fromstream(DataGrid1.CurrentRow.Cells("pic").Value)

M.Soroor
یک شنبه 28 بهمن 1386, 17:11 عصر
اینو امتحان کن ببین جواب میده

PicBox1.Image = image.fromstream(DataGrid1.CurrentRow.Cells("pic").Value)

این پیغام خطا رو میده:
Unable to cast object of type 'System.Byte[]' to type 'System.IO.Stream'.
:گریه:

M.Soroor
یک شنبه 28 بهمن 1386, 17:20 عصر
در کورد کد من هم خروجی سلول ارایه از بایت است درجالی که picturebox ورودی عکس میخواهد که با کد بالا می توانی تبدیل کنی

اگه امکان داره کمی بیشنر توضیح بدید
از چه کدی و چطور باید استفاده کنم
ممنون

M.Soroor
یک شنبه 28 بهمن 1386, 21:06 عصر
یعنی هیچ راهی برای این کار نیست؟
برای پروژه پایان ترم لازم دارم:ناراحت:
لطفآ راهنمایی کنید:گریه:

ghafoori
یک شنبه 28 بهمن 1386, 23:01 عصر
کد

Dim b() As Byte = Me.DataGridView1.CurrentRow.Cells("pic").Value()
Dim s As IO.Stream
s.Write(b, 0, b.Length)
Dim i As Image = Image.FromStream(s)

M.Soroor
یک شنبه 28 بهمن 1386, 23:41 عصر
وقتی این کد رو وارد ادیتور کردم در خط سوم قسمت s.Write زیر s یک هاشور سبز کشیده میشه و با نگه داشتن ماوس روی اون این پیغام رو نشون میده:
Variable 's' is used before it has been assigned a value. A null reference exception could result at runtime.

و موقع اجرا این پیغام خطا رو میده:
Object reference not set to an instance of an object.

من کدها رو در رویداد CellEnter مربوط به DataGrid قرار دادم

ghafoori
دوشنبه 29 بهمن 1386, 08:00 صبح
کد زیر را جایگزین کنید

Dim b() As Byte = Me.DataGridView1.CurrentRow.Cells("pic").Value()
Dim s As New IO.MemoryStream
s.Write(b, 0, b.Length)
Dim i As Image = Image.FromStream(s)

M.Soroor
دوشنبه 29 بهمن 1386, 09:55 صبح
موقع اجرا در خط آخر قسمت i As Image = Image.FromStream(s) این خطا رو میده:
Parameter is not valid.

ghafoori
دوشنبه 29 بهمن 1386, 11:22 صبح
من هم هرچی ور رفتم نتونستم درستش کنم اخر هم picturebox و گرید را با هم به یک منبع وصل کردم این هم پروژه14762

M.Soroor
دوشنبه 29 بهمن 1386, 18:44 عصر
ممنونم جناب ghafoori که پیگیر مشکل من بودید

من حتی با Bind کردن هم نتونستم عکس داخل جدول رو برروی فرم نمایش بدم
از دوستان کسی نیست که روشی برای انجام این کار پیشنهاد کنه؟:افسرده:

reza1944
سه شنبه 30 بهمن 1386, 02:08 صبح
میتونی عکسها رو تو یه فلدر جمع کنی و فقط آدرس هر عکس رو به دیتاباست بدی که بره لودش کنه خیلی راحت!
من خودم تو یکی از کارام همینو انتخاب کردم

visual_sadegh
سه شنبه 30 بهمن 1386, 10:33 صبح
فکر کنم بهتره سورس برنامه رو آپلود کنی تا بهتر بتونیم کمکت کنیم

Evil 69
سه شنبه 30 بهمن 1386, 10:52 صبح
سلام
شما اگر توی اون سلول از دیتا گرید تون آدرس اون عکس رو هم دارین خوب دیگه کاری نداره شما میتونین به جای اینکه بنویسین fromstream مینویسین fromfile و بعد آدرس عکسی که توی اون سلول دارین حالا منطقی اینه که برنامه بره توی سیستم و اون آدرس رو ژیدا کنه و بعد عکس رو لود کنه توی picturebox

M.Soroor
سه شنبه 30 بهمن 1386, 15:20 عصر
راستش امروز رفتم دانشگاه واسه تحویل پروژه استادمون نیومد، گفتند برید هفته بعد بیاید
خوشبختانه یک هفته وقت نصیبمون شد، می تونم بیشتر رو پروژه کار کنم:تشویق:

خدمت دوستان یه توضیحات کلی بدم که دیگه سوالی باقی نمونه
فرض کنید یک جدول داریم به نام Info، شامل سه فیلد Name , Family , Pic که عکس های ما در فیلد Pic ذخیره می شوند

من با کد زیر عکس مورد نظر رو از هارد، داخل PictureBox لود می کنم:


With OpenPictureDialog1
.Filter = "Image File (*.jpg)|*.jpg"
.FilterIndex = 1
.Title = "وارد کردن تصویر"
End With
If OpenPictureDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
PictureBox1.Image = System.Drawing.Image.FromFile(OpenPictureDialog1.F ileName)
End If
و بعد با یک دستور INSERT مقدار داخل PictureBox (که همون عکس ما هست) رو به جدول می فرستم و در فیلد Pic ذخیره می شود

همونطور که شما بهتر از من می دونید، با کد زیر می شود فرضآ مقدار TextBox1.Text رو به مقدار فیلد Name در جدول، Bind کرد و بر روی فرم نمایش داد:


TextBox1.DataBindings.Add("Text", objDataView, "Name")
اما من از همین روش برای نمایش عکس موجود در جدول استفاده کردم که خطا داد

ضمنآ دوستانی که پیشنهاد لود شدن عکس از روی آدرس اون رو دادند باید بگم که من از این روشی که گفتم برای ذخیره عکس در جدول استفاده کردم
نمی دونم با این روش آیا آدرس عکس هم ذخیره می شه یا نه
اگه امکانش هست کمی بیشتر و به همراه کد این روش رو توضیح بدید
ممنون

khz-web1
چهارشنبه 01 اسفند 1386, 05:11 صبح
دوست عزیز من یک روش بهت پیشنهاد می کنم(ولی بهش زیاد اعتماد ندارم)

2تا فیلد بزار روی فرمت ، بیا اول با دستور mapath.save اونو تو یه فولدر ذخیره کن (مثلا image)
و بعد در فیلد دوم آدرس اون فولد رو بده(مثلا image/photo.jpg)
و با زدن دکمه ی insert هم عکست میره تو فولدر image هم آدرست تو بانک ذخیره میشه .... و واسه نمایش هم راحتر می تونی عمل کنی
من یه مقاله واسه چاپ عکس از بانک در grid view (البته تحت وب) نوشتم ، که می تونی اونو از آدرس زیر در یافت کنید
http://blog.poyesh.ir/?do=cat&category=learns-asp.net
امید وارم بدرتون خورده باشه

M.Soroor
چهارشنبه 01 اسفند 1386, 17:32 عصر
ممنونم جناب khz-web1
اما من یک آموزش برای VB.NET میخواهم

دوستان لطفآ اگه امکان داره روش ذخیره کردن آدرس فایل و لود کردن فایل از آدرس آون رو آموزش بدید
ممنون میشم

visual_sadegh
پنج شنبه 02 اسفند 1386, 08:52 صبح
سلام
امید وارم این به کارت بیاد و این تاپیک حل بشه:عصبانی++:

M.Soroor
پنج شنبه 02 اسفند 1386, 17:22 عصر
تشکر از همه دوستان مخصوصآ جناب visual_sadegh زحمت کشیدید دست همتون درد نکنه