PDA

View Full Version : برنامه نويسي لايه اي و مشكل با ديتا گريد



myazdani
شنبه 25 تیر 1390, 19:30 عصر
سلام
دوستان من يه برنامه سه لايه اي نوشتم كه يه لايه داره رابط كاربري يه لايه براي مقدار دهي به اشيا يه لايه براي كار با داده براي هر لايه هم يه كلاس تعريف كردم
حالا مي خوام وقتي يه ركورد تو لايه كار با داده تو پايگاه داده ثبت شد گريد ويو لايه 1 يعني صفحه نمايش اونو نشون بده . يه متغير از نوع گريد ويو تعريف كردم و مقدار دهي كردم و به لايه 1 فرستادم و به درستي ركورد مورد نظر رو نشون ميده ولي مشكل اينه كه هدرهاي گريد ويو رو به صورت انگليسي كه تو پايگاه داده هست نشون ميده. براي حل اين معضل اومدم در زمان طراحي هدرها رو به صورت فارسي تعريف كردم ولي زمان اجرا وقتي ديتا سورس گريد ويو مقدار دهي ميشه دوباره تمام فيلدها رو به صورت انگليسي در كنار فيلدهاي فارسي من تعريف ميكنه و ركورد جديد رو زير ستونهاي انگليسي نشون ميده.

كدي كه براي مقدار دهي به ديتا گريد ويو لايه 1 نوشتم اينه


dataGridView1.DataSource = DGV.DataSource;

و DGV متغيري از نوع كلاس گريد ويو هست كه در لايه كار با داده مقدار دهي شده و به لايه دوم و سپس لايه اول ارسال شده هست
اينم شكل گريد ويو
72520

قبلا از راهنمايي همه بزرگواران متشكرم

ya30ien2
شنبه 25 تیر 1390, 20:04 عصر
داداش اصلا شما نباید جدول رو بصورت فارسی طراحی کنید
میتونید در دستوراتی که میخواید جدول نمایش داده بشه بهش بگید بصورت فارسی نمایش بده
این کد رو نگاه کن ببین کارت رو راه میندازه

Select id AS [ID] ,name AS [NAME] , lastname AS [LASTNAME] from student
داداش id مقدار جدول و ID نمایشی هست حالا اگه بازم متوجه نشدی بیشتر توضیح بدم

ya30ien2
شنبه 25 تیر 1390, 20:06 عصر
البته اگه من درست متوجه شده باشم اگه هم نه که من بیشتر از این سر در نمیارم

myazdani
شنبه 25 تیر 1390, 20:13 عصر
داداش اصلا شما نباید جدول رو بصورت فارسی طراحی کنید
میتونید در دستوراتی که میخواید جدول نمایش داده بشه بهش بگید بصورت فارسی نمایش بده
این کد رو نگاه کن ببین کارت رو راه میندازه

داداش id مقدار جدول و ID نمایشی هست حالا اگه بازم متوجه نشدی بیشتر توضیح بدم


عزيز جدول انگليسي هست مي خوام هدر گريد ويو فارسي باشه حالت عادي كه هدر رو انگليسي نشون ميده فارسي هم كه طراحي مي كنم خودش مياد ستونها رو به صورت انگليسي اضافه ميكنه
به هر حال از جوابتون ممنونم

ya30ien2
شنبه 25 تیر 1390, 20:41 عصر
دوست عزیز من هم منظورم همین بود و دقیقا جواب هم همین هستش
و شما به جای id میتونید نام ردیف مورد نظر در جدولتون رو بنویسید و به جای ID میتونید نام نمایشی رو بنویسید مثلا ردیف و ...

myazdani
شنبه 25 تیر 1390, 21:01 عصر
دوست عزیز من هم منظورم همین بود و دقیقا جواب هم همین هستش
و شما به جای id میتونید نام ردیف مورد نظر در جدولتون رو بنویسید و به جای ID میتونید نام نمایشی رو بنویسید مثلا ردیف و ...

حق با شماست ولي چون من مي خوام آخرين ركورد اضافه شده رو از پايگاه داده بازيابي كنم ناچارم از اين دستور استفاده كنم

Str = "SELECT TOP 1 * FROM Staff ORDER BY DossierNumber DESC";


و اين فرمتي كه شما مي فرماييد نمي دونم تو اين شكل دستور چطوري قابل استفاده هست.
به هر تقدير از پاسخگويي سريعتان ممنونم

ya30ien2
شنبه 25 تیر 1390, 21:14 عصر
نگاه کن select top 1 id as .........

gwbasic
شنبه 25 تیر 1390, 21:20 عصر
مشخصه که معماریه سه لایه رو اصلا متوجه نشدید داده باید از لایه Data Acess به لایه UI فرستاده بشه. این اشتباه محض که کنترل در لایه Data Access ساخته بشه و به لایه فرستاه بشه باید البته باز یه مسئله دیگه اینه که شما DataGridView رو ساختید و بعد DataSource رو پاس کردید خب ساخت DataGridView بی مورده
کافیه دادتون رو از لایه DataAccess به صورت فرضا یک DataTable (که البته به کلی با Dt مخوالفم ) به لایه UI پاس کنید و در لایه UI مقدار DataSource مربوط به DataGridView رو با این مقدار ست کنید
در ضمن نکته مهم برای فارسی کردن ستون ها اینه که شما باید ستون های دلخواهتون رو از طریق Designer مربوط به Visual Studio به این صورت بسازید که برای هر ستون یک پراپرتی به نام HeaderText وجود داره که نام فارسی ستونو ست کنید و یک پراپرتی به نام DataPropertyName وجود دارد که نام فیلد مربوط به DataTable رو که باید در این ستون نمایش داده بشه ، مشخص کنید

myazdani
شنبه 25 تیر 1390, 21:45 عصر
مشخصه که معماریه سه لایه رو اصلا متوجه نشدید داده باید از لایه Data Acess به لایه UI فرستاده بشه. این اشتباه محض که کنترل در لایه Data Access ساخته بشه و به لایه فرستاه بشه باید البته باز یه مسئله دیگه اینه که شما DataGridView رو ساختید و بعد DataSource رو پاس کردید خب ساخت DataGridView بی مورده
کافیه دادتون رو از لایه DataAccess به صورت فرضا یک DataTable (که البته به کلی با Dt مخوالفم ) به لایه UI پاس کنید و در لایه UI مقدار DataSource مربوط به DataGridView رو با این مقدار ست کنید
در ضمن نکته مهم برای فارسی کردن ستون ها اینه که شما باید ستون های دلخواهتون رو از طریق Designer مربوط به Visual Studio به این صورت بسازید که برای هر ستون یک پراپرتی به نام HeaderText وجود داره که نام فارسی ستونو ست کنید و یک پراپرتی به نام DataPropertyName وجود دارد که نام فیلد مربوط به DataTable رو که باید در این ستون نمایش داده بشه ، مشخص کنید

از پاسختون ممنونم
حق با شماست . اولين باره كه با معماري لايه اي برنامه مي نويسم و قطعا مفاهيم اون رو به اون خوبي كه شما ميدونيد نمي دونم ولي من تحويل پروژه دارم و استادمون مصره كه به هيچ وجه لايه اينترفيس نبايد با لايه كار با داده ارتباط
مستقيم داشته باشه و من ناچار شدم بدون تحقيق كافي در اين زمينه برنامه مو طبق نظر استادم بنويسم و من نميدونم عقيده ايشون درسته يا اينكه بايد داده ها مستقيم از لايه كار با داده به لايه اينترفيس فرستاده بشه .

اما در مورد ديتا گريدي كه تو لايه كار با داده نوشتم كدم اينه

Str = "SELECT TOP 1 * FROM Staff ORDER BY DossierNumber DESC";
DataTable dt = new DataTable();
SqlDataAdapter sda = new SqlDataAdapter(Str, con);
SqlCommandBuilder c = new SqlCommandBuilder(sda);
sda.Fill(dt);
DataGridView DGVD = new DataGridView();
BindingSource bs = new BindingSource();
bs.DataSource = dt;
DGVD.DataSource = bs;
return DGVD;


اومدم كل گريد ويو رو با همه خصوصياتش پاس كردم نه خصوصيت ديتا سورسش رو. اين DGVD به لايه دوم ميره و با همين روش به لايه اينترفيس منتقل ميشه!!

اگه منظورتون از designer همون پنجره هوشمند هست اينكارو انجام دادم و همونطور كه تو پست اولم توضيح دادم با توجه به روشي كه به كار بردم براي مقدار دهي ديتا سورس هدرهام زمان اجرا انگليسي ميشه .

به هر حال از راهنمايي جميع دوستان عزيزم نهايت سپاسگزاري رو دارم.

mina_ghorbani
یک شنبه 26 تیر 1390, 00:51 صبح
سلام
اول لایه Data Access و بعد Business Logic رو بساز بعد در UI دیتا گرید ویو رو درست کن فارسی برای اضافه کردن به گرید هم مثل این کد می شه
BLL لایه Business هست در لایه BL از DataAccess استفاده می شه و فقط DA با بانک کار می کنه در لایه های دیگه کاری با بانک نداریم هم چنین BL,DA نباید جیزی از لایه UI داشته باشن مثل MessageBox یا مثلا GridView
ببخشید که این کد نا مرتبه




try

{


BLL_Employee.EmployeeManager EM = new BLL_Employee.EmployeeManager();
Common.

Employee[] objEmp = EM.FetchByLastName("%" + txtSearch.Text + "%");



if (objEmp.Length > 1)

{

SearchState();



int j = 0;



while (j <= objEmp.Length - 1)

{

dataGridView1.Rows.Add(objEmp[j].EmployeeID, objEmp[j].FirstName, objEmp[j].LastName, objEmp[j].BirthDate, objEmp[j].Jensiat, objEmp[j].Rasmi, objEmp[j].Din);

j++;

}

}



else

{

CompeleteControls(objEmp[0]);

}

gwbasic
یک شنبه 26 تیر 1390, 06:50 صبح
توضیحات منو معلومه اصلا متوجه نشدی! خواهشا ایندفه دقت کن
شما فقط تو لایه UI یک DataGridView داری که باید توسط داده هات پر بشه. خوب ، تو رویداد Form_Load باید اینکارو انجام بدی. فقط کافیه متد مربوط رو از لایه DataAccess صدا بزنی (البته این وسط می تونه شش تا لایه بیزینسی هم باشه که به اون کاری ندارم مطمعنم که بلدی) اون متد مثل همون کدی که دادی هست فقط باجای DGVD باید همان dt رو برگردونه.
حالا به هر زحمتی هست یک DataTable یعنی dt تو لایه UI دارای بریم سراغ پر کردن DataGridView
اگه DataSource مربوط به DataGridView رو برابر این dt قرار بدی چون DVG یک پراپرتی به نام AutoGenerateColumns داره که به طور پیش فرض true هست به اضای هر ستون از dt یک ستون در DVG درست می کنه و هدر اون رو نام ستون می ذاره که شما می خواین فارسی باشه البته اونقدر هوشمند هست که اگه تو Designer خودت ستونی متناظر با یکی از ستون های dt تعریف کرده باشی همونطور که پست قیلی گفتم دیگه اونو اضافه نمی کنه
بطور خلاصه اینکارو باید بکنی

DataTable UIDT = GetDataFromOtherLayer();
dataGridView1.AutoGenerateColumns = false;
dataGridView1.DataSource = dt;

AutoGenerateColumns رو برای این false کردم که اگه چیزی تو DGV نمایش داده نشد بدونی که درست ستونهاتو تو Designer بایند نکردی و باید اونو درست کنی وگرنه نیازی نبود
دیگه باید مشکلت حل بشه DGV بین لایه ها پاس نکنی که عصبانی می شم :لبخند:
در ضمن خوشم میاد که از همه چیم اطلاع داری ولی فقط نمی تونی درست استفاده کنی اون BindingSource بیچاره چیه که تعریف کردی اونم مربوط به لایه UI هست ولی نمی خواد خودتو درگیر اون بکنی
اگه خواستی دقیق یا دگیریش یه تاپیکی در مورد DataBinding تو همین سایت زدم که اونجا کامل توضیح دادم

myazdani
یک شنبه 26 تیر 1390, 08:56 صبح
توضیحات منو معلومه اصلا متوجه نشدی! خواهشا ایندفه دقت کن
شما فقط تو لایه UI یک DataGridView داری که باید توسط داده هات پر بشه. خوب ، تو رویداد Form_Load باید اینکارو انجام بدی. فقط کافیه متد مربوط رو از لایه DataAccess صدا بزنی (البته این وسط می تونه شش تا لایه بیزینسی هم باشه که به اون کاری ندارم مطمعنم که بلدی) اون متد مثل همون کدی که دادی هست فقط باجای DGVD باید همان dt رو برگردونه.
حالا به هر زحمتی هست یک DataTable یعنی dt تو لایه UI دارای بریم سراغ پر کردن DataGridView
اگه DataSource مربوط به DataGridView رو برابر این dt قرار بدی چون DVG یک پراپرتی به نام AutoGenerateColumns داره که به طور پیش فرض true هست به اضای هر ستون از dt یک ستون در DVG درست می کنه و هدر اون رو نام ستون می ذاره که شما می خواین فارسی باشه البته اونقدر هوشمند هست که اگه تو Designer خودت ستونی متناظر با یکی از ستون های dt تعریف کرده باشی همونطور که پست قیلی گفتم دیگه اونو اضافه نمی کنه
بطور خلاصه اینکارو باید بکنی

DataTable UIDT = GetDataFromOtherLayer();
dataGridView1.AutoGenerateColumns = false;
dataGridView1.DataSource = dt;

AutoGenerateColumns رو برای این false کردم که اگه چیزی تو DGV نمایش داده نشد بدونی که درست ستونهاتو تو Designer بایند نکردی و باید اونو درست کنی وگرنه نیازی نبود
دیگه باید مشکلت حل بشه DGV بین لایه ها پاس نکنی که عصبانی می شم :لبخند:
در ضمن خوشم میاد که از همه چیم اطلاع داری ولی فقط نمی تونی درست استفاده کنی اون BindingSource بیچاره چیه که تعریف کردی اونم مربوط به لایه UI هست ولی نمی خواد خودتو درگیر اون بکنی
اگه خواستی دقیق یا دگیریش یه تاپیکی در مورد DataBinding تو همین سایت زدم که اونجا کامل توضیح دادم


دوست عزيز مشكلم با راه حل شما حل شد. عصباني نشيد! ديگه ديتا گريد ويو رو پاس ندادم!:خجالت:
يك دنيا ممنون.