PDA

View Full Version : مرج کردن ردیف های دیتاگرید



salehsam
چهارشنبه 29 آبان 1392, 13:54 عصر
سلام دوستان
من میخوام اطلاعات دیتاگرید ویو این شکلی نشون داده بشه
از این کد استفاده کردم ولی یک دوره که چند تا مربی رو داره توی چند ردیف نشون میده!
113052
ممنون میشم کمکم کنین

rahnema1
چهارشنبه 29 آبان 1392, 20:50 عصر
می توانید اسمها رو بصورت کاما جدا از هم در یک فیلد نمایش بدید
به این آدرسها مراجعه کنید:
https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-microsoft-sql-server-2005

http://stackoverflow.com/questions/1817985/how-do-i-create-a-comma-separated-list-using-a-sql-query

salehsam
پنج شنبه 30 آبان 1392, 10:47 صبح
ممنون
من با این کد دیتاگرید رو پر میکنم (EF)


var q = from p1 in db.tbl_dore
join p2 in db.tbl_dore_teacher on p1.dore_id equals p2.fk_dore into list1
from l1 in list1.DefaultIfEmpty()
join p3 in db.tbl_teacher on l1.fk_teacher equals p3.teacher_id into list2
from l2 in list2.DefaultIfEmpty()

select new {p1.dore_code,p1.dore_startdate,l2.teacher_fullnam e} ;


dgv_dore.DataSource = q.ToList();

نمیدونم چجوری باید تغییرش بدم!:افسرده:
ممنونم میشم کمکم کنین

hamid_hr
پنج شنبه 30 آبان 1392, 12:02 عصر
تو دستورات SqlServer يه For Xml داريم كه ميشه اين كار رو كرد
ولي با ef نميدونم

salehsam
پنج شنبه 30 آبان 1392, 12:33 عصر
ممکنه نمونه کد sql رو بذارین تا روش فکر کنم؟
ممنون

hamid_hr
پنج شنبه 30 آبان 1392, 12:41 عصر
select Name, Family,
(select PersonalTel.Tel + ': ' from PersonalTel where PersonalTel.ID = Personal.Id for XML path(''))
from Personal

نتيجه

داوود اسماعیل زاده 000000000: 11111111:
هادی خوشبین 333333333: 2222222222:

mahdi101
پنج شنبه 30 آبان 1392, 14:01 عصر
دوست عزیز به این تاپیک برو و نرم افزاری رو که آقای khokhan آخرهای تاپیک گذاشتن دانلود کن.همه چیزش کامل و بدون تقصه...
http://barnamenevis.org/showthread.php?406816-%D8%B3%D8%AA%D9%88%D9%86-%D8%B1%D8%AF%DB%8C%D9%81-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AA%D8%A7%DA%AF%D8%B1%DB%8C%D8%AF%D 9%88%DB%8C%D9%88&highlight=%D8%AF%DB%8C%D8%AA%D8%A7%DA%AF%D8%B1%DB% 8C%D8%AF%D9%88%DB%8C%D9%88 (http://barnamenevis.org/showthread.php?406816-%D8%B3%D8%AA%D9%88%D9%86-%D8%B1%D8%AF%DB%8C%D9%81-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AA%D8%A7%DA%AF%D8%B1%DB%8C%D8%AF%D 9%88%DB%8C%D9%88&highlight=%D8%AF%DB%8C%D8%AA%D8%A7%DA%AF%D8%B1%DB% 8C%D8%AF%D9%88%DB%8C%D9%88)

khokhan
پنج شنبه 30 آبان 1392, 14:06 عصر
ممکنه نمونه کد sql رو بذارین تا روش فکر کنم؟
ممنون
اگه به توصیه من در اون تاپیک قبلی توجه می کردی الان مشکلت حل شده بود :لبخند:

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


var q = (from p1 in db.tbl_teacher
join p2 in db.tbl_dore on p1.teacher_id equals p2.fk_teacher into list1
from l1 in list1.DefaultIfEmpty()
join p3 in db.tbl_dore_teacher on l1.dore_code equals p3.fk_dore into list2
from l2 in list2.DefaultIfEmpty()

select new
{

p1.teacher_fullname,
p1.teacher_id,
l1.dore_startdate,
l2.teacher_degree
});
var dg = (from pp2 in q
group pp2 by pp2.teacher_fullname into g
select new { Dept = g.Key, teachercode = g.Min(f => f.teacher_id), dore_start = g.Min(k => k.dore_startdate), teacherdegree = g.Min(p => p.teacher_degree) });
dataGridView2.DataSource = dg.ToList();

113078

salehsam
پنج شنبه 30 آبان 1392, 14:29 عصر
ممنون خوخان جان
تو تاپیک قبلی (لینک (http://barnamenevis.org/showthread.php?428020-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%AC%D8%AF%D9%88%D9%84-%D9%88%D8%A7%D8%B3%D8%B7%D9%87-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AA%D8%A7%DA%AF%D8%B1%DB%8C%D8%AF)) توضیح دادم که نمیشه؟!
این روشی هم که الان فرمودین طبق تصویری که ضمیمه کردین فقط یکی از ردیف ها رو نشون میده!
ولی من میخوام هر چند تا مربی دوره رو در مقابل دوره بیاره!
به شکل توجه کنین
113080

khokhan
پنج شنبه 30 آبان 1392, 14:34 عصر
ممنون خوخان جان
تو تاپیک قبلی (لینک (http://barnamenevis.org/showthread.php?428020-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%AC%D8%AF%D9%88%D9%84-%D9%88%D8%A7%D8%B3%D8%B7%D9%87-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AA%D8%A7%DA%AF%D8%B1%DB%8C%D8%AF)) توضیح دادم که نمیشه؟!
این روشی هم که الان فرمودین طبق تصویری که ضمیمه کردین فقط یکی از ردیف ها رو نشون میده!
ولی من میخوام هر چند تا مربی دوره رو در مقابل دوره بیاره!
به شکل توجه کنین
113080
عزیز :لبخند: من گروه بندی رو براساس نام دبیر انجام دادم

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

salehsam
پنج شنبه 30 آبان 1392, 14:50 عصر
ممنون
طبق توصیه شما کد رو این شکلی نوشتم ( نمیدونم درست نوشتم یا نه!)
ولی فقط یه مربی رو میاره!


var q = (from p1 in db.tbl_dore
join p2 in db.tbl_dore_teacher on p1.dore_id equals p2.fk_dore into list1
from l1 in list1.DefaultIfEmpty()
join p3 in db.tbl_teacher on l1.fk_teacher equals p3.teacher_id into list2
from l2 in list2.DefaultIfEmpty()
select new {p1.dore_id, p1.dore_code,p1.dore_startdate,l2.teacher_fullname }) ;
var dg = (from pp2 in q
group pp2 by pp2.dore_id into g
select new { Dept = g.Key, teachercode = g.Min(f => f.teacher_fullname), dore_start = g.Min(k => k.dore_startdate) });

dgv_dore.DataSource = q.ToList();


113081

khokhan
پنج شنبه 30 آبان 1392, 15:30 عصر
ممنون
طبق توصیه شما کد رو این شکلی نوشتم ( نمیدونم درست نوشتم یا نه!)
ولی فقط یه مربی رو میاره!


var q = (from p1 in db.tbl_dore
join p2 in db.tbl_dore_teacher on p1.dore_id equals p2.fk_dore into list1
from l1 in list1.DefaultIfEmpty()
join p3 in db.tbl_teacher on l1.fk_teacher equals p3.teacher_id into list2
from l2 in list2.DefaultIfEmpty()
select new {p1.dore_id, p1.dore_code,p1.dore_startdate,l2.teacher_fullname }) ;
var dg = (from pp2 in q
group pp2 by pp2.dore_id into g
select new { Dept = g.Key, teachercode = g.Min(f => f.teacher_fullname), dore_start = g.Min(k => k.dore_startdate) });

dgv_dore.DataSource = q.ToList();


113081

روش دیگه اینه که کوئری رو به صورت crosstab اجرا کنی در این روش بایستی کد دوره هاتون مشخص باشه و یا اینکه با یه متد به صورت دینامیک کد ها رو خود برنامه شناسایی کنه

اینطوری :

private void button3_Click(object sender, EventArgs e)
{
var q = (from p1 in db.tbl_teacher
join p2 in db.tbl_dore on p1.teacher_id equals p2.fk_teacher into list1
from l1 in list1.DefaultIfEmpty()
join p3 in db.tbl_dore_teacher on l1.dore_code equals p3.fk_dore into list2
from l2 in list2.DefaultIfEmpty()

select new
{

p1.teacher_fullname,
p1.teacher_id,
l1.dore_startdate,
l1.dore_code,
l2.teacher_degree
});



var list = from table in q
group table by table.dore_code into g
select new
{
pid = g.Key,
teacher1 = g.Where(w => w.dore_code == g.Key && w.teacher_id == 4001).Select(s => s.teacher_fullname).FirstOrDefault(),
teacher2 = g.Where(w => w.dore_code == g.Key && w.teacher_id == 6001).Select(s => s.teacher_fullname).FirstOrDefault(),
teacher3 = g.Where(w => w.dore_code == g.Key && w.teacher_id == 6008).Select(s => s.teacher_fullname).FirstOrDefault(),
};


dataGridView2.DataSource = list.ToList();

}

نتیجه کوئری :

113082

salehsam
پنج شنبه 30 آبان 1392, 15:56 عصر
ممنون
این کد درت کار میکنه ولی راه حل ساده تری هم بایدد داشته باشه؟
این برای وی بی هستش (لینک (http://social.msdn.microsoft.com/Forums/vstudio/en-US/aa07e9e1-d925-40e9-8e38-040396de5906/how-can-i-merge-cell-of-a-gridview-having-same-value-at-runtime-in-vbnet-?forum=vbgeneral))
برای سی شارپ؟