PDA

View Full Version : حرفه ای: نمایش عکس در datagridview بر اساس شرط خاص در سی شارپ



حسین.کاظمی
دوشنبه 22 شهریور 1395, 09:59 صبح
سلام به همگی
من میخام توی گرید ویویی که اطلاعات را از بانک میگیره یه ستونش مثلا بجای 0 یه عکس نشون بده و بجای 1 یه عکس دیگه کسی هست کمکم کنه؟
ممنون

mr.sirwan
دوشنبه 22 شهریور 1395, 12:09 عصر
ابتدا ستونت رو از نوع DataGridViewImageColumn قرار بده، حالا بیا داخل سازنده فرم این کد رو بنویس:(توضیحشم کامنت کردم)

/// برای اینکه ستون تصویرت، در صورتیکه هیچ تصویری بهش ندادی، تصویر ضربدر که پیش فرض هست رو نشون نده
((DataGridViewImageColumn)this.DataGridView1.Colum ns["اسم یا اندیس ستونت"]).DefaultCellStyle.NullValue = null;


حالا اصل کاری یعنی نمایش تصویر رو هر جایی که خودت خواستی بذار:


if (0)
{
DataGridViewImageCell imageCell = DataGridView1.Rows[i].Cells[اندیس ستون] as DataGridViewImageCell;
imageCell.Value = (Image)مسیر فایلت، حالا میتونی تصویر رو داخل ریسورس ها بذاریش;
}
else
{
DataGridViewImageCell imageCell = DataGridView1.Rows[i].Cells[اندیس ستون] as DataGridViewImageCell;
imageCell.Value = (Image)مسیر فایلت، حالا میتونی تصویر رو داخل ریسورس ها بذاریش;
}

حسین.کاظمی
دوشنبه 22 شهریور 1395, 13:03 عصر
سلام
ممنون از راهنماییتون
منظورت از i چیه؟

کجا تعریف شده یا کجا تعریفش کنم؟
DataGridView1.Rows[i]

mr.sirwan
دوشنبه 22 شهریور 1395, 13:05 عصر
سلام
ممنون از راهنماییتون
منظورت از i چیه؟

کجا تعریف شده یا کجا تعریفش کنم؟
DataGridView1.Rows[i]

یک حلقه For بذارین و به ازای هر سطر داخل دیتاگریدویو پیمایش رو انجام بدین

حسین.کاظمی
دوشنبه 22 شهریور 1395, 13:21 عصر
من اومدم توی یک تابع نوشتمش


private void read_type()
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if (dataGridView1.Columns[3].ValueType.Equals('0'))
{
DataGridViewImageCell imageCell = dataGridView1.Rows[i].Cells[3] as DataGridViewImageCell;
imageCell.Value = imageList1.Images[0];
}
else
{
DataGridViewImageCell imageCell = dataGridView1.Rows[i].Cells[3] as DataGridViewImageCell;
imageCell.Value = imageList1.Images[1];
}
}
}

بعد توی رویداد load فرم اینجوری نوشتم ولی اجرا نمی کنه و خطای not refrence object میده



active(@"SELECT KodPersonel AS[کد پرسنلی], Name_Per AS[نام], Family_Per AS[فامیلی], Vaziat AS[وضعیت]
FROM tbl_info_personel");
read_type();

mr.sirwan
دوشنبه 22 شهریور 1395, 13:26 عصر
شرطتون اشتباهه باید اینجوری شرط رو چک کنین:

if(dgv.rows[i].cells[3].value.tostring() == "0")
{}
else
{}

اما پیشنهاد میکنم که این مقادیر رو داخل یک لیست یا دیتاتیبل قرار بدین و چک کنین، منظورم مقدار ستون سوم هر سطر هستش. این روش هم کار میکنه مشکلی نیس

حسین.کاظمی
جمعه 06 اسفند 1395, 10:51 صبح
باسلام

من کد زیر را که با کمک دوستمون mr.sirwan (http://barnamenevis.org/member.php?369257-mr-sirwan) نوشتم درویژوال 2012 جواب میده ولی در ویژوال 2015 جواب نمیده مشکل از چی میتونه باشه؟؟

کد:


private void read_type()
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if (dataGridView1.Rows[i].Cells[15].Value.ToString() == "0")
{
DataGridViewImageCell imageCell = dataGridView1.Rows[i].Cells[0] as DataGridViewImageCell;
imageCell.Value = (Image)SGP.Properties.Resources.Shape63;
}
else if (dataGridView1.Rows[i].Cells[15].Value.ToString() == "1")
{
DataGridViewImageCell imageCell = dataGridView1.Rows[i].Cells[0] as DataGridViewImageCell;
imageCell.Value = (Image)SGP.Properties.Resources.Check_01;
}
else if(dataGridView1.Rows[i].Cells[15].Value.ToString()== "2")
{
DataGridViewImageCell imageCell = dataGridView1.Rows[i].Cells[0] as DataGridViewImageCell;
imageCell.Value = (Image)SGP.Properties.Resources.Cancel;
}
}
}

mr.sirwan
جمعه 06 اسفند 1395, 10:56 صبح
سلام
مشکل چیه؟ مورد انتظار کار نمیکنه؟ ارور میده؟ یا .... لطفا بیشتر توضیح بدین

حسین.کاظمی
جمعه 06 اسفند 1395, 11:02 صبح
توی ستون عکسی که درست کردم عکس مورد نظر را نشون نمیده همون ضربدر قرمز پیش فرض را نشون میده

mr.sirwan
جمعه 06 اسفند 1395, 11:07 صبح
احیانا توی جدولتون جای ستون هارو عوض نکردین؟ حالا توی دیتابیس یا دیتاست و....
چون این مشکل به نسخه ویژوال برنمیگرده

حسین.کاظمی
جمعه 06 اسفند 1395, 11:24 صبح
شمارش فیلدهام از بانک اطلاعاتی (شروع از صفر) اون فیلد مورد نظرم 13میشه.
ولی در دیتا گریدمم دوتا ستون اول را از نوع عکس گذاشتم که میشه در واقع همون فیلد مورد نظرم میشه سلول 15.کد بالا را هم بنظر میرسه درست باشه ولی عکس را نمیاره.....:گریه:

حسین.کاظمی
جمعه 06 اسفند 1395, 12:38 عصر
بعد از شطرها اومدم یک مسیج باکس گذاشتم بشکل زیر


MessageBox.Show(dataGridView1.Rows[i] + "-" + dataGridView1.Rows[i].Cells[2].Value.ToString());

کدهای تابع تا مسیج باکس هست کار میکنه مثل عکس زیر ولی بعد از اتمام آخرین سطر دیتا گرید، همشون پاک میشند و عکس ضربدر قرمز پیش فرض نشون داده میشه...دیونه ام کرده



144565

mr.sirwan
جمعه 06 اسفند 1395, 12:57 عصر
پس کد ست کردن تصویر درست کار میکنه، کداتون رو دقیقا بعد از اتمام این عملیات بذارین تا بهتر راهنمایی کنیم

ویرایش 1:
موقعی که با تیم ویور وصل شدم و کداتونو نگاه انداختم، یادمه یه جا dgv.columns.clear یا rows.clear یا یه همچین چیزی رو فراخوانی کرده بودین، که کامنتش کردم، احتمالا بازم یه جایی همچین دستوری رو نوشتین چک کنین

حسین.کاظمی
جمعه 06 اسفند 1395, 12:59 عصر
این کل کدهام و بعد در رویداد لوود فرم تابع را فراخوانی میکنم



private void read_type()
{

DataTable dtt = new DataTable();
dtt = db.dataTableSelect(@"SELECT statuss FROM tbl_TazakorKatbi");
dataGridView1.DataSource = dtt;
for (int i = 0; i < dtt.Rows.Count; i++)
{
if (dataGridView1.Rows[i].Cells[2].Value.ToString() == "0")
{
DataGridViewImageCell imageCell = dataGridView1.Rows[i].Cells[0] as DataGridViewImageCell;
imageCell.Value = (Image)SGP.Properties.Resources.Shape63;

}
else if (dataGridView1.Rows[i].Cells[2].Value.ToString() == "1")
{
DataGridViewImageCell imageCell = dataGridView1.Rows[i].Cells[0] as DataGridViewImageCell;
imageCell.Value = (Image)SGP.Properties.Resources.Check_01;
}
//else if (dataGridView1.Rows[i].Cells[2].Value.ToString() == "2")
//{
// DataGridViewImageCell imageCell = dataGridView1.Rows[i].Cells[0] as DataGridViewImageCell;
// imageCell.Value = (Image)SGP.Properties.Resources.Cancel;
//}
MessageBox.Show(dataGridView1.Rows[i] + "-" + dataGridView1.Rows[i].Cells[2].Value.ToString());

}

}

حسین.کاظمی
جمعه 06 اسفند 1395, 13:16 عصر
پس کد ست کردن تصویر درست کار میکنه، کداتون رو دقیقا بعد از اتمام این عملیات بذارین تا بهتر راهنمایی کنیم

ویرایش 1:
موقعی که با تیم ویور وصل شدم و کداتونو نگاه انداختم، یادمه یه جا dgv.columns.clear یا rows.clear یا یه همچین چیزی رو فراخوانی کرده بودین، که کامنتش کردم، احتمالا بازم یه جایی همچین دستوری رو نوشتین چک کنین

نه دوست عزیز ، از اون موقع دیگه اون کد را نمی نویسم....
آخه جالبه با مسیج باکس که رکورد به رکورد را میره جلو عکس هم نشون میده ولی بدون مسیج باکس اصلا کار نمیده:متفکر:

Mahmoud.Afrad
جمعه 06 اسفند 1395, 19:04 عصر
روی مسیج باکس breakpoint بزارید با f11 تریس کنید ببینید چه اتفاقی میافته.

حسین.کاظمی
یک شنبه 08 اسفند 1395, 14:29 عصر
باسلام
من با کمک دوست خوبم آقای
mr.sirwan (http://barnamenevis.org/member.php?369257-mr-sirwan) که واقعا زحمت کشیدند تلاش کردیم به یسری از مشکلاتی مثل API ایی که من توی پروژه ام استفاده کرده بودم برخوردیم و حلش کردیم ولی مشکل از چندتا کد خیلی خیلی ساده است و نمیدونم باید چکارش کنم که درست بشه......

من ی فرم دارم که درونش 2تا پنل گزاشتم یکی بعنوان منو و پنل دوم خالی است برای اینکه فرم فراخوانی شده درون این پنل با کدهای زیر نمایش داده بشه...


this.cursor=cursors.waitcursor;
lbl_title.text = btn_law.tex;
p_content.visible =false;
frmtazakor tazakor=new frmtazakor();
tazakor.formborderstyle= formborderstyle.none;
tazakor.dock=dockstyle.fill;
tazakor.toplevel =false;
p_content.controls.clear();
p_contrentc.controls.add(tazakor);
tazakor.show();
this.cursor=cursors.deffault;




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

*بریک پوینت بروی tazakor.show(); گذاشتم که به خطای زیر برخورد.

144589144589




{

for (int i = 0; i < dataGridView1.Rows.Count; i++)

{

if (dataGridView1.Rows[i].Cells[15].Value.ToString() == "0")

{

DataGridViewImageCell imageCell = dataGridView1.Rows[i].Cells[0] as DataGridViewImageCell;

imageCell.Value = (Image)SGP.Properties.Resources.Shape63;

}

else if (dataGridView1.Rows[i].Cells[15].Value.ToString() == "1")

{

DataGridViewImageCell imageCell = dataGridView1.Rows[i].Cells[0] as DataGridViewImageCell;

imageCell.Value = (Image)SGP.Properties.Resources.Check_01;

}

else if(dataGridView1.Rows[i].Cells[15].Value.ToString()== "2")

{

DataGridViewImageCell imageCell = dataGridView1.Rows[i].Cells[0] as DataGridViewImageCell;

imageCell.Value = (Image)SGP.Properties.Resources.Cancel;

}

}

}



حالا زمانی که فرم تذکر را درون پنل باز میکنم این تابع کار نمیکنه (یعنی ستونی که عکس است را نشون نمیده همون عکس ضربدر قرزم رنگ-پیش فرض نشون میده )ولی وقتی فرم تذکر را خارج از پنل باز می کنم کدها بدون مشکل کار میکنه و ستون عکس هم براساس مقادیر فیلد مورد نظرم عکس مورد نظر را نشون میده......

کسی میدونه مشکل از چیه؟؟؟؟

حسین.کاظمی
دوشنبه 09 اسفند 1395, 19:58 عصر
کسی نیست کمکم کنه؟؟؟؟