PDA

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



barman.ar16
سه شنبه 08 آبان 1397, 22:09 عصر
سلام دوستان
برنامه رو سی شارپی و یا ویندوز فرم نوشتم ... برای چاپ هم از استیمول سافت استفاده کردم
توی چاپ کاربرگ مشخصات فردی برای اولین بار دارم از عکس هم استفاده می کنم
برای ارسال عکس توی استیمول یک variable از نوع ایمیج تعریف کردم و اون رو درون ایمیج باکس قرار دادم و از کد زیر برای ارسال عکس استفاده کردم

report.Dictionary.Variables["Image"].ValueObject = Image.FromFile(Application.StartupPath + @"\pic\st" + codemelli + ".jpg");


عکس ها کنار برنامه توی پوشه خودش و با نام کد ملی هر شخص ذخیره شدند
خب با این روش مشکلی نیست و عکس نمایش داده میشه اما من چاپ کاربرگ هام به صورت تجمعی هست و بدین صورت عمل کردم که هر چند تا که بوسیله چک باکس درون دیتاگریدویو تیک میخورند ارسال میشن به چاپ
بنابراین از این کد استفاده کردم :

StiReport report = new StiReport();
report.LoadEncryptedReport(Application.StartupPath + @"\rep\stkar.mrx", "1234");
DataTable dt = new DataTable();
dt.Columns.Add("melli");
dt.Columns.Add("name");
dt.Columns.Add("family");
for (var i = 0; i < rgv.RowCount; i++)
{

if (!Convert.ToBoolean(rgv.Rows[i].Cells[0].Value)) continue;
report.Dictionary.Variables["Image"].ValueObject = Image.FromFile(Application.StartupPath + @"\pic\st" + rgv.ChildRows[i].Cells[1].Value.ToString() + ".jpg");
dt.Rows.Add(rgv.ChildRows[i].Cells[1].Value,
rgv.ChildRows[i].Cells[2].Value,
rgv.ChildRows[i].Cells[3].Value);
}
report.RegData("DataSource1", dt);
report.Reset();
report.Show();


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

ممنون میشم راهنمایی کنید

Mahmoud.Afrad
سه شنبه 08 آبان 1397, 22:56 عصر
به جای variable ، به DataSource1 و همچنین دیتاتیبل یک ستون از نوع image اضافه کنید. عکسها را هم به دیتاتیبل اضافه و به گزارش ارسال کنید.

barman.ar16
چهارشنبه 09 آبان 1397, 00:29 صبح
به جای variable ، به DataSource1 و همچنین دیتاتیبل یک ستون از نوع image اضافه کنید. عکسها را هم به دیتاتیبل اضافه و به گزارش ارسال کنید.

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

dt.Columns.Add("image", typeof(System.Drawing.Image));

اگر نوع مشخص نشه کار نمی کنه
این رو گفتم شاید به درد فرد دیگه ای هم بخوره
باز هم ممنون و متشکرم

barman.ar16
چهارشنبه 09 آبان 1397, 00:40 صبح
یه سوال دیگه ...
الان که تست گرفتم متاسفانه یه خطای دیگه دارم اون هم اینکه اگر بین اون هایی که تیک میخورند موردی باشه که عکس نداشته باشه باعث میشه اکسپشن بده و چاپ داده نشه
چطوری میشه این رو مدیریت کرد که مثلا اگر عکسی موجود نبود اتفاقی نیفته یعنی بدون عکس چاپ بشه ... اگر هم بشه یه عکس پیشفرض داد بابت اون هایی که عکس ندارند که عالی میشه
کد نهایی ام اینطوری شد :

StiReport report = new StiReport();
report.LoadEncryptedReport(Application.StartupPath + @"\rep\stkar.mrx", "1234");
DataTable dt = new DataTable();
dt.Columns.Add("melli");
dt.Columns.Add("name");
dt.Columns.Add("family");
dt.Columns.Add("image", typeof(System.Drawing.Image));
for (var i = 0; i < rgv.RowCount; i++)
{
if (!Convert.ToBoolean(rgv.Rows[i].Cells[0].Value)) continue;
dt.Rows.Add(rgv.ChildRows[i].Cells[1].Value,
rgv.ChildRows[i].Cells[2].Value,
rgv.ChildRows[i].Cells[3].Value,
Image.FromFile(Application.StartupPath + @"\pic\st" + rgv.ChildRows[i].Cells[1].Value + ".jpg"));
}
report.RegData("DataSource1", dt);
report.Reset();
report.Show();


ممنون

Mahmoud.Afrad
چهارشنبه 09 آبان 1397, 02:46 صبح
یه سوال دیگه ...
الان که تست گرفتم متاسفانه یه خطای دیگه دارم اون هم اینکه اگر بین اون هایی که تیک میخورند موردی باشه که عکس نداشته باشه باعث میشه اکسپشن بده و چاپ داده نشه
چطوری میشه این رو مدیریت کرد که مثلا اگر عکسی موجود نبود اتفاقی نیفته یعنی بدون عکس چاپ بشه ... اگر هم بشه یه عکس پیشفرض داد بابت اون هایی که عکس ندارند که عالی میشه
کد نهایی ام اینطوری شد :

StiReport report = new StiReport();
report.LoadEncryptedReport(Application.StartupPath + @"\rep\stkar.mrx", "1234");
DataTable dt = new DataTable();
dt.Columns.Add("melli");
dt.Columns.Add("name");
dt.Columns.Add("family");
dt.Columns.Add("image", typeof(System.Drawing.Image));
for (var i = 0; i < rgv.RowCount; i++)
{
if (!Convert.ToBoolean(rgv.Rows[i].Cells[0].Value)) continue;
dt.Rows.Add(rgv.ChildRows[i].Cells[1].Value,
rgv.ChildRows[i].Cells[2].Value,
rgv.ChildRows[i].Cells[3].Value,
Image.FromFile(Application.StartupPath + @"\pic\st" + rgv.ChildRows[i].Cells[1].Value + ".jpg"));
}
report.RegData("DataSource1", dt);
report.Reset();
report.Show();


ممنون

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

رامین مرادی
چهارشنبه 09 آبان 1397, 08:26 صبح
یه سوال دیگه ...
الان که تست گرفتم متاسفانه یه خطای دیگه دارم اون هم اینکه اگر بین اون هایی که تیک میخورند موردی باشه که عکس نداشته باشه باعث میشه اکسپشن بده و چاپ داده نشه
چطوری میشه این رو مدیریت کرد که مثلا اگر عکسی موجود نبود اتفاقی نیفته یعنی بدون عکس چاپ بشه ... اگر هم بشه یه عکس پیشفرض داد بابت اون هایی که عکس ندارند که عالی میشه
کد نهایی ام اینطوری شد :

StiReport report = new StiReport();
report.LoadEncryptedReport(Application.StartupPath + @"\rep\stkar.mrx", "1234");
DataTable dt = new DataTable();
dt.Columns.Add("melli");
dt.Columns.Add("name");
dt.Columns.Add("family");
dt.Columns.Add("image", typeof(System.Drawing.Image));
for (var i = 0; i < rgv.RowCount; i++)
{
if (!Convert.ToBoolean(rgv.Rows[i].Cells[0].Value)) continue;
dt.Rows.Add(rgv.ChildRows[i].Cells[1].Value,
rgv.ChildRows[i].Cells[2].Value,
rgv.ChildRows[i].Cells[3].Value,
Image.FromFile(Application.StartupPath + @"\pic\st" + rgv.ChildRows[i].Cells[1].Value + ".jpg"));
}
report.RegData("DataSource1", dt);
report.Reset();
report.Show();


ممنون

طبق فرموده استادمون مهندس افراد



StiReport report = new StiReport();
report.LoadEncryptedReport(Application.StartupPath + @"\rep\stkar.mrx", "1234");
DataTable dt = new DataTable();
dt.Columns.Add("melli");
dt.Columns.Add("name");
dt.Columns.Add("family");
dt.Columns.Add("image", typeof(System.Drawing.Image));
for (var i = 0; i < rgv.RowCount; i++)
{
string imagepath = Application.StartupPath + @"\pic\st" + rgv.ChildRows[i].Cells[1].Value + ".jpg";
if (!File.Exists(imagepath))
{
imagepath = "آدرس عکس پیشفرض";
}
if (!Convert.ToBoolean(rgv.Rows[i].Cells[0].Value)) continue;
dt.Rows.Add(rgv.ChildRows[i].Cells[1].Value,
rgv.ChildRows[i].Cells[2].Value,
rgv.ChildRows[i].Cells[3].Value,
Image.FromFile(imagepath));
}
report.RegData("DataSource1", dt);
report.Reset();
report.Show();




دوست عزیز یه پیشنهادی هم بهتون بدم چون یه بار سر خودم اومده و کلی کار رو دستم گذاشت گفتم به شمام بگم. بجای استفاده از ایندکس ستون ها از اسمشون استفاده کنید. درصورت تغییر ترتیب ستونها باید ایندکسون رو تو کد نویسی تغییر بدید ولی اگه از اسمشون استفاده کنید اونهارو صرفا بر اساس اسماشون استفاده میکنید و نیازی به خاطر سپردن موقعیتشون نداری.
rgv.Rows[i].Cells[0].Value
رو مثلا به این صورت
rgv.Rows[i].Cells["IsSelected"].Value

shahryari
چهارشنبه 09 آبان 1397, 17:23 عصر
سلام
سه خط کد آخر رو به شکل زیر تغییر بده
report.RegData("DataSource1", dt);
//report.Reset();
report.Render();
report.Show(true);
report.ResetRenderedState();

barman.ar16
پنج شنبه 10 آبان 1397, 20:38 عصر
سلام
سه خط کد آخر رو به شکل زیر تغییر بده
report.RegData("DataSource1", dt);
//report.Reset();
report.Render();
report.Show(true);
report.ResetRenderedState();

سلام
ممنون بابت راهنمایی ... علت رو هم میفرمایید
منظورم اینه که بابت سوالی که من پرسیدم هست یا یک تجربه کاری ...؟؟؟