PDA

View Full Version : مبتدی: مشکل در بازیابی تصاویر باینری و نمایش در datagridview



mohammad5593
چهارشنبه 08 آبان 1392, 07:04 صبح
با سلام خدمت اساتید گرامی
بنده در پروژه 2تا گرید ویو داریم که تصاویر متناظر با گرید1 در گرید2 ذخیره می شود
در هنگام اجرای پروژه تصاویر در گرید 2 به نمایش در می آید و با کلیک بر روی آنها عکس در PictureBox ظاهر میشه
ولی به محض کلیک روی گرید 1 اطلاعات در گرید2 تغییر می کند اما عکس با مشکل مواجه می شود
لطفا راهنمایی کنید
112370
112369

اینم کد استفاده شده
var pp = from p in db.photos
where p.fId == Convert.ToInt32(dataGridView1.CurrentRow.Cells["id"].Value)
select p;

dataGridView2.DataSource = pp;

mohammad5593
چهارشنبه 08 آبان 1392, 17:59 عصر
لطفا راهنمایی کنید احتیاج دارم

shehneh
چهارشنبه 08 آبان 1392, 18:26 عصر
این مشکل من هم است لطفا راهنمایی کنید

khokhan
چهارشنبه 08 آبان 1392, 19:43 عصر
لطفا راهنمایی کنید احتیاج دارم
اطلاعات رو از دوتا جدول فراخوانی می کنید ؟؟؟؟؟؟؟؟؟؟/

mohammad5593
چهارشنبه 08 آبان 1392, 19:43 عصر
بزارید کمی بیشتر توضیح بدم شاید یکی دلش سوخت و کمک کرد
بانک LINQ to SQL
پروژه قراره بخشنامه و ها و تصویر نامه های اداری را داخل خودش ذخیره کنه با قابلیت ذخیره سریع و دسترسی سریع به مطلب مورد نظر. به جای گشتن دنبال یک کاغذ داخل کلی فایل و...

دیتا سورس گرید2 را بایند کردم به جدول عکسها . موقع لود برنامه عکسها را درست نشون میده اما به محض کلیک روی گرید1 با کد نویسی گفتم که عکسهای متناظر را در گرید2 نشون بده عکس ها را نمایش نمیده

دقیقا مشکل در تبدیل Array به Image است.
لطفا راهنمایی کنید . هنگ کردم

mohammad5593
چهارشنبه 08 آبان 1392, 20:12 عصر
اطلاعات رو از دوتا جدول فراخوانی می کنید ؟؟؟؟؟؟؟؟؟؟/

سلام بر استاد خودم
بله از دوتا جدول یکی zirna که اطلاعات را ذخیره میکنه
و یکی دیگه photos که طبق id جدول اول تصاویر را ذخیره میکنه

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

mohammad5593
چهارشنبه 08 آبان 1392, 20:23 عصر
اطلاعات در گرید2 طبق کد زیر برقرار میشه اما ستون عکس با ایراد مواجه میشه

112392

var pp = from p in db.photos
where p.fId == Convert.ToInt32(dataGridView1.CurrentRow.Cells["id"].Value)
select p;

dataGridView2.DataSource = pp;

khokhan
چهارشنبه 08 آبان 1392, 21:00 عصر
اطلاعات در گرید2 طبق کد زیر برقرار میشه اما ستون عکس با ایراد مواجه میشه



var pp = from p in db.photos
where p.fId == Convert.ToInt32(dataGridView1.CurrentRow.Cells["id"].Value)
select p;

dataGridView2.DataSource = pp;

.................................................. .................................................. ..:لبخند:
فایل دیتابیس داخل پوشه DB می باشد یه کپی در پوشه debug و یه کپی در پوشهاصلی کنار سایر فایلها قرار دهید و بعد اجرا کنید
112394

shehneh
چهارشنبه 08 آبان 1392, 21:19 عصر
سپاس بابت فایل راهنما
حالا لطفا بفرمائید چطوری میشه عکس داخل گرید 2 را با کلیک بر روی هر سطر در یک PictureBox نمایش داد

mohammad5593
پنج شنبه 09 آبان 1392, 06:25 صبح
تمام تغییرات را سعی کردم مو به مو در برنامه خودم اجرا کنم اما همه چیز درست انجام میشه الا نمایش عکس در گرید2
در واقع عکس را به صورت یک سلول خالی نشان می دهد.
لطفا راهنمایی کنید
112399

khokhan
پنج شنبه 09 آبان 1392, 10:29 صبح
تمام تغییرات را سعی کردم مو به مو در برنامه خودم اجرا کنم اما همه چیز درست انجام میشه الا نمایش عکس در گرید2
در واقع عکس را به صورت یک سلول خالی نشان می دهد.
لطفا راهنمایی کنید
112399
همه کارات درسته الی "فوت کوزه گری " :لبخند::چشمک:

برروی فیلد عکس در داخل مدل linq واز قسمت پراپرتی ، نوع فیلد رو از Binary (System.Data.Linq.Binary) ، به نوع byte[] (System.Byte[]) تغییر بده

112403


112404

mohammad5593
پنج شنبه 09 آبان 1392, 14:01 عصر
دست شما درد نکنه داشتم کم کم کل پروژه را به فایل راهنمای شما منتقل می کردم .:افسرده:
نجاتم دادید ممنون از لطف شما:لبخند: واقعا فوت کوزه گری بود:تشویق:

حالا لطفا بفرمائید چطوری میشه با کلیک روی گرید2 عکس مربوطه را توی یک Picturebox نمایش داد. سوال دوستمون shehneh هم همین بود.

mohammad5593
پنج شنبه 09 آبان 1392, 14:12 عصر
یک تکست باکس برای جستجو به برنامه اضافه کردم ولی وقتی جستجو انجام شد دیگه با کلیک روی گرید 1 چیزی توی گرید2 نمایش نمیده؟؟؟؟
112406
اینم کدشه
var db = new DataClasses1DataContext();
var qsearch1 = db.zirnas.Where(c => c.fname.Contains(toolStrip_Search.Text) ||
c.family.Contains(toolStrip_Search.Text));

if (qsearch1.Count() == 0)
{
//MessageBox.Show("Record yaft nashod");
toolStrip_Search.BackColor = Color.Yellow;
toolStrip_Search.ForeColor = Color.OrangeRed;
//toolStrip_Search.Font.Bold = true;
}
else
{
toolStrip_Search.BackColor = Color.GreenYellow;
toolStrip_Search.ForeColor = Color.Black;
dataGridView1.DataSource = qsearch1;
}

if (toolStrip_Search.Text == "")
{
toolStrip_Search.BackColor = Color.White;
}

khokhan
پنج شنبه 09 آبان 1392, 16:17 عصر
دست شما درد نکنه داشتم کم کم کل پروژه را به فایل راهنمای شما منتقل می کردم .:افسرده:
نجاتم دادید ممنون از لطف شما:لبخند: واقعا فوت کوزه گری بود:تشویق:

حالا لطفا بفرمائید چطوری میشه با کلیک روی گرید2 عکس مربوطه را توی یک Picturebox نمایش داد. سوال دوستمون shehneh هم همین بود.
برای نمایش تصویر ردیف انتخابی از گرید در پیکچر باکس به این نحو عمل گردد :لبخند:
در رویداد SelectionChanged گرید 1 این تغییرات رو اعمال کنید تا یه ستون ردیف توی گرید 2 ایجاد شود :


private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
try
{

var q = from dbpic in db.Table1s
where dbpic.c_code.Equals(int.Parse(dataGridView1.Curren tRow.Cells[0].Value.ToString()))
select new
{
d0=dbpic.id,
d1 = dbpic.c_code,
d2 = dbpic.photo

};

dataGridView2.DataSource = q;
}
catch
{
}
}
حالا دذ رویداد CellClick گرید 2 بنویسین :

private void dataGridView2_CellClick(object sender, DataGridViewCellEventArgs e)
{

var query = from p in db.Table1s
where p.id.Equals(int.Parse(dataGridView2.CurrentRow.Cel ls[0].Value.ToString()))
select p;

foreach (var s in query)
{
Image bmp = null;
byte[] buf = (byte[])(s.photo).ToArray();
bmp = Image.FromStream(new MemoryStream(buf));
pictureBox1.Image = bmp;
}




}


.................................................. ...:لبخند:

mohammad5593
پنج شنبه 09 آبان 1392, 23:28 عصر
دست شما استاد گرامی درد نکنه
لطفا بفر مائید چطوری میشه عکس داخل گرید2 را به صورت Stretch یعنی متناسب با طول و عرض گرید2 سایز عکس کشیده شود
در حال حاضر تصویر به صورت Zoom به نمایش در میاد.
با توجه به اینکه بنده نمی خواهم سایز طول و عرض عکس را فیلتر کنم و کاربر مجاز به درج هرنوع عکسی با هر سایزی در دیتابیس باشه
112422

khokhan
جمعه 10 آبان 1392, 12:48 عصر
دست شما استاد گرامی درد نکنه
لطفا بفر مائید چطوری میشه عکس داخل گرید2 را به صورت Stretch یعنی متناسب با طول و عرض گرید2 سایز عکس کشیده شود
در حال حاضر تصویر به صورت Zoom به نمایش در میاد.
با توجه به اینکه بنده نمی خواهم سایز طول و عرض عکس را فیلتر کنم و کاربر مجاز به درج هرنوع عکسی با هر سایزی در دیتابیس باشه
112422
کارهای زیادی می شه در این زمینه انجام داد از جمله این که ستون مربوط به تصاویر رو هنگام بایند کردن اطلاعات دیز ایبل کنید و یه ستون تصویر از طریق کد نیویسی اضافه کنید و فیلد مربوط به تصاویر رو به این ستون اختصاص دهید :


imageColumn = new DataGridViewImageColumn();
imageColumn.Width = 100;
dataGridView1.Columns.Add(imageColumn);
ویا اینطوری :



private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{

DataGridViewImageCell cell = (dataGridView1.Rows[e.RowIndex].Cells[2] as DataGridViewImageCell);
Bitmap bmp = (Bitmap) cell.Value;
bmp = (Bitmap) bmp.GetThumbnailImage(200, 300, null, IntPtr.Zero);
dataGridView1.Rows[e.RowIndex].Cells[0].Value = bmp;
}

بعد از طریق این کد می تونید نحوه نمایش تصویر در این ستونی که از طریق کد نویسی ایجاد کرده اید رو ست کنید :

for(int i = 0; i < dataGridView1.Columns.Count; i ++)
if(dataGridView1.Columns[i] is DataGridViewImageColumn) {
((DataGridViewImageColumn)dataGridView1.Columns[i]).ImageLayout = DataGridViewImageCellLayout.Stretch;
break;
}

mohammad5593
شنبه 11 آبان 1392, 00:36 صبح
ممنون مثال سومی کارم را راه انداخت. خدا خیرت بده
من یک ستون به جدول اصلی اضافه کردم به نام توضیحات. ولی نمی خواهم توی گریدویو نمایش داده بشه
حالا لطفا بفرمائید چطوری میشه با کلیک بر روی گرید1 محتویات آن فیلد توضیحات طبق سطر انتخاب شده در یک تکست باکس درج بشه:متفکر:

khokhan
شنبه 11 آبان 1392, 01:28 صبح
ممنون مثال سومی کارم را راه انداخت. خدا خیرت بده
من یک ستون به جدول اصلی اضافه کردم به نام توضیحات. ولی نمی خواهم توی گریدویو نمایش داده بشه
حالا لطفا بفرمائید چطوری میشه با کلیک بر روی گرید1 محتویات آن فیلد توضیحات طبق سطر انتخاب شده در یک تکست باکس درج بشه:متفکر:
کد بایند کردن تکست باکس رو در رویداد CellClick گرید بنویس و آیدی گزینه مورد نظر رو برابر ستون آی دی سطر انتخاب شده قرار بده

اینطوری:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
int ID = int.Parse(dataGridView1.CurrentRow.Cells[0].Value.ToString());
var myquery = from myrow in db.zirnas
where myrow.id==ID
select new { family = myrow.family};

foreach (var valuesFromQuery in myquery)
{

textBox2.Text = valuesFromQuery.family;

}
}