PDA

View Full Version : سوال: ارسال اطلاعات به چاپ با چک باکس dataGridView به صورت تفکیک شده



barman.ar16
جمعه 11 آبان 1397, 14:03 عصر
سلام دوستان
من توی برنامه سی شارپی ام از گریدویو تلریک استفاده می کنم و برای چاپ هم از استیمول سافت

یک جدول دارم با این وضعیت :
149197

خب همانطور که مشخصه بعضی از کد ملی ها تکراری هستند
من در واقع میخوام برای هر فرد یک کاغذ A5 به عنوان کاربرگ غیبت فردی چاپ بگیرم
این روش رو انجام دادم و مشکلی نیست
1- ابتدا میام به صورت group by بر اساس کد ملی اطلاعات رو توی یک دیتاگریدویو نمایش میدم
2- وقتی کاربر روی یک ردیف دوبار کلیک می کنه اون کد ملی رو میگیرم و یک بار دیگه یک دیتاتیبل میسازم و اطلاعات رو از جدول میخونم این بار بدون group by و با شرط کد ملی = ؟؟؟ که کد ملی رو از سلول اول میگیرم
3- اطلاعات دیتاتیبل رو میفرستم برای استیمول و تمام

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

بنابراین از چک باکس درون دیتاگریدویو استفاده میکنیم .. خب الان نمیدونم چطوری اون ردیف هایی که تیک خوردند رو بگیرم و بفرستم برای یک دیتاتیبل و از همه مهم تره اگر هم موفق شدم دیتاتیبل رو بسازم خب چطوری این ها رو به صورت تفکیک شده برای هر فرد بفرستم برای چاپ
ممنون میشم اگر راهی به ذهن تون میرسه کمک کنید

در ضمن اینطوری خواستم دیتاتیبل بسازم اما نشد :

for (var i = 0; i < rgv.RowCount; i++)
{
if (!Convert.ToBoolean(rgv.Rows[i].Cells[0].Value)) continue;
SQLiteConnection con = new SQLiteConnection(con);
SQLiteCommand cmd = new SQLiteCommand("SELECT * FROM student where melli like '" + rgv.ChildRows[i].Cells["melli"].Value + "'", con);
SQLiteDataAdapter ad = new SQLiteDataAdapter(cmd);
DataSet ds = new DataSet();
ad.Fill(ds, "student");
}


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

Mahmoud.Afrad
شنبه 12 آبان 1397, 04:43 صبح
در حلقه فقط کدهای ملی تیک خورده را بدست بیارید. بعد از حلقه توسط یک کوئری با شرط مناسب اطلاعات را بدست آورده و به گزارش ارسال کنید.
http://www.sqlitetutorial.net/sqlite-in
در گزارش هم ابزارهایی هست که میتونید گروهبندی کنید.

barman.ar16
شنبه 12 آبان 1397, 11:53 صبح
در حلقه فقط کدهای ملی تیک خورده را بدست بیارید. بعد از حلقه توسط یک کوئری با شرط مناسب اطلاعات را بدست آورده و به گزارش ارسال کنید.
http://www.sqlitetutorial.net/sqlite-in
در گزارش هم ابزارهایی هست که میتونید گروهبندی کنید.

ممنون
پس منظورتون اینه که من اول یه حلقه بزنم و کد ملی های تیک خورده رو بدست بیارم و بعد اون رو بریزم توی لیست و برای نوشتن کوئری اونجایی که میخوام شرط بنویسم کد ملی رو مساوی لیست قرار بدم
مثلا :
select * from table where melli = "' + list + '"
از اون لینکی که دادید تقریبا اینطوری متوجه شدم ...
ممنون میشم اگر اشتباه فهمیدم بیشتر راهنمایی کنید
به قولی اول من بتونم این مشکل رو حل کنم تا در نهایت دیتاتیبل رو درست کنم نهایتا گروه بندی رو سمت گزارش حل می کنم

Mahmoud.Afrad
شنبه 12 آبان 1397, 21:22 عصر
باید از کلمه کلیدی IN در شرط استفاده کنید. کدهای ملی را هم به طریقی به هم ملحق کنید.
"select * from table where melli IN (" + string.Join(",", list) + ")"

barman.ar16
دوشنبه 14 آبان 1397, 22:20 عصر
ممنون استاد افراد
با کلی ور رفتن بالاخره حل شد کد نهایی ام اینطوری شد :

List<string> list = new List<string>();
for (var i = 0; i < rgv.RowCount; i++)
{
if (!Convert.ToBoolean(rgv.Rows[i].Cells[0].Value)) continue;
list.Add(rgv.ChildRows[i].Cells["melli"].Value.ToString());
string ids = string.Join(",", list.Select(x => x.ToString()).ToArray());
string query = string.Format("SELECT * FROM table WHERE melli in ({0})", ids);
}


خب همه چبز اوکی کار میکنه در خصوص چاپ هم از قابلیت group استفاده کردم و شرط رو گذاشتم روی کد ملی که بر اساس کد ملی اطلاعات دسته بندی میشه
اما هنوز یه مشکل دیگه دارم وقتی ردیفی تیک میخوره اگر کد ملی ثبت شده اش بدون صفر شروع بشه هیچ مشکلی نیست و هر چند تا هم باشند اطلاعات به درستی کش میشن اما اگر کد ملی با صفر شروع بشه اطلاعات رو نمیخونه در صورتی که من همه رو از نوع استرینگ گرفتم (نوع ستون در جدول نوع لیست و ... همه از نوع استرینگ هستند)نمیدونم اشکال کار کجاست
ممنون مبشم راهنمایی بفرمایید

Mahmoud.Afrad
دوشنبه 14 آبان 1397, 22:43 عصر
ممنون استاد افراد
با کلی ور رفتن بالاخره حل شد کد نهایی ام اینطوری شد :

List<string> list = new List<string>();
for (var i = 0; i < rgv.RowCount; i++)
{
if (!Convert.ToBoolean(rgv.Rows[i].Cells[0].Value)) continue;
list.Add(rgv.ChildRows[i].Cells["melli"].Value.ToString());
string ids = string.Join(",", list.Select(x => x.ToString()).ToArray());
string query = string.Format("SELECT * FROM table WHERE melli in ({0})", ids);
}


خب همه چبز اوکی کار میکنه در خصوص چاپ هم از قابلیت group استفاده کردم و شرط رو گذاشتم روی کد ملی که بر اساس کد ملی اطلاعات دسته بندی میشه
اما هنوز یه مشکل دیگه دارم وقتی ردیفی تیک میخوره اگر کد ملی ثبت شده اش بدون صفر شروع بشه هیچ مشکلی نیست و هر چند تا هم باشند اطلاعات به درستی کش میشن اما اگر کد ملی با صفر شروع بشه اطلاعات رو نمیخونه در صورتی که من همه رو از نوع استرینگ گرفتم (نوع ستون در جدول نوع لیست و ... همه از نوع استرینگ هستند)نمیدونم اشکال کار کجاست
ممنون مبشم راهنمایی بفرمایید

خط 6 و 7 را از حلقه خارج کنید.
breakpoint بزارید و محتوای query را چک و با محتوای جدول مقایسه کنید ببینید مشکل کجاست.
ستون کدملی دقیقا نوععش چیه؟.

barman.ar16
سه شنبه 15 آبان 1397, 01:46 صبح
خط 6 و 7 را از حلقه خارج کنید.
breakpoint بزارید و محتوای query را چک و با محتوای جدول مقایسه کنید ببینید مشکل کجاست.
ستون کدملی دقیقا نوععش چیه؟.

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

Mahmoud.Afrad
سه شنبه 15 آبان 1397, 02:20 صبح
به صورت زیر اصلاح کنید.
string ids = string.Join(",", list.Select(x => "'" + x + "'"));