# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > C#‎‎ > گفتگو: سوال و جواب های ساخت پروژه ثبت سفارشات

## gwbasic

در این تاپیک می خوام با مشارکت شما دوستان مراحل ساخت یه پروژه ساده رو آموزش بدم:
https://barnamenevis.org/showthread.p...71#post1376271

از این تاپیک می تونید برای بحث و مطرح کردن سوال و گذاشتن کدهاتون استفاده کنید

----------


## electro_esma

با سلام خدمت استاد عزیز 

می خواستم بدونم این کدها باید با sql باشه یا با access هم می شه.

 ممنون

----------


## electro_esma

پس استاد چی شد . مامنتظریم ....

----------


## gwbasic

> با سلام خدمت استاد عزیز 
> 
> می خواستم بدونم این کدها باید با sql باشه یا با access هم می شه.
> 
>  ممنون


sql بهتره ولی هر طور راحت هستید مشکلی نداره




> سلام!
> میشه رابط کاربری برنامه رو با WPF طراحی کنیم؟ به خاطر بار علمی قضیه میگم.
> استفاده از Page Navigation و Resourceها به طور محسوس + Skinable کردن اون، چطوره؟
> بقیه دوستان میتونن خودشون رو وفق بدن یا همون WinForm خودمون بهتره؟


برای یادگیری اصول خیلی فرقی نمی کنه در ضمن wpf همه بلد نیستن

----------


## gwbasic

قرار دوستان تو این تاپیک کدهاشون رو بذارن تا بعد از بررسی کد نهایی رو توی تاپیک اصلی قرار می دم

----------


## shahrzad87

سلام
من پروژه رو با EntityFrameWork نوشتم، خوشحال می شم نظرتون رو بگین.

----------


## mmd2009

> سلام
> من پروژه رو با EntityFrameWork نوشتم، خوشحال می شم نظرتون رو بگین.


با سلام

با اجازه از مدیر تاپیک که نقش استاد این تاپیک رو دارن من هم یک نظری هر چند ناچیز میدم که امیدوارم به سطح علمی شما کمک بکنه

اگر از طریقه نام گزاری ها یا شیوه نوشتن برخی شرط ها صرفه نظر کنیم و این رو بذارم پای این که کد رو سریع نوشتید و خواستید خروجی بگیرید فقط یک ایراد میشه از کدتون گرفت اونم اینه فرضا شما کد زیر رو در نظر بگیرید :


 Customer Tcustomer = new Customer();
                Tcustomer.Id = Guid.NewGuid();
                Tcustomer.Name = txt_name.Text;
                Tcustomer.Family = txt_family.Text;


نظر شخصی من اینه که کد بالا از لحاظ اصول کد نویسی و خوانا بودن و ..... از روشی که من در زیر نوشتم خیلی ضعیفتره.


var tcustomer = new Customer
                {Id = Guid.NewGuid(), Name = txt_name.Text, Family = txt_family.Text};


به نظر من از این روش استفاده بکنید خیلی راحترید برای کد نویسی و هم اینکه کدتون اصولی تر میشه.

موفق باشید.

----------


## gwbasic

از Shahrzad87 صمیمانه تشکر می کنم که اولین کدو قرار داد، مرسی!!!
بابت نکته ای هم که mmd2009 عزیز (که همیشه لطفشون شامل حال بچه های سایت هست) اشاره کردن ممنونم. استقبال می کنم که بقیه دوستان هم به من کمک کنن. جناب mmd2009 اگه شما هم بتونید کدتون رو بذارید می تونه جنبه آموزشی خوبی داشته باشه ممنون می شم شما هم مشارکت کنین.
نکته ای رو که جناب mmd2009 اشاره کردن همون بحث object initializer هست که یکی از فیچر های سی شارپ ورژن 3 هست در کنار Linq. فقط در ادامه به این نکته می تونم اشاره کنم که این روش برای ساخت شی و مقداردهی اولیه دقیقا مثل حالتی هست که سازنده پیش فرض رو صدا می زنین یعنی اینکه در این حالت هم اول سازنده پیش فرض صدا زده می شه بعد کدهایی رو که در داخل آکولاد نوشته شده اجرا می شه. بنابراین با خیال راه می تونید جایگزین حالت قبل کنید. و همونطوری که اشاره کردن کد خواناتر خواهد بود البته این روش برای مقدار دهی محدودیت هایی داره که متاسفانه الان حضور ذهن ندارم.

بازهم تشکر میکنم. منتظر کدهای دوستانی که ابراز علاقه کردن هستم

----------


## wolf_majid

سلام
این یک قسمت از پروژه حسابداری منه که قبلا" نوشتم و الان دارم تصحیح و تکمیلش می کنم
البته تا حدی مربوط به این تاپیک میشه
ممنون میشم تستش کنید و نظرتون رو بگید

http://www.4shared.com/file/_BcjukXw/Customer_2.html

----------


## mmd2009

اول تشکر می کنم از دوست خوبمون اقای gwbasic که توضیحاتی که من در شیوه نوشتن کد ندادم رو نوشتن و کارو برای خواننده واضح کردن.


با اجازه در مورد کد های اقای wolf_majid یک نظری هم میدم امیدوارم کارایی براتون داشته باشه.

نکته مثبت اولی که دیدم نوشتن Comment بود برای کدهاتون که واقعا بعد از مدتا یک همچین چیزی دیدم تو این بخش و امیدوارم همیشه به این روش Comment گذاری بکنید

من چندتا نکته در مورد کدهاتون میگم که البته این نظر شخصی منه و ممکنه خیلی ها این رو پسند نکنند

برای شروع به کد زیر نگاه کنید :


    public string createCode()
        {
            DataTable dt = new DataTable();
            dt = dal.Select(findCode);
            if (dt.Rows[0][0].ToString().Trim() == string.Empty)
            {
                return "10001";
            }
            else
            {
                long lngNum = long.Parse(dt.Rows[0][0].ToString().Trim()) + 1;
                return ("1" + (lngNum).ToString("D4"));
            }
        }


ببینید فرضا این شرط زیر :


dt.Rows[0][0].ToString().Trim() == string.Empty


برقرار بود شما یک مقدار بازگشتی دارید خب حالا دیگه نیازی نیست شما از else استفاده بکنید چون اگر برگرده دیگه اصلا شرط بعد هر چی باشه یا هر کدی باشه اصلا دیگه خوانده نمیشه پس این کد رو بخ این صورت بنوسید خیلی بهتره :


    public string createCode()
        {
            DataTable dt = new DataTable();
            dt = dal.Select(findCode);
            if (dt.Rows[0][0].ToString().Trim() == string.Empty)
            {
                return "10001";
            }
            long lngNum = long.Parse(dt.Rows[0][0].ToString().Trim()) + 1;
            return ("1" + (lngNum).ToString("D4"));
        }


مقدار else در این جا یک مقدار زائد بود که من حذفش کردم.


حالا در همین متد کد زیر رو ببینید :


 DataTable dt = new DataTable();
            dt = dal.Select(findCode);


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


 DataTable dt = dal.Select(findCode);


یک نکته ی دیگه هم که من تو خیلی از سایت های خارجی میبینم این کد زیر رو که شما می نویسید :


  if (!manage.txtNull(_mytxtTell))
            {
                dgvShow.DataSource = Connect.filterWithTell(_mytxtTell.Text);
            }
            else
            {
                dgvShow.DataSource = Connect.selectAll_Farsi();
            }


رو به شکل عملگرهای :? می نویسن که واقعا هم از نظر کد نوسی به نظر من استفاده از این عملگر ها ساده هست و نیازی به نوشتن if و else نیست البته درسته که اونا هم شرط هستند ولی نوشتنش حداقل برای من خواناتره


  dgvShow.DataSource = !manage.txtNull(_mytxtTell) ? Connect.filterWithTell(_mytxtTell.Text) : Connect.selectAll_Farsi();


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

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

من هم همین برنامه رو به زودی می نویسم و میذارم و نظرات بقیه رو جویا میشم روی کدنویسی خودم که با هم بتونیم یک روش استاندارد تهیه بکنیم

موفق باشید.

----------


## wolf_majid

واقعا" که شاهکار نظر دادید  :تشویق: 
خیلی خیلی سپاسگذارم

----------


## mmd2009

@wolf_majid : خواهش می کنم دوست عزیز.  :چشمک: 

دوستان نشد زیاد رو برنامه کار کنم و مانور زیادی روش بدم . اگر کمی و کاستی بود ببخشید ولی در هر صورت خوش حال میشم نظری بدید در مورد شیوه کد نوشتن من

این اسکریپت بانک :


USE [EntitySampleDatabase]
GO
/****** Object:  Table [dbo].[Customer]    Script Date: 11/16/2011 14:31:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Customer](
    [IdCustomer] [bigint] NOT NULL,
    [Name] [nvarchar](30) NOT NULL,
    [Family] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED 
(
    [IdCustomer] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO



برنامه رو هم ضمیمه کردم

با تشکر

----------


## shahrzad87

> با سلام
> 
> با اجازه از مدیر تاپیک که نقش استاد این تاپیک رو دارن من هم یک نظری هر چند ناچیز میدم که امیدوارم به سطح علمی شما کمک بکنه
> 
> اگر از طریقه نام گزاری ها یا شیوه نوشتن برخی شرط ها صرفه نظر کنیم و این رو بذارم پای این که کد رو سریع نوشتید و خواستید خروجی بگیرید فقط یک ایراد میشه از کدتون گرفت اونم اینه فرضا شما کد زیر رو در نظر بگیرید :
> 
> 
>  Customer Tcustomer = new Customer();
>                 Tcustomer.Id = Guid.NewGuid();
> ...


من این کد رو توی 5 دقیقه نوشتم،  ساده نوشتم که برای دوستانی که با  EntityFrameWork آشنا نیستن راحت باشه و خواستم پروژه رو شروع کنم تا بقیه هم بیان و نظر و کدهاشون رو بذارن، روشی که گفته بودین جالب بود، ممنون که وقت گذاشتین و ایرادهای کد رو گفتین 
راستی پست مدیریت بخش رو هم بهتون تبریک می گم  :لبخند: 
به آقای جمشیدی هم تبریک می گم، :تشویق:   امیدوارم با کمک شما همه تو برنامه نویسی بیشتر پیشرفت کنیم و یاد بگیریم که اصولی و بهینه کدنویسی کنیم. :چشمک:

----------


## gwbasic

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

خوب بریم سراغ دوستانی که کد گذاشتن 
من فقط اینجا چند نکته رو برجسته می کنم تا بعد در ادامه بتونم ازش نتیجه گیری کنم.
اول شهرزاد خانم که زحمت کشید و اولین کد رو گذاشت.
1- برای هر عمل Insert یا update‌ ای یک objectContext ایجاد کردن و یک شی از مدل که همون Customer هست ساختن و مقادیر کنترل های فرم رو توی شی ریختن و شی رو به objectContext اضافه کردن و برای ذخیزه در database متد SaveChanges‌رو فراخوانی کردن و درنهایت datagrid‌رو update‌کردن و objectContext‌رو dispose کردن البته با استفاده از using این عمل بطور اتوماتیک انجام می شود.
2- اگر کاربر سطری از گرید رو انتخاب کرد مقادیرش داخل textBox ها نمایش داده می شود.
آقای mmd2009 هم تقریبا به همین شکل عمل کردن ولی خوب dataGridView توی فرمشون نداشتن.

حالا سوالی که مطرح هست اینه که مدلی که توی objectContext ما توسط Designer‌ساخته می شه یعنی همون customer فقط استفادش اینه که موقع ذخیره یا ویرایش مقداری توش ریخته بشه و این شی فقط واسطی برای ذخیره مقداری توی database هست؟
و اینکه آیا ما باید مستقیم با کنترل های فرم کار کنیم یا اینکه این مدل customer می تونه بیشتر به ما کمک کنه

برای اینکه جواب این سوال رو بگیرید توصیه می کنم به تاپیک زیر مراجعه کنید.
https://barnamenevis.org/showthread.p...-Data-Binding

در ادامه من کد پیشنهادیم رو با توضیحات بیشتر خواهم گذاشت

اما در مورد آقای wolf_majid هم باید به این نکته اشاره کنم که کدها خوب بودن اما چون از  EntityFramework استفاده نکردن خوب برای ارتباط با Database کدهای بسیار زیادی نوشتن که با وجود یه همچین ابزارهایی دیگه نیازی نیست به این شکل کد نویسی کرد. در مورد فرمتون کد زیادی نوشتین می شه اینا رو به طرق مختلف تقسیم بندی کرد تا کدی کمتری توی فرم اصلی قرار بگیره مثلا به عنوان مثال شما برای گرفتن عدد یا همون پول از یک textBox استفاده کردین که چند رویداد برای اون گذاشتین و اعداد رو به وسیله کاما سه رقم سه رقم جدا کردین. ممکنه توی فرمتون چند textBox داشته باشین که بخواین کاربر مقدار عددی (پول) وارد کنه اونوقت باید بازم این کدارو تکرار کنید. راه بهتر اینه که یه کنترل جدید می نوشتید که از textBox ارث ببره و این کدها رو یکبار و فقط توی این کنترل می نوشتید به این شکل دیگه هرجا لازم بود این کنترل رو جای textBox توی فرم می انداختین
فعلا تا اینجا رو از من قبول کنید تا زیاد از بحث خارج نشیم
خواهشی که دارم کدهاتون رو حتی الامکان کوتاه بنویسید تا بررسیش وقت کمتری بگیره!

----------


## wolf_majid

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


حق با شماست
اما همانطور که گفتم من این پروژه را قبلا" (بیش از یک سال پیش نوشتم) و الان قصد تصحیح و تکمیلش رو دارم
اون موقع هنوز با سایر سربارگذاریهای tostring آشنا نبودم

اما حتما" تصحیحشون می کنم
ممنون از پاسختون

----------


## haniyehghassami

ببخشید میشه مال منم یه نگاهی بندازید :خجالت:

----------


## ardeshir1365

سلام به همه
منم یه خورده کد زدم یه نیگاه بهش بندازین
فقط یه مشکل داره بار اول تو بانک ذخیره میکنه ولی برای داده بعدی که میخوای ذخیره کنی خطا میده و باید برنامه رو ببندی و از دوباره اجرا کنی
http://www.persiangig.com/pages/down...p/customer.rar

----------


## gwbasic

ببخشید که هنوز نتونستم آموزشی بذارم.
امروز داشتم ویدیویی آماده می کردم که متاسفانه هارد اصلیم مثل اینکه سوخت. فعلا که 1 ترابایت اطلاعاتم به فنا رفته نمی دونم باید چکار کنم. عذر منو بپذیرید.
دعا کنید درست شه!!!

----------


## haniyehghassami

> ببخشید که هنوز نتونستم آموزشی بذارم.
> امروز داشتم ویدیویی آماده می کردم که متاسفانه هارد اصلیم مثل اینکه سوخت. فعلا که 1 ترابایت اطلاعاتم به فنا رفته نمی دونم باید چکار کنم. عذر منو بپذیرید.
> دعا کنید درست شه!!!


 ایشالله درست میشه

هممون دعا میکنیم برگرده اطلاعاتتون

نگران نباشین :چشمک:   :لبخند:

----------


## haniyehghassami

> سلام به همه
> منم یه خورده کد زدم یه نیگاه بهش بندازین
> فقط یه مشکل داره بار اول تو بانک ذخیره میکنه ولی برای داده بعدی که میخوای ذخیره کنی خطا میده و باید برنامه رو ببندی و از دوباره اجرا کنی
> http://www.persiangig.com/pages/down...p/customer.rar


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

2 اینکه idدر دیتابیس باید از نوع unidentified  باشه و در قسمت کد نویسی اینجور مقدار بگیره تا یه کد منحصر به فرد شامل رقم و حروف درست بشه



id=Guid.new();
//برای تبدیل کردن به این نوع هم باید نوشت
id=(Guid) datagrid.rows(i).cells[0].value;


حالا اگه entity framework اشنا بشیم تمام این کدنویسی های زیادی تمام میشن

----------


## electro_esma

با تشکر از دوستان 

من تو این چند روز با دستورات ابتدایی oledb و  sql تونستم مرحله اول پروژه رو بنویسم ولی وقتی دیدم اساتید دارن از entity framework استفاده می کنن من روم 

نیومد برنامه ی ساده و پیش پا افتادمو رو کنم.

از جناب استاد *gwbasic* و کلیه استاتید خواهش می کنم که در خصوص یاد گیری مفهومی و عمقی  entity framework به بنده هم که تازه کار هستم کمک کنید.چ

ممنون از همه استاتید.

----------


## electro_esma

با سلام خدمت دوست عزیزم  haniyehghassami

شما می تونی راجع به  entity framework  یه منابعی چیزی معرفی کنی .

ممنون می شم. اگه خودت هم تونستی توضیح بدی که ممنون

----------


## haniyehghassami

> با سلام خدمت دوست عزیزم  haniyehghassami
> 
> شما می تونی راجع به  entity framework  یه منابعی چیزی معرفی کنی .
> 
> ممنون می شم. اگه خودت هم تونستی توضیح بدی که ممنون


ممنون اما استاد این بخش یعنی اقای gwbasic قرار هست اموزش entity framework را در تاپیک جدا که ادرسش را توی اولین پست می تونین پیدا کنین، قرار بدن :چشمک: 

موفق و پیروز باشین

----------


## haniyehghassami

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

جا داره از کسانیکه پروژه هاشون گذاشتن تشکر کنم..........................

من منتظر پروژه های شما دوستان هستم،هرجور که نوشته باشین خوبه فقط قصد اینه که شیوه صحیح کدینگ را همه یاد بگیرند

پس یا علی :لبخند:

----------


## electro_esma

با تشکر از دوست عزیزم haniyehghassami 

ممنون که این قدر مشتاق و پیگیر هستی .

و از استاد هم جناب آقایgwbasic  در خواست دارم تا سریعتر آموزش entity رو شروع کنه؟

فقط یه سوال هر چی دوستان کد گذاشتون با vs 2010  بوده یعنی با 2008 نمی شه entity کار کرد. اگه جواب مثبته چند نمونه مثال واسم بذارین . 

ممنون می شم.

----------


## mmd2009

> با تشکر از دوست عزیزم haniyehghassami 
> 
> ممنون که این قدر مشتاق و پیگیر هستی .
> 
> و از استاد هم جناب آقایgwbasic  در خواست دارم تا سریعتر آموزش entity رو شروع کنه؟
> 
> فقط یه سوال هر چی دوستان کد گذاشتون با vs 2010  بوده یعنی با 2008 نمی شه entity کار کرد. اگه جواب مثبته چند نمونه مثال واسم بذارین . 
> 
> ممنون می شم.


entity در 2008 کامل نبود و مایکروساف درسال 2010 اون رو کامل کرد. دلایلش دقیقا یادم نیست.

موفق باشید

----------


## haniyehghassami

و اینکه یاذتون باشه entity تنها در DonNet framework 4 فابل اچرا هستش

----------


## haniyehghassami

بفرمایید
اگر بتونم جواب میذم بهتون حتما

----------


## mmd2009

> و اینکه یاذتون باشه entity تنها در DonNet framework 4 فابل اچرا هستش


دوست عزیز در نسخه 3.5 هم وجود داشت entity 


این عکس زیر هم ببینید کاملا متوجه میشید :

Untitled.png

موفق باشید

----------


## noroozifar

سلام این روش کد نویسی منه  تو این برنامه فقط درج را نوشته ام و بر اساس 3  لایه  حالا نمیدونم درست کار کرده ام یا نه  اسکریپ بانک را هم گذاشتم   اسکریپ همنام با بانکه   توی تعریف ای دی تا حالا از این نوع استفاده نکرده  ام نمیدونستم به چه طریق استفاده کنم uniqueidentifier

نظرااتونو منتظرم ببینم

فایل
http://s2.picofile.com/file/71877017...eshat.exe.html

----------


## haniyehghassami

سلام

فاز اول به صورت فیلم اموزشی اماده شده

هوراااااااااااااااااااااا  ااااااااااااااااااااا  :بامزه:   :لبخند گشاده!: 

برید بگریدش و ببینید و سوالاتتون اینجا مطرح کنید

ما منتظریم..............................

----------


## noroozifar

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

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

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

دستت درد نکنه

----------


## gwbasic

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

جناب Noroozifar کدتون رو دیدم خیلی خوب بود منتها چون به این روش نمی خوایم کار کنیم و از entityframework استفاده می کنیم بنابراین اجازه بدید من دبگه نظری ندم فقط خواهشی که ازتون دارم این کدتون رو در بخش پروژه های open source قرار بدین ٰدیدنش می تونه آموزنده باشه.
در مورد سه لایه یا بهتر بگم چند لایه اجازه بدید در فازهای بعدی صحبت کنیم
stroemodel همون فایل EDM ما هست که  کدهای مربوط به کار با entityframework اونجا تعریف شده تمام کلاسهای متناظر با جدوال دیتابیس و کلاسی که همه entity ها رو در بر داره و از objectContext مشتق می شه در این فایل تعریف میشه
اون مسئله ای هم که در فایل xml به طور دستی نوشتم هم مشکلی ایجاد نمی کنه مگر اینکه فایل توسط Designer‌دوباره تولید بشه که چون از بین می ره ما باید یادمون باشه که دوباره بنویسیم ( فرصت نکردم راه بهتری پیدا کنم)

در ضمن آموزشها به مرور آماده می شه و من چیزی الان آماده ندارم. لطفا صبر داشته باشین!

----------


## uniqueboy_ara

اگه تو فایل XML تغییری ندیم چه اتفاقی میفته؟؟؟
من تغییرش ندادم و در ظاهر هیچ اتفاقی نیفتاد و برنامه هم به درستی کار میکنه!

من خودم با معماری 3لایه و ADO.net کار میکنم، میخواستم بدونم آیا این روش (Entity Framework ) نسبت به ADO.net سرعت بیشتری داره؟؟؟

----------


## haniyehghassami

سلام
من فیلم اموزشی رو دیدم چندتا سوال داشتم :

1 - اگر بخواهیم محتویات یک تکی باکس را همزمان توی 2 تا جدول بریزیم باید چه جور عمل کنیم ؟

2 - اگر بخواهیم یک سری از اطلاعاتمون که مثلا توی تب اول ثبت که شد، اون ایدی  که جدید ایجاد شده را بخواهیم از جدول بگیریم که اطلاعات مربوط به جدول دوم را با همین ایدی که جدید ایجاد شده ثبت کنیم باید چه جوری عمل کنیم؟

3 - این کانکشن که ما ایجاد میکنیم از توی ویزارد ایا روی هر سیستمی به صورت محلی یا لوکال جواب میده؟(مثل وقتی که جای اسم سیستم نقطه میگداریم) اگه بخواهیم اونجوری کار کنیم کجای کدنویسی باید اسم سرور را به برنامه بدیم؟

4 - چرا context را در زمان بستن فرم dispose کردین؟ و چرا null کردین؟ فرقشون چیه؟ مگه dispose از بین نمیبردش؟ پس چرا باید هم dispose بشه هم null؟

5 - چرا تابع () context.SaveChange را مستقیم تو رویداد کلیک صدا نکردین؟ چه فرقی داره که توی متد جدا گذاشتین و متد را صدا زدین؟

ببخشیدا، من یک مبتدی هستم هنوز راه نیفتادم :لبخند گشاده!:

----------


## gwbasic

اگه من اشاره کردم که فعلا هر طوری که می تونید با database ‌ارتباط برقرار کنید برای اینکه دوستان نترسن و بتونن کدهاشون رو بذارن و همچنین با دیدن کدهای مختلف بتونیم تفاوت رو حس کنیم
درضمن در مورد آموزش EntityFramework و یا کلا هر تکنولوژی دیگر من پیشنهاد می کنم حداقل یک کتاب مطالعه کنید (البته شاید در آینده آموزشی گذاشتم) چرا فکر می کنید توی فورم یک نفر باید از صفر یه چیزی رو آموزش بده در ضمن اگه کسی هم یه کاری رو شروع می کنه جایگاه شما چیه فقط یه استفاده کننده نباید کسی مشارکت کنه!!! ما عادت کردیم دنبال لقمه آماده بگردیم. آقای محبی توی لینک زیر مطلب جالبی رو اشاره کردن که در دل من هم هست Forum Driven Development که ما تصمیم می گیریم کاری انجام بدیم بدون اطلاعاتی بعد میریم توی یک فروم سوال کلی رو مطرح می کنم و توقع داریم یکی بیاد از سیر تا پیاز بهمون آموزش بده.
http://blog.afsharm.com/2011/11/foru...velopment.html
پیشنهاد می کنم کتاب Apress pro entity framework 4.0 رو که حدود 250 صفحه هست در حد حداقل چند فصل مطالعه کنید و یا کتابی رو که آقای بهروز راد ترجمه کردن رو مطالعه کنید (نمی دونم ترجمه همین کتاب هست یا نه)

----------


## gwbasic

> سلام
> من فیلم اموزشی رو دیدم چندتا سوال داشتم :
> 
> 1 - اگر بخواهیم محتویات یک تکی باکس را همزمان توی 2 تا جدول بریزیم باید چه جور عمل کنیم ؟
> 
> 2 - اگر بخواهیم یک سری از اطلاعاتمون که مثلا توی تب اول ثبت که شد، اون ایدی  که جدید ایجاد شده را بخواهیم از جدول بگیریم که اطلاعات مربوط به جدول دوم را با همین ایدی که جدید ایجاد شده ثبت کنیم باید چه جوری عمل کنیم؟
> 
> 3 - این کانکشن که ما ایجاد میکنیم از توی ویزارد ایا روی هر سیستمی به صورت محلی یا لوکال جواب میده؟(مثل وقتی که جای اسم سیستم نقطه میگداریم) اگه بخواهیم اونجوری کار کنیم کجای کدنویسی باید اسم سرور را به برنامه بدیم؟
> 
> ...


مرسی از سوال های خوبتون
1- من سعی دارم این روش کدنویسی رو توضیح بدم که کنترل های روی فرم به یه موجودیت  وشی ای بایند هستند. کاش یه مثال می زدین ولی در کل فرض کنید ما یک شی در context داریم از جنس Customer و یک شی دیگه داریم از جنس Product خوب این دو شی رومی تونیم هرجور که دوست داریم پر کنیم مثلا مقدار Text یک TextBox رو به یک پراپرتی از Customer و یک پراپرتی از Product بدهیم و در نهایت SaveChanges رو صدا بزنیم تغییرات ذخیره خواهد شد.

2- در مورد این سوال وقتی فرم Order رو بخواهیم بسازیم جوابتون رو خواهید گرفت در ضمن باز به ین نکته اشاره می کنم که بهتره با شی کار کنیم نه اینکه ID بین فرمها جابجا کنیم.

3- بحث Connection string هم که مستقل از  EF هست. اما معمولا توی App.Config این مقدار تنظیم می شود. در مورد امنیتش هم نکته دیگری هست که می تونیم اونو Encrypt کنیم یا اصلا یک dll برای اون بنویسیم. که بحث جداگانه ای رو می طلبه

4-  معمولا اشیاء سنگین و یا اشیایی که منابع از سیستم می گیرند را باید در اولین فرصت آزاد کنیم. ObjectContext هم از این دسته هست. و اما اینکه چرا null می کنیم کار از محکم کاری عیب نمی کنه!!!

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

----------


## uniqueboy_ara

میشه جواب من رو هم بدید؟!

----------


## Amir Oveisi

> فقط یه سوال هر چی دوستان کد گذاشتون با vs 2010 بوده یعنی با 2008 نمی شه entity کار کرد. اگه جواب مثبته چند نمونه مثال واسم بذارین .


اگر از vs 2008 استفاده مي كنيد بايد SP1 اش رو نصب كنيد.

----------


## gwbasic

> اگه تو فایل XML تغییری ندیم چه اتفاقی میفته؟؟؟
> من تغییرش ندادم و در ظاهر هیچ اتفاقی نیفتاد و برنامه هم به درستی کار میکنه!
> 
> من خودم با معماری 3لایه و ADO.net کار میکنم، میخواستم بدونم آیا این روش (Entity Framework ) نسبت به ADO.net سرعت بیشتری داره؟؟؟


شما از چه نسخه ای از Visual Studio استفاده می کنید 2010. آیا سرویس پک یک رو نصب کردید؟ وقتی چند آیتم رو اضافه می کنید موقع ذخیره مشکلی پیش نمیاد؟!

در مورد EF هم باید بگم که چیزی جدا از ADO.Net نیست و در برخی موارد هم چون Command نهایی رو خودش تولید می کنه و چون این Command بهینه هست سرعت بیشتری نسبت به استفاده از روش استفاده از DataSet و ساختن Command توسط خودمون رو داره

----------


## uniqueboy_ara

2010 هستش ولی سرویس پک یک نیست
حق با شماست، وقتی سیو رو میزنم بعضی وقتا یه ارروری میده! پس این اررور به خاطر همین مسئله پیش میاد؟! مرسی از توضیحاتتون

----------


## electro_esma

با تشکر از استاد ( به حق استاد) 

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

----------


## haniyehghassami

سلام
بچه ها اماده باشین واسه قسمت دوم
اگه فیلم اموزشی را دیده باشین پس تا حالا حتما چیزایی از entity یاد گرفتین
پس یک نمونه بسازین و اماده بشین واسه فاز دوم
تا فردا جزئیات فاز دوم اماده میشه
مرحله بعدی باید حتما از entity استفاده کنین.پس از الان سرچ کنین تا بهترین پروژه را درست کنین(شاید توی پروژه اصلی کد شما قرار بگیره :چشمک: )
از امشب مرحله 2 شروع شده

----------


## haniyehghassami

نکات مهم مرحله 1 پروژه :
__________________________________________________  ____________
1 - نوع داده ای Uniqueidentifier بود که فکر کنم کسانی بودن که مثل من باهاش اشنا نبودن:



> نوع داده ای 16 بیتی هست که بصورت باینری ذخیره میشه با نام globally unique identifiers (GUIDs) که یک عدد دودویی منحصر به فرد هست و هیچ کامپوتر دیگری در جهان وجود ندارد که یک GUID مشترک با کامپوتر دیگر را تولید کند. استفاده ی اصلی از GUID برای تولید یک شناسه ی منحصر به فرد در یک سیستم  شبکه بزرگ که شامل چندین سایت است ,کاربرد دارد.
> یک مقدار GUID برای ستون uniqueidentifier است که معمولا توسط یکی از روش های زیر به دست می اید :
> * In a Transact-SQL statement, batch, or script by calling the NEWID function.
> *در کد برنامه با فراخوانی تابع API ویا متدی که GUIDمی گرداند
> این متغیر به 2 فرمت زیر به وجود می اید :
> 1 - رشته ای حاوی کاراکتر و عدد:Character string format: '6F9619FF-8B86-D011-B42D-00C04FC964FF'
> 2 - فرمت دودویی : 0xff19966f868b11d0b42d00c04fc964ff
> همان طور که در فیلم دیدین مفدارRowGuidرا برابرYes زذیم تا مقدار پیش فرض برای   Default value or binding بشه NewGuid()  تا هربار یک مقدار منحصربفرد در دنیا در فیلد جدول شما بیا
> (منبع این مطلب)
> .

----------


## haniyehghassami

نکته 2 - چرا stored generate patern  را identity گذاشتیم؟ چون ایدی ما بصورت اتوماتیک generate میشه و چون میخواهیم بفهمیم اون ایدی از سمت دیتابیس چی بوده  پس این مقدار رو توی حالت مدل که توی ویژال استدیو هستش را identity میزاریم و توی فایل xml هم تغییرش میدیم

نکته 3 - alt + shft + f10 که برای ساختن یک متد بود : یعنی مثلا اگه میخواهین یک متد بسازین فقط اسمش با ارگومنت هاش را بنویسید و این دکمه ها را بزنین تا اتوماتیک دکمه ساخته بشه

----------


## mmd2009

> نکته 3 - alt + shft + f10 که برای ساختن یک متد بود : یعنی مثلا اگه میخواهین یک متد بسازین فقط اسمش با ارگومنت هاش را بنویسید و این دکمه ها را بزنین تا اتوماتیک دکمه ساخته بشه


خیلی از کدهارو ما اصولا نمی نویسم snip رو برای همین گذاشتن که وقتمون رو هدر ندیم برای نوشتن کدهای نظیر for یا foreach یا if یا .....

----------


## Amir Oveisi

و حتی ساختن snippet های سفارشی!

----------


## gwbasic

قسمت دوم ویدیو مربوط به ساخت فرم Customer در تاپیک اصلی قرار داده شد لطقا به تاپیک اصلی که در پست اول اشاره شده مراجعه کنید.

این پست حذف خواهد شد

----------


## haniyehghassami

> قسمت دوم ویدیو مربوط به ساخت فرم Customer در تاپیک اصلی قرار داده شد لطقا به تاپیک اصلی که در پست اول اشاره شده مراجعه کنید.
> 
> این پست حذف خواهد شد


سلام؟؟؟؟؟؟؟؟؟؟؟؟!!!!!!!!!!!!!!!!!!  !!!!!!!!!!11
کدوم پست  قرار هست حدف بشه؟؟؟؟؟

----------


## noroozifar

> نکته 2 - چرا stored generate patern  را identity گذاشتیم؟ چون ایدی ما بصورت اتوماتیک generate میشه و چون میخواهیم بفهمیم اون ایدی از سمت دیتابیس چی بوده  پس این مقدار رو توی حالت مدل که توی ویژال استدیو هستش را identity میزاریم و توی فایل xml هم تغییرش میدیم
> 
> نکته 3 - alt + shft + f10 که برای ساختن یک متد بود : یعنی مثلا اگه میخواهین یک متد بسازین فقط اسمش با ارگومنت هاش را بنویسید و این دکمه ها را بزنین تا اتوماتیک دکمه ساخته بشه


من هر چی این دکمه ها را میزنم الت شیفت اف 10  هیچ متدی ظاهر نمیشه؟؟

----------


## mmd2009

> سلام؟؟؟؟؟؟؟؟؟؟؟؟!!!!!!!!!!!!!!!!!!  !!!!!!!!!!11
> کدوم پست  قرار هست حدف بشه؟؟؟؟؟


منظورشون همون پست بود دیگه. یعنی همون 51 .

اگر قرار باشه اینجارو پاک بکنن میگن تاپیک رو پاک میکنن.

موفق باشید

----------


## haniyehghassami

> من هر چی این دکمه ها را میزنم الت شیفت اف 10  هیچ متدی ظاهر نمیشه؟؟


یعنی اینکه اول اسم متدی که میخواهی تعریف کنی را بنویس

بعدش براش پرانتز بزار و اگه متدت ارگومان ورودی داره براش توی پرانتز اونارو بنویس

بعدش سمی کولن بزن

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

1 - نوع( ش  ز :لبخند گشاده!:  ) اینکه با ماوس روش وایسی تا مستطیل ابی کوچولو بیاد زیر اون خط قرمزه بعد با ماوس برو روش یه مربع باز میشه روش کلیک کن و اولین خطش رو بزن مثل زیر :

Untitled.png
2- راهی که باید اون کلیدها رو از صفحه کلید بزنی



> alt + shft + f10 که برای ساختن یک متد بود


3- متد را دستی بساز :بامزه:

----------


## noroozifar

یک مقدار هم در مورد کانکشن استرینگ توضیح بدید اینکه من همیشه فایل را در پوشه bin\Debug پروژه میگذاشتم و کانکشن استریگ را می نوشتم حالا تو این روش فکر کنم راحتر میشه با موضوع کانکشن استرینگ کنار امد .... در مورد این موضوع توضیح بدهید کانکش استرینگ به چه صورت در این روش پیاده سازی کنیم که هنگام ایجاد فایل setup با مشکل بر نخوریم ؟؟ مراحل کار را لطفا ....

با تشکر  از همه

----------


## shahrzad87

سلام
الان چند روز می شه که آقای gwbasic قسمت دوم  پروژه رو تعریف کردن اما کسی کد ننوشته، این بار هم من شروع می کنم و اولین پروژه رو می گذارم که این تایپیک و آموزش ادامه پیدا کنه.
مطمئنا کامل کامل و خالی از اشکال نیست... راستش من مدتی هست که خودم درگیر یه پروژه هستم و نتونستم برای این پروژه خیلی وقت بگذارم، فقط سعی کردم حداقل ها رو داشته باشه.
 خوشحال می شم که شما دوستان ایرادهای کارم رو بگین و کاملترش کنین  :چشمک: 

این هم اسکریپت دیتابیس :

USE [storeDB]
GO
/****** Object:  Table [dbo].[Product]    Script Date: 11/28/2011 22:34:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Product](
    [Id] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Price] [int] NULL,
 CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Customer]    Script Date: 11/28/2011 22:34:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Customer](
    [Id] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Family] [nvarchar](50) NULL,
 CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Default [DF_Product_Id]    Script Date: 11/28/2011 22:34:22 ******/
ALTER TABLE [dbo].[Product] ADD  CONSTRAINT [DF_Product_Id]  DEFAULT (newid()) FOR [Id]
GO
/****** Object:  Default [DF_Customer_Id]    Script Date: 11/28/2011 22:34:22 ******/
ALTER TABLE [dbo].[Customer] ADD  CONSTRAINT [DF_Customer_Id]  DEFAULT (newid()) FOR [Id]
GO

----------


## haniyehghassami

سلام

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

----------


## noroozifar

منهم مشکل دارم نمیدونم چرا اینجوری میشه    بصورت فیلم گذاشتم  یکبار خوبه مشکلی ایجاد نمیشه یعنی اطلاعات نمیپره یکبار هم که اجرا میکنی میبینی خالیه بانک ؟؟
این خود برنامه :
http://s2.picofile.com/file/7198115371/Store1.rar.html
اینم فیلم :

http://s1.picofile.com/file/71981523...itled.swf.html
بخشید اگر یک مقدار لهجه داره داخل فیلم :  :قهقهه:

----------


## noroozifar

ما هر چی اینجا منتظر شدیم تا آموزش جدید بیاد کسی نیامد و جواب سئوالات ما را هم ندادند به خاطر همین اینبار با عکس میگذارم تا ببینم کسی جواب میده یا نه ؟؟؟

بیین این نمای اول solutoin explorer 

بقیه عکس ها را برای اینکه حجم تاپیک بالا نره فقط لینک میگذارم
من می خواهم حالتی را ایجاد کنم که دیتا بیس به بانک attach بشه امدم در فولدر  data ازadd>new>existing item فایل storedb.mdf را اضافه کردم  بعد امدم از قسمت models یک مدل جدید ایجاد کردم و باتوجه به دیتابیس کانکش و جدولها را انتخاب کردم  برنامه اجرا میشه داده ها اضافه می شوند به جدول اما نمیدونم به محض اینکه من در کد برنامه تغییری را ایجاد کردم و برنامه را اجرا کردم مقادیر قبلی یعنی رکورد های قبلی که به بانک اضافه کردم نیستند از بین میرند  

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

این هم محتویات داخل app
<add name="StoreDBEntities" connectionString="metadata=res://*/Models.StoreModel.csdl|res://*/Models.StoreModel.ssdl|res://*/Models.StoreModel.msl;provider=System.Data.SqlClie  nt;provider connection string=&quot;Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector  y|\Data\StoreDB.mdf;Integrated Security=True;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

اینم لینک سایر عکسها از مراحل کار :
http://s2.picofile.com/file/71994853..._01_021852.png
http://s1.picofile.com/file/71994855..._01_021929.png
http://s1.picofile.com/file/71994856..._01_022011.png
http://s2.picofile.com/file/71994858..._01_022054.png
http://s1.picofile.com/file/71994861..._01_022835.png

لااقل جواب مشکلات مردمو بدید اقا چرا مردم را اذیت میکنید یا تاپیک نزنید اینهم اموزشی یا اگر میزنید ادامه بدید کلاس دیگه نگذارید  :شیطان:  :قهقهه:  (اینهم یک نمونه اعصبانیت و اعتراض )

----------


## gwbasic

جناب noroozifar منو ببخشید که دیر جواب می دم چون می خواستم کدتون رو نگاه کنم و نکاتی رو در مورد کدتون بگم ولی فرصت نکردم
اما نکته ای که شما مشکل دارید اگه پست های منو حداقل (نه تو این تاپیک) دنبال کرده بودین جواب این سوالو دارم!!!
مشکلی که شما مطرح کردین مشکل نیست یه رفتار طبیعی هست که از Visual studio سر می زنه. هنگامی که شما تغییری توی کد ایجاد می کنید برنامه هنگام اجرا ابتدا Build میشه و فایلهای جدید توی فولدر Bin ریخته می شه بنابراین فایل StoreDB شما هم که در فولدر DataAccess برنامتون قرار داره دوباره توی Bin ریخته می شه و شما موقع اجرا می بینید که اطلاعات ازبین رفته چون شما داده هاتون رو از StoreDB که توی Bin هست می خونید (در اصل فایلی که در کنار Exe قرار می گیره) جای نگرنی هم نیست چون این مسئله هنگام Develop پیش می یاد. و جای دیگه چون شما فقط یک فایل StoreDBکنار exe دارین این اتفاق نمی افته. امیدوارم متوجه شده باشین

در مورد کدتون هم بعدا توضیح می دم

----------


## noroozifar

با تشکر از شما 
بله من به این موضوع امروز قبل از پاسخ شما پی بردم چه اتفاقی رخ میدهد و برای اینکه این مشکل را در محیط برنامه نویسی حل کنم به قسمت app.config رفتم و آدرس attach را از AttachDbFilename=|DataDirectory|\Data\StoreDB.mdf به آدرس اجرای برنامه تغییر دادم AttachDbFilename=D:\TAMRINAT C#‎\TestEF2\TestEF2\Data\StoreDB.mdf  و مشکل بر طرف شده و نکته اینجاست که من باید بعد از اجرا کامل پروژه دوباره آدرس attach کردن بانک را به حالت اول بر گردانم ..

از شما متشکرم    خواهشا آموزش های جدید را بگذارید  یک پروژه بزرگ دارم و می خواهم از معماری EF استفاده کنم و وقت کافی متاسفانه ندارم   داخل کدهایم خواستم از storeprocdure استفاده کنم ....... که هنوز موفق نشدم  منتظریم اقای مدیر  :خجالت:

----------


## gwbasic

و اما کد جناب Noroozifar
چند مورد رو اشاره مي کنم در ادامه سعي کنيد رعايت کنيد:
1- از متد Fill‌ براي پر کردن گريد استفاده شده ولي چرا از امکانات EntityFramework‌براي حفظ و نگهداري و تغيير داده هايي که گرفته شده استفاده نکرديد.
2- براي پر کردن TextBox ها از Binding بايد استفاده ميشد BindingSource  اين کارو براي شما ساده مي کنه که اصلا استفاده نکرديد. 
3- براي اينکه مشخص کنيد  فرم در حالت ويرايش هست از Tag مربوط به btnSave استفاده کردين که البته راه اشتباهي نيست ولي بهتره هيچ وقت از منطقتون رو توي UI قرار ندين و از اونجا بگيرين!!!
بهتره مثل IsDirty که توي ويديو بکار بردم شما هم فيلدي براي اين کار تعريف کنيد و هرجا لازم داشتيد از اون فيلد استفاده کنيد به کد زير توجه کيند:
براي حالت هاي مختلف فرم (اضافه يا ويرايش) اول يک enum تعريف مي کنم


    public enum FormMode
 {
        Add,
        Edit
 }

سپس يک فيلد در سطح فرم تعريف ميکنم 


 
private FormMode formMode;


حالا هرجا خواستم حالت فرم رو در اين فيلد ذخيره مي کنم مثلا توي متد Edit بجاي ست کردن btnSave.Tag‌ مي نويسيم


 
 
formMode = FormMode.Edit;
 


و در نهايت هنگام ذخيره ( متد Ok !؟!؟!؟؟)


switch (formMode)
{
    case FormMode.Add:
        Insert();
        break;
    case FormMode.Edit:
        UpTodate();
        break;
    default:
        break;
}



4- براي توليد Id جديد يه کد غيره بهينه نوشتيد. چرا؟ ترجيح مي دم فقط کدتون رو بذارم بقيه دوستان توضيح بدن


 private Int64 Next()
 {
     Int64 valu = 0;
     try
     {
         using (StoreDBEntities Context = new StoreDBEntities())
         {
             // string Querystring = "Select  VALUE c From Context.tblCustomers AS c";
             var objQuery = Context.tblCustomers;
             foreach (var item in objQuery)
             {
                 if (item.Id > valu)
                     valu = item.Id;
             }
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
     return (valu + 1);
 }


5- در متد delete شما از EntityCommand‌ استفاده کردين ديگه نيازي به new کردن Context نيست
6- با اين روش پياده سازي که شما انجام دادين چرا  توي Cancel متد Fill‌رو صدا زدين نيازي نيست

----------


## noroozifar

> - از متد Fill‌ براي پر کردن گريد استفاده شده ولي چرا از امکانات  EntityFramework‌براي حفظ و نگهداري و تغيير داده هايي که گرفته شده  استفاده نکرديد.
> 2- براي پر کردن TextBox ها از Binding بايد استفاده ميشد BindingSource  اين کارو براي شما ساده مي کنه که اصلا استفاده نکرديد.


چون از BindingSource استفاده نکردم می بایست به یک طریق اطلاعات داخل دیتا گرید را refresh کنم به خاطر همین متد Fill را نوشتم و بعد من دارم هنوز امکانات مختلف entity framework را یاد میگیرم هنوز به طور کامل حفظ و نگهداری و تغییر داده ها را بلد نیستم با این روش 

اما برای پر کردن TextBox ها یک زمان میرسه که نیازی ندارم به محض انتخاب یک رکورد از دیتا گرید حالا به هر صورت دیگه اطلاعات همان زمان در TextBox ها نمایش داده بشه به خاطر همین دستی سعی کردم انها را پر کنم اما در کل منتطقی به نظر نمیاد و به ندرت این اتفاق رخ میدهد و بهتر و ساده تر همان استفاده از bindingsource بود 



> 3- براي اينکه مشخص کنيد  فرم در حالت ويرايش هست از Tag مربوط به btnSave  استفاده کردين که البته راه اشتباهي نيست ولي بهتره هيچ وقت از منطقتون رو  توي UI قرار ندين و از اونجا بگيرين!!!


این روشی که شما توضیح دادید خیلی خوبه از این به بعد از این روش استفاده میکنم تا کدها ساختار و خوانایی بهتریی پیدا کنند 




> 4- براي توليد Id جديد يه کد غيره بهينه نوشتيد. چرا؟ ترجيح مي دم فقط کدتون رو بذارم بقيه دوستان توضيح بدن


ببینید من می خواستم با این روش در اصل ردیف را ایجاد کنم که رکوردها را شمارش کنه شما درست میگید منتطقی نیست و مشکلی که پیش میاد زمان حذف یک  رکورد مثلا اگر من 4 رکورد داشته باشم شمارش id که به عنوان شماره ردیف استفاده کرده ام به صورت 1و2و3و4 می شود حالا در نظر بگیرید من رکورد 2 را حذف کنم شماره ردیف ها یا همان id ها به صورت 1و3و4 می شود میبیند شماره ردیف ها بهم خورده ولی به طور کلی همیشه ای دی که ایجاد میشه منحصر به فرد هستش .... 
خوب حالا می خواستم بدونم برای اینکه شماره ردیف ها  در یک دیتا گرید به درستی نمایش داده بشه بهتره چه کنم ؟؟؟



> - در متد delete شما از EntityCommand‌ استفاده کردين ديگه نيازي به new کردن Context نيست


من خواستم فقط بدونم به چه طریق میشه از EntityCommand‌ و پروسیجرهای نوشته شده در خود دیتابیس استفاده کنم ولی موفق نشدم و با Error مواجه شدم و میبیند کدهای قسمت حذف رکورد ناقصه منتظرم تا این مورد را آموزش بدهید 



> - با اين روش پياده سازي که شما انجام دادين چرا  توي Cancel متد Fill‌رو صدا زدين نيازي نيست


اگر نگاه کنید متد Cancel در انتهای عمل insertو Edit صدا شده و بهمین دلیل fill را داخل Cancel قرار دادم می توانستم قرار ندهم و بعد از متد cancel متد fill را صدا بزنم کلا برای اینکه یک refresh کامل صورت بگیرد بعد از اینکه کاربر لغو عملیات را زد اینکار را انجام دادم

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

----------


## noroozifar

سلام
فکر کنم تو این تاپیک فقط من پست میدم 
همینجور که آقای مدیر گفتند خواستم از BindingSourc استفاده کنم بنابر این یک bindingsource ایجاد کردم و دیتاگرید و تکست باکس ها ربهش وصل کردم اما با این تفاوت که از bindingnavigator  نمی خواهم استفاده کنم  بنابر این در رویداد new این کدها را نوشتم :
private void New()
        {
            try
            {
                grpGrid.Enabled = false;
                grpValues.Enabled = true;
              
                bsCustomer.AddNew();
                btnSave.Tag = "btnNew";
                btnEdit.Enabled = false;
                btnNew.Enabled = true;
                btnDelete.Enabled = false;
                btnSave.Enabled = true;
              
               
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
و در رویداد save هم این را نوشتم :
        private void Insert()
        {
            try
            {
                    bsCustomer.EndEdit();
                    Context.SaveChanges();
                    MessageBox.Show("ذخیره شد");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

اما کار نکرد و رکوردهای خالی یا غیر منطقی وارد میکنه البته توجه کنید که من کد ID را خودم ایجاد میکنم ؟
اینهم کدها : اگر امکان داره مشکلم را بر طرف کنید :
http://s2.picofile.com/file/7200708709/Store1.rar.html

----------


## linux

> سلام
> 
> یه چیز باحال :
>  عیب های این برنامه را هر کی تونست پیدا کنه جایزه داره :


 اگر قرار باشد که پروژه حرفه باشد خوب همش عیب بود من حسنی ندیدم.

----------


## gwbasic

نمی دونم چرا از BindingNavigator استفاده نمی کنی ولی بهر حال مورد خوبی مطرح شد.
همونطور که خودت توی کد نوشتی برای ایجاد یک customerجدید از متد AddNew‌مربوط به BindingSource استفاده کردی که کاملا درسته و Customer جدید به درستی ایجاد شده اما مشکل شما اینه که می خوای خودت Id جدید رو مقدار دهی کنی!
برای این کار وقتی شی جدید به BindingSource اضافه می شه رویداد AddingNew اتفاق می افته شما می تونی از این رویداد به شکل زیر برای مقدار دهی Id استفاده کنی

private void bsCustomer_AddingNew(object sender, AddingNewEventArgs e)
{
    tblCustomer newCustomer= new tblCustomer();
    newCustomer.Id = Next();
    e.NewObject = newCustomer;
}

----------


## noroozifar

> نمی دونم چرا از BindingNavigator استفاده نمی کنی ولی بهر حال مورد خوبی مطرح شد.


علتش فقط بر میگرده به طراحی فرم

----------


## gwbasic

BindingNavigator  امکان هر جور تغییر در ظاهر رو داره. شما هر تغییری که  بخوای می تونی روی اون انجام بدی. اون Toolstrip ای که خود BindingNavigator روی فرم قرار می ده رو شما می تونی کلا پاک کنی و کنترل های مورد نظر خودت رو بندازی مثلا می تونی همه اون Button هایی که توی پروژت گذاشتی رو به BindingNavigator بدی و بذاری کارای تکراری مثل اضافه و ... رو BindingNavigator خودش انجام بده.
اگه به نکته ای اشاره می کنم فقط منظورم اینه که راهی باز بشه برای بررسی جدید برای شما یکم به نکته ای که اشاره می کنم دقت کنید. حالا این نکته می تونی یکم وقت گیر باشه مثل BindingNavigator که کامل به چندو چون کار آشنا بشی و یا می تونه خیلی ساده بشه مثل موارد 4 یا 6  که در پست های قبلی گذاشتم. دقت کن که من جواب نمی خوام بلکه می خوام بیشتر بررسی کنی و خودت نتیجه رو همینجا بگی (چون من جواب رو می دونم)

----------


## noroozifar

من باید تمامی موارد EF را یاد بگیرم اضافه .. حذف ... جستجو(پیشرفته) ... ویرایش .... استفاده از پرسیجرهای نوشته شده در اس کیو ال ... در نهایت پروژه ای که دارم باید در معماری 3 لایه پیاده سازیش کنم ... و همیشه کدهایم را دستی می نوشتم و حالا می خواهم از شیوه های جدیدتر و با کد نویسی بهینه تر و خیلی موارد دیگر...   من هر روز 3 الی 4 بار به این تاپیک سر میزنم تا از شما اساتید بیشتر یاد بگیرم  و منتظر آموزشها، نکات کلیدی و غیره هستم  ... هر مورد را چندین بار با اینکه وقتم محدوده بررسی میکنم تا اینکه همه چیز کامل دستم بیاد 
بر روی  BindingNavigator هم کار میکنم .... اگر کارایی این مورد زیاد باشه و باعث ایجاد راحتی کار بشه

----------


## noroozifar

الان دارم از bindingnavigator استفاده میکنم می خواهم قبل از حذف یک پیغام بده امدم و این کد را به رویداد کلیک حذف دادم اما قبل از پیغام رکورد را  حذف میکنه بعد پیغام میده ؟؟؟ :متفکر:  چه کنم ؟؟؟

   private void btnDelete_Click(object sender, EventArgs e)
        {
            DialogResult Result = MessageBox.Show("رکورد مورد نظر حذف شود ؟", "حذف رکورد", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
            if (Result == DialogResult.No)
            {
                bsCustomer.CancelEdit();
            }
        }

----------


## haniyehghassami

> اگر قرار باشد که پروژه حرفه باشد خوب همش عیب بود من حسنی ندیدم.



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

1 - من تو فرم مشتریم اشتباها tag هم به دیتا بیسم بایند کرده بودم که واسه همین خطای null reference میداد البته اگه تو جدول مشتریallow null  را true میکردم خطای  run time نمیداد اما در ازاش خطای دیگه ای اتفاق می افتاد اونم اینکه رشته ای خالی در جدولم ثبت میشد----> راه حلش هم این بود که من اشتباهی علاوه بر تکسته تکس باکسم ؛ تگ هم بایند کردم در نتیجه پاکش کردم درست شد. :لبخند گشاده!: 

2 - در فرم محصولات بعد از اینکه دکمه ثبت داده را میزدم فرمم بسته نمی شد و برنامم هنگ می کرد بعد از اینکه با کمک استاد چک کردیم فهمیدیم که چون واسه قیمت محصول ما int تعریف کردیم و چون واسه  امتحانی رشته وارد کردیم string را میخواسته جای  int بگذاره که نمی شده واسه همین هنگ میکرد----> توی proprieties  همون تکس باکس قیمت رفتم و گزینه ی causesValidation  را  false کنین..اما قبل این همه کار میشه توی keyPress تکس فیمت کذ زیر را نوشت واسه اینکه کاربر تنها قادر باشه عدد وارد کنه

private void txt_gheymat_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled=(char.IsDigit(e.KeyChar)||char.IsControl  (e.KeyChar))?false:true;
        }

----------


## gwbasic

> الان دارم از bindingnavigator استفاده میکنم می خواهم قبل از حذف یک پیغام بده امدم و این کد را به رویداد کلیک حذف دادم اما قبل از پیغام رکورد را  حذف میکنه بعد پیغام میده ؟؟؟ چه کنم ؟؟؟
> 
>    private void btnDelete_Click(object sender, EventArgs e)
>         {
>             DialogResult Result = MessageBox.Show("رکورد مورد نظر حذف شود ؟", "حذف رکورد", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
>             if (Result == DialogResult.No)
>             {
>                 bsCustomer.CancelEdit();
>             }
>         }


مرسی به مورد جالبی اشاره کردی. متاسفانه این bindingNavigator این ضعف رو داره که اول آیتم جاری رو پاک  می کنه بعدا کد های شما اجرا می شه و حتی BindingSource‌ هم بهتون کمک نمی کنه چون توی رویداد ListChanged تغییرات اعمال شده (یعنی آیتم پاک شده) بنابراین باز شما نمی تونی با کد جلوی پاک شدن رو بگیری !!!
یک راه ساده اینه که شما bindingnavigator رو انتخاب کرده و در پنجره Properties روی DeleteItem کلیک کرده و مقدار اونو پاک کنی این کار باعث می شه که فقط کدهای شما اجرا بشه ودر نهایت کدتون رو به شکل زیر تغییر بدین

if (bsCustomer==null)
    return;
if (bsCustomer.Current==null)
    return;
DialogResult Result = MessageBox.Show("رکورد مورد نظر حذف شود ؟", "حذف رکورد", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
if (Result == DialogResult.Yes)
{
    bsCustomer.RemoveCurrent();
}

که البته راه کثیفی هست.

احتمالا یک BindingNavigator مناسب برای این حالت و همچنین با قابلیت ویرایش و لغو بنویسم

----------


## noroozifar

فکر کنم به روش قدیمی بریم بهتره یعنی از BindingSource‌ و bindingnavigatorکلا استفاده نکنیم و تمامی کدها را با بهره گیری از EF خودمان بنویسیم ...

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

----------


## gwbasic

وقتی database رو تغییر بدی می تونی توسط EDM Designer مدل ها تو Update‌ کنی.

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

----------


## noroozifar

> باید همه چیزو کنار بذاری


نه کنار نمیگذارم هرگز باید یاد بگیرم

منتظر ویدئو هستم

----------


## gwbasic

ویدیوی جدید رو توی تاپیک اصلی گذاشتم
https://barnamenevis.org/showthread.p...71#post1376271

----------


## pedramfj

سلام
من می خواهم این فیلم های آموزشی را دانلود کنم . اما نمیشه.
مشکل از کجاست؟
اگر امکانش هست در جایی دیگر...
تشکر

----------


## electro_esma

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

دقیقه ای هم که شده  می یام و صحبت های شما رو نگاه  می کنم . 

خدا قوت . 

بحث های حاشیه ای همیشه هست استاد بزرگوار ...                                و من ا.. توفیق

----------


## uniqueboy_ara

آقا من یه سوال فنی داشتم، کار این "_" چیه؟؟؟ که قبل از بعضی متغییر ها موقع تعریفشون میزارن؟؟؟

----------


## wolf_majid

معمولا" برنامه نویسان برای متغیرهای private میذارند
دلیلش هم اینه که با یک _ متغیرهایی که خودشون تعریف کردند رو می بینند و با سایر متغیرها و متدها و ... متمایزشون می کنند

----------


## linux

> ویدیوی جدید رو توی تاپیک اصلی گذاشتم
> https://barnamenevis.org/showthread.p...71#post1376271


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

----------


## mmd2009

> خیلی داری زحمت می کشی برای آموزش به بقیه ولی من دوست داشتم که کمی روی طراحی سه لایه ، الگوهای طراحی، و این چیزها وقت بگذاری، واقعا نیاز خیلی از برنامه نویس ها هست، اکثر دوستان این مدل برنامه می نویسند. پروژه ای برای همین کار ایجاد کردم  چندتا نکته کوچک هست اگر تمام شود بزودی اینجا قرار می دهم.


با سلام

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

موفق باشید

----------


## farzane-ms

> آقا من یه سوال فنی داشتم، کار این "_"  چیه؟؟؟ که قبل از بعضی متغییر ها موقع تعریفشون میزارن؟؟؟


اول اسم فیلدهایی که براشون پراپرتی تعریف میشه میذارن، احتمالا برای  خواناتر بودن کده (و از استانداردهاست) نذاشتنش هم مشکلی پیش نمیاره.
ساختار کلی تعریف پراپرتی:

private DataType _var;
public DataType var
{
     get{return _var}
    [set{_var=value}]
}

----------


## mmd2009

> آقا من یه سوال فنی داشتم، کار این "_"  چیه؟؟؟ که قبل از بعضی متغییر ها موقع تعریفشون میزارن؟؟؟


با سلام

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

موفق باشید

----------


## farzane-ms

> خیلی داری زحمت می کشی برای آموزش به بقیه ولی من دوست داشتم که کمی روی طراحی سه لایه ، الگوهای طراحی، و این چیزها وقت بگذاری، واقعا نیاز خیلی از برنامه نویس ها هست، اکثر دوستان این مدل برنامه می نویسند. پروژه ای برای همین کار ایجاد کردم  چندتا نکته کوچک هست اگر تمام شود بزودی اینجا قرار می دهم.


سلام
من طراحی سه لایه ، الگوهای طراحی، و این چیزها رو بلد نیستم. شاید حق با شما باشه که اینا نیاز خیلی از برنامه نویس هاست، اما این تاپیک و مطالبی که آموزش داده میشه برای من و کسای دیگه که مثل من برنامه نویس مبتدی هستن اهمیت خاص خودشو داره. لطفا سطح مطالب رو  خیلی بالا نبرید تا ما مبتدی ها هم متوجه بشیم.
آقای gwbasic  به خاطر زحمتی که می کشید تشکر میکنم و امیدوارم آموزش ها ادامه داشته باشه! :)

----------


## gwbasic

توی تاپیک اصلی من فاز بندی های این پروژه رو مشخص کردم البته هیچ دلیلی وجود نداره طبق اون عمل بشه و می تونه این روند تغییر کنه.
من در فاز اول سعی می کنم که روش کدنویسی پشت فرم ها رو آموزش بدم که چطور موجودیت ها پشت فرم تعریف بشه و به کنترل های فرم ارتباط داده بشه و در نهایت منطق برنامه با کنترل های فرم بطور مستقیم گره نخوره. مخاطب این فاز هم قطعا افراد مبتدی و کم تجربه هستند.
در نتیجه در مورد چند لایه نویسی کمی صبر کنید تا این فاز تموم شود.
اما اینکه چطور چند لایه نویسی بر اساس EntityFramework پیاده سازی شود من فکر میکنم راه بهتر پیاده سازی بر اساس CodeFirst هست در نتیجه نیاز به آشنایی با این مفهوم در EF هست بنابراین یک سری مقدمات هست که باید آموزش داده بشه
البته مشتاقم نظر شما رو در این زمینه بدونم شاید راه ساده تری رو داشته باشید.

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

----------


## noroozifar

آقای مدیر gwbasic برای من آموزشهایت خیلی خیلی مهم هستند همینجور که میدونید من از اول این تاپیک دارم با شما گام به گام میام جلو و اگر این تاپیک را ادامه ندید واقعا دلسرد میشم برای من مفیدن   من هم دارم همراه شما میام که معماری 3 لایه برسم ... پروژه من باید تحت 3 لایه ایجاد بشه و هر چه زودتر به لایه ها و مفاهیم ان برسم برام بهتره  از این رو هر وقت هم فرصت بکنم دارم پی دی اف خانم julia lerman  را نیز مطالعه میکنم اما متاسفانه زبان انگلیسیم زیاد قوی نیست و هر خطش برای درکش نیاز به یکی، 2 ساعت وقت دارم  :ناراحت:   با این حال تصمیم با شماست ... اکثر پروژهای تا حالا من کار کردم نرم افزارهای مدیریتی بوده و تحت ویندوز و اس کیو ال بنابراین به روشها و کدهای بهینه برای برنامه نویسی پیشرفته نیاز دارم ...  باز از زحمات شما ممنونم

----------


## haniyehghassami

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




> خصوصیات در اصل حالتی  هستند که مکانیزمی انعطاف پذیر برای خواندن ، نوشتن یا محاسبه ی مقادیری از فیلدهای اختصاصی(private fields) ؛ هستند 
> این خصوصیت ها می توانند بعنوان اعضای دیتای عمومی مورد استفاده قرار بگیرند، اما درواقع اونها شامل متدهای خاصی بنام (accessors) هستند که باعث میشوند دیتاها براحتی فابل دسترسی باشند در زمانی که ما متدهای قابل انعطاف و امن تولید میکنیم.
> 
> این خوصیات به کلاس ما این توانایی را میدهد که  مقادیر قابل تنظیم(set) و مقادیر گرفته شده (get) که بصورت خصوصی(private) در کلاس تعریف شدند در معرض تماشا قرار دهد و قابل دسترسی کند.
> 
> دستور (get) برای این است که ارزش ان مقدار را برگرداند و دستور  (set) برای برای تنظیم مقدار جدید این خصوصیت تعریف میشود
>  این سطح دسترسی می تواند در سطوح مختلف تعریف شوند
> 
> کلمه کلیدی valueبرای این است که در دستور (set)مقداری برای ان اختصاص داده است.
> ...


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

نکته 3 : متدهایی که برای فعال یا غیر فعال کردن یکسری از ابزارهای روی فرم ؛ به جای اینکه برنامه نویس در رویداد کلیک دکمه ها بخواهد هربار اینها را بنویسد تنها متد مربوطه را صدا بزند

نکته 4 : نوشتن یک شرط باحال برای اینکه حالت صحیح یا غلط را برگردونه که من اینو بلد نبودم

tsbEdit.Enable=tsbDelete.Enable=bsProduct.count>0;


که در اینجا اگر حالت اخری جواب صحیح برگردونه پس کلا True میشن در غیر اینصورت False

----------


## masoud_z_65

دوستان و استادادن عزیز واقعا ممنون..من با توجه به اینکه وقتم کمه و زیاد همحرفه ای نیستم که بتونم تو بحثاتون شکت کنم اما هرجور شده سعی میکنم هر روز به این تاپیک سر بزنم...خواستم تشکری کنم و همچنین یه سوال درمورد اینکه کسی کلا درمورد handle میتونه به من توضیح بده؟؟
کلا مفهومش چیه؟؟؟؟
یه سوال دیگه اینکه آیا توی پروژه های خیلی بزرگ هم از entity framework استفاده میکنند یا نه؟

----------


## gwbasic

> دوستان و استادادن عزیز واقعا ممنون..من با توجه به اینکه وقتم کمه و زیاد همحرفه ای نیستم که بتونم تو بحثاتون شکت کنم اما هرجور شده سعی میکنم هر روز به این تاپیک سر بزنم...خواستم تشکری کنم و همچنین یه سوال درمورد اینکه کسی کلا درمورد handle میتونه به من توضیح بده؟؟
> کلا مفهومش چیه؟؟؟؟
> یه سوال دیگه اینکه آیا توی پروژه های خیلی بزرگ هم از entity framework استفاده میکنند یا نه؟


کدوم handle  اگه منظورتون handle فرم هست مطلب خاصی نیست وقتی فرمی در سیستم عامل نمایش داده می شه به اون فرم یک handle اختصاص داده می شه ولی ما هنگام کد نویسی معمولا نیاز به این نداریم که از handle استفاده کنیم. handle معمولا هنگام برنامه نویسی از طریق api استفاده می شه. در کل چیزی نیست که زیاد فکرتون رو مشغولش کنید.

در مورد  EF باید بگم که بله حتما می شه در پروژه های بزرگ استفاده کرد. EF برای راحتی و ارتباط object Oreinted با پایگاه داده آمده.

----------


## mahsa_hashemi

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



> سلام
> من طراحی سه لایه ، الگوهای طراحی، و این چیزها رو بلد نیستم. شاید حق با شما باشه که اینا نیاز خیلی از برنامه نویس هاست، اما این تاپیک و مطالبی که آموزش داده میشه برای من و کسای دیگه که مثل من برنامه نویس مبتدی هستن اهمیت خاص خودشو داره. لطفا سطح مطالب رو  خیلی بالا نبرید تا ما مبتدی ها هم متوجه بشیم.
> آقای gwbasic  به خاطر زحمتی که می کشید تشکر میکنم و امیدوارم آموزش ها ادامه داشته باشه! :)

----------


## farzane-ms

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


سلام mahsa_hashemi
تجدید نظر میکنم، با آموزش مباحث گفته شده 100% موافقم!  :چشمک: 

و منتظر آموزش ها...

----------


## Abolfazl.programmer

سلام
 من برنامه رو طبق آموزش ها ساختم اما زمانیکه روی دکمه ی save کلیک برای بار اول اطلاعات رو ذخیره میکنه اما برای بار دوم خطا میده و از برنامه میاد بیرون.
برنامه رو گذاشتم
اگه امکانش هست منو راهنمایی کنید 
ممنون
رمز فایل هم 123321
http://up7.iranblog.com/images/ak9xbuv9eyyu13puggg3.rar

----------


## gwbasic

> سلام
>  من برنامه رو طبق آموزش ها ساختم اما زمانیکه روی دکمه ی save کلیک برای بار اول اطلاعات رو ذخیره میکنه اما برای بار دوم خطا میده و از برنامه میاد بیرون.
> برنامه رو گذاشتم
> اگه امکانش هست منو راهنمایی کنید 
> ممنون
> رمز فایل هم 123321
> http://up7.iranblog.com/images/ak9xbuv9eyyu13puggg3.rar


اگه ویدیو اول رو بدقت دیده باشید من این مورد رو توضیح دادم. این مسئله باگ ویژوال استودیو هست. وقتی شما در Edm Designer روی یک Entity کلیک کرده و Id رو انتخاب کنید. در پنجره پراپرتی StoreGeneratedPattern = Identity قرار بدید هنگام تولید تگ این مورد لحاظ نمی شه که در سرویس پک یک این مسئله برطرف شده. برای حل  اون هم همانطور که در ویدیو اشاره شد باید این مورد رو خودتون به صورت دستی اضافه کنید.

درضمن یادتون باشه که اگه Entity جدیدی اضافه کردین و یا update انجام دادین باز این مسئله پیش میاد که باید دوباره دستی این کارو انجام بدین البته جای نگرانی نیست چون همونطور که گفتم در سرویس پک یک ویژوال استودیو حل شده.

به همه دوستان پیشنهاد می کنم این آموزش ها رو چندین بار ببینین و حتما تموم کدها رو خودتون بنویسین تا کامل جا بیافته چون دوستانی که کداشونو به من نشون میدن (حالا اسمشونو نمی گم  :چشمک: )  باز هم به روش خودشون کد می نویسن

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

----------


## haniyehghassami

سلام
من بعد از مدت ها اخر تونستم بیام اینجا ( اما خیلی سوت و کور شده که باید از این وضعیت در بیاد)
من یه سوال واسم پیش امده؟؟؟؟؟
کلا این Binding source کارش چی هست؟
واسه چی هست؟
ماهیتش چیه؟ یعنی چه جنسیه؟ یعنی کلاسه ؟ جدوله؟ ...؟ کلا یکی این رو میشه واسه من یاز کنه که دقیقا Binding source کارش چیه؟
دیگه کجاها به درد میخوره ؟
فواید و نواقصش چیه؟
اییییییی بابا چقدر سوال داشتم ؟؟؟؟؟ تراخدا یکی این کلاف پیچ در پیچ Binding source را واسم باز کنه ؟؟؟ :متعجب:  :متفکر:  :لبخند گشاده!:  :خیلی عصبانی:

----------


## noroozifar

از bindingsource ایا می شود به روش معماری 3 لایه استفاده کرد ؟  آقای مدیر آموزش جدید ؟

----------


## gwbasic

در مورد BindingSource هم توی پروِژه به صورت ویدیویی آموزش دادم که چه کار می کنه و هم توی امضام لینک "آموزش Data Binding" رو گذاشتم که توی اون تاپیک کامل توضیح دادم که Data Binding چی هست و چطور از BindingSource برای Binding استفاده می کنیم. نمی دونم چرا سوال می کنید؟!
کلا binding ارتباطی رو بین کنترل و موجودیت برقرار می کنه. چرا نشه توی معماری چند لایه ازش استفاده کرد. شما موجودیتتون رو از لایه Data Access‌می گیرید و با استفاده از binding به کنترل های فرم وصل می کنید.

برای آموزش بعدی شاید حدود 40 50 ساعت فقط وقت صرف کد نویسی کردم. و تازه همین الان که دارم این پست رو می زنم تموم شده! در ادامه نیاز هست که معماری Entity Framework رو خوب بدونید حداقل اینکه Object Context رو خوب بشناسید و بدونید که چطوری چند OC داشته باشید و Entity ها رو بین اونها جابجا کنید. در ادامه تکنیک هایی که استفاده می شه بخصوص در معماری چند لایه خیلی قابل استفاده هستند. و دونستنشون مهم هست.

امیدوارم امشب بتونم ویدیو رو هم آماده کنم

----------


## gwbasic

در تاپيک اصلي آموزش ساخت فرم سفارش رو  گذاشتم. اميدوارم با اين آموزش به ارزش Entity Framework پي ببريد که چطور مي شه با استفاده از آن به صورت شي گرا با Database ارتباط بر قرار کرد و وظيفه ذخيره تغييرات رو به عهده EF گذاشت. همچنين اميدوارم نحوه ارتباط برقرار کردن بين چند فرم رو ببينيد و استفاده کنيد.
پيشنهاد مي کنم اين آموزش رو چندين بار ببينيد و مهمتر از اين سعي کنيد با سليقه خودتون کدنويسي کنيد و فرم سفارش رو بسازيد تا بيشتر با EF آشنا بشين و با خطاهاي احتمالي مواجه بشين تا کارکردن با ObjectContext برایتان جا بیافتد!!!

----------


## noroozifar

ممنونم اقای مدیر بابت زحماتی که کشیدی به زودی کدهای خودم را میگذارم تا نظر بدین

----------


## linux

این تاپیک را یک جوری همیشه در صفحه اول قرار دهید ، چون مشکل خیلی با خواندن این حل می شود

----------


## gwbasic

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

موفق باشین

----------


## noroozifar

سلام 
آموزش سوم خیلی سخت بود و هم خیلی عالی خیلی چیزا فهمیدم و خیلی چیزا را یاد نگرفتم 
کدها را مانند کدهای آقای مدیر سعی کردم بنویسم اما باز مشکل داشتم 
در قسمت طراحی بانک اگر به اشتباه فیلدی را تعریف کرده و می خواهم تغییرات اعمال کنیم دوباره و ذخیره کنیم با پیغام ذخیره ای روبه رو می شویم که savetext داره حتما متوجه شدید کدام پیغامه اون را داخل sql server 2008 یک تیک داشت که بر میداشتی دیگه این پیغام نمیاد اما از داخل داخل ویژوال استودیو نمیدونم به چه طریق ؟
2. دومین مشکل من سر همین Attach و Detach خیلی سخته تا مفهوم درک کنم شاید به دلیل اینه که من از ساختار struct درک درستی ندارم همچنین این get و set همیشه استفاده میکنم اما هیچ موقعه نفهمیدم چی هستند  :قهقهه: 
بالاخره من این تاپیک را حسابی دنبال میکنم تا یاد بگیرم 
کدهای خودم را گذاشتم و در فرم مشتری یک جستجو هم گذاشتم که از دستورات linq استفاده کرده ام به چند طریق جستجو با دستورات و نام خانوادگی مشتری

و اما فرم سفارش
1. دیتا گرید به bsorderdetails متصل کردم اما productName نیامد تو ستون های گرید؟
2. اخرش تو قسمت AddProductToCurrentOrderDetail به مشکل بر خوردم که نفهمیدم چه کنم 

اینهم کدهای من : امیدوارم نظر بدهید و مشکلات من را توضیح بدهید 
http://s2.picofile.com/file/7242996020/Store1.rar.html

----------


## masoud_z_65

یه سوال از استادان بزرگوتر.....
من درمورد entity Framework دارم کتاب آقای راد رو میخونم

میخواستم ببینم کدوم روش رو اجرا کنم؟
Database First  یا  Model First?

به نظر خودم که model First خیلی روش بهتریه چون اول مدلت رو تعریف میکنی و تمام طراحیاتو انجام میدی و بعدش خودش برات بانک رو طراحی میکنه

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

و باز هم سپاس فراوان

----------


## gwbasic

> سلام 
> آموزش سوم خیلی سخت بود و هم خیلی عالی خیلی چیزا فهمیدم و خیلی چیزا را یاد نگرفتم 
> کدها را مانند کدهای آقای مدیر سعی کردم بنویسم اما باز مشکل داشتم 
> در قسمت طراحی بانک اگر به اشتباه فیلدی را تعریف کرده و می خواهم تغییرات اعمال کنیم دوباره و ذخیره کنیم با پیغام ذخیره ای روبه رو می شویم که savetext داره حتما متوجه شدید کدام پیغامه اون را داخل sql server 2008 یک تیک داشت که بر میداشتی دیگه این پیغام نمیاد اما از داخل داخل ویژوال استودیو نمیدونم به چه طریق ؟


هنگامیکه تغییری روی ساختار جداول Local Database تون می دین ویا موارد مشابه بطور پیش فرض VS اجازه نمی ده ذخیره بشه برای اینکه VS از ذخیره جلوگیزی نکنه باید تیک مورد زیر را بر دارید:
Tools->Options->Prevent saving changes that require table re-creation



> 2. دومین مشکل من سر همین Attach و Detach خیلی سخته تا مفهوم درک کنم شاید به دلیل اینه که من از ساختار struct درک درستی ندارم همچنین این get و set همیشه استفاده میکنم اما هیچ موقعه نفهمیدم چی هستند


وقتی موجودیتی در objectContex قرار دارد OC هوشمندانه تغییرات آن را متوجه شده و با SaveChanges در DB ذخیره می کند. Attach موجودیتی رو به Context اضافه می کند و Detach خارج می کند. برای کار با EF حتما باید مفاهیم رو خوب بلد باشید (کتاب بخونید) احتمالا در آبنده به آموزش EF خواهم پرداخت



> 1. دیتا گرید به bsorderdetails متصل کردم اما productName نیامد تو ستون های گرید؟


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



> 2. اخرش تو قسمت AddProductToCurrentOrderDetail به مشکل بر خوردم که نفهمیدم چه کنم


چه مشکلی؟



> یه سوال از استادان بزرگوتر.....
> من درمورد entity Framework دارم کتاب آقای راد رو میخونم
> 
> میخواستم ببینم کدوم روش رو اجرا کنم؟
> Database First  یا  Model First?
> 
> به نظر خودم که model First خیلی روش بهتریه چون اول مدلت رو تعریف میکنی و تمام طراحیاتو انجام میدی و بعدش خودش برات بانک رو طراحی میکنه
> 
> اما گفتم شاید این روش برای پروژه های بزرگ جواب نده
> ...


این دو مورد به لحاظ کار با DataBase‌ فرقی نمی کنند. مطمئن باشید برای پروِژه های بزرگ جواب می ده وگرنه من و امثال من هیچ وقت وقتمون رو صرفش نمی کردیم

----------


## Amir Oveisi

> میخواستم ببینم کدوم روش رو اجرا کنم؟
> Database First یا Model First?


به نظر من Code First

----------


## noroozifar

> ستون را به چی Bind کردید چک کنید متوجه می شید!!!


من کلا قسمت دیتا سورس دیتا گرید را به bsOrderDetails قرار داده ام و خود bsOrderdetail قسمت دیتا سورس را به models.orderDetails داده ام ولی ستون prodoctname نداشت 




> . اخرش تو قسمت AddProductToCurrentOrderDetail به مشکل بر خوردم که نفهمیدم چه کنم


این هم مشکل که کدها و خطا در یک فایل تکست زمینه کردم :
error.rar

کل کدها و فایلها در لینک قبلی من هستش که منتظرم ببینم کجا و تو چه کدهای اشتباه کردهام یا بهتر کدها را به چه طریق بنویسم؟
کتاب چی بخونم یک کتاب معرفی کنید ؟

با تشکر از مدیر محترم

----------


## gwbasic

از یه برنامه نویس توقع می ره که بتونه دیباگ کنه و مشکلو پیدا کنه! بیشتر سعی کن
کتاب Appress.Pro.Entity.Framework.4.0 رو می تونی بخونی حجمش خیلی کمه

----------


## noroozifar

خیلی دید زدم متوجه خطام نمیشم ؟ :اشتباه:

----------


## gwbasic

من کدتو دیدم توی اون  قسمت مشکلی  نداشت!!! به هر صورت بعد از آموزش بعدی کد رو خواهم گذاشت میتونی مقایسه کنی

----------


## amir3321

با سلام خدمت جناب gwbasic 
من یک کوئری با linq نوشتم و مقدار اون و به دیتا سورس dgv پاس کردم ولی در  این حالت متد autosort در dgv  که بصورت پیش فرض در dgv قرار دارد غیر  فعال می شود می خواستم بدونم چطور می تونم با تغییر در نوع کوئری این مشکل  رو حل کنم مثلا تبدیل کوئری به دیتاتیبل  
البته این مشکل رو من در یک تاپیک جدا هم نقل کردم در صورت اضافه بودن حذف نمائید

----------


## gwbasic

> با سلام خدمت جناب gwbasic 
> من یک کوئری با linq نوشتم و مقدار اون و به دیتا سورس dgv پاس کردم ولی در  این حالت متد autosort در dgv  که بصورت پیش فرض در dgv قرار دارد غیر  فعال می شود می خواستم بدونم چطور می تونم با تغییر در نوع کوئری این مشکل  رو حل کنم مثلا تبدیل کوئری به دیتاتیبل  
> البته این مشکل رو من در یک تاپیک جدا هم نقل کردم در صورت اضافه بودن حذف نمائید


اگر کلاسی تعریف کرده (مثلا Person) و لیستی از این کلاس ایجاد کنیم و آن را به DataGridView مان Bind کنیم بدلیل اینکه این لیست قابلیت Sorting را بطور پیش فرض ندارد بنابراین Sort گرید هم (از طریق کلیک کردن روی عنوان ستون) عمل نخواهد کرد. برای حل این مسئله دو راه وجود دارد (و شاید بیشتر) یکی اینکه BindingList خاص تعریف کنیم با قابلیت Sorting که کمی پیچیده هست و راه دیگر که راه ساده تری هست خودمان رویداد ColumnHeaderMouseClick مربوط به DataGridView را هندل کنیم:

private void myDataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
  {
     DataGridViewColumn column = myDataGridView.Columns[e.ColumnIndex];

     _isSortAscending = (_sortColumn == null || _isSortAscending == false);

     string direction = _isSortAscending ? "ASC" : "DESC";

     myBindingSource.DataSource = _context.MyEntities.OrderBy(
        string.Format("it.{0} {1}", column.DataPropertyName, direction)).ToList();

     if (_sortColumn != null) _sortColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
     column.HeaderCell.SortGlyphDirection = _isSortAscending ? SortOrder.Ascending : SortOrder.Descending;
     _sortColumn = column;
  }


منبع

----------


## amir3321

با سلام
من کد شما رو چک کردم ولی نتونستم ازش استفاده کنم میشه یکم در باره _sortColumn  توضیح بدهید که کجا ایجاد می شود و از کجا خوانده می شود این sortColumn_   همانند  column می باشد یعنی همان سلول کلیک شده در هدر ان جهت عملیات sort است 
من یک نوع column  در بیرون و در داخل  از متد ایجاد کردم که در هر دو حالت جواب نگرفتم  و فقط شکل عملیات sort  در هدر سلول تغییر می کرد 
در مورد پاس کردن query  که sort شده بوسیله بایندینگ است ایا باید بعد از این عمل دوباره دیتا را در dgv  لود کنیم یا خود بایندینگ این عمل رو انجام می دهد 
ممنون می شوم یک کم راهنمای فرمایید
 bool _isSortAscending = false;
        DataGridViewColumn _sortColumn;
        private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
         DataGridViewColumn column = dataGridView1.Columns[e.ColumnIndex];
                     
     _isSortAscending = (_sortColumn == null || _isSortAscending == false);
 
     string direction = _isSortAscending ? "ASC" : "DESC";
 
   bindingSource1.DataSource = db.part.OrderBy(
        string.Format("it.{0} {1}", column.DataPropertyName, direction)).ToList();
   
     if (_sortColumn != null) _sortColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
     column.HeaderCell.SortGlyphDirection = _isSortAscending ? SortOrder.Ascending : SortOrder.Descending;
    
     _sortColumn = column;
  
        }

 siepoldEntities db = new siepoldEntities();
        private void button1_Click(object sender, EventArgs e)
        {
            
            
          
            var query = from p in db.part
                       
                        select p; 
      
            bindingSource1.DataSource = query.ToList();
            dataGridView1.DataSource = bindingSource1.DataSource;
        }

----------


## notepad

سلام بر همه دوستان
من یه مشگلی که دارم اینه که پروژه هر کی و اجرا می کنم این خطا رو بهم میده.
The underlying provider failed on Open.
امکان راهنمایی هست؟

----------


## gwbasic

> سلام بر همه دوستان
> من یه مشگلی که دارم اینه که پروژه هر کی و اجرا می کنم این خطا رو بهم میده.
> The underlying provider failed on Open.
> امکان راهنمایی هست؟


همیشه وقتی Exception ای اتفاق میافته از پنجره باز شده  روی View  Details کلیک کنید و Inner Exception رو بررسی کنید تا جزئیات بیشتری از خطا رو ببینید. در صورتیکه در Message مربوط به InnerException خطای A network-related or ... رو می بینید به احتمال زیاد سروسی SQL شما Stop هست و باید آن را Start کنید. روی Start کلیک کرده Run را باز کنید و Services.msc را تایپ کنید در پنجره باز شده SQLExpress را انتخاب کرده و Start کنید

----------


## amir3321

با سلام 
استاد خیلی  دنبال حل مشکل گشتم ولی تو تمام فرومها این مشکل همینطور پا برجا بود می تونم با ساختن یک datatable  و ریختن اطلاعات کوئری بصورت رکورد به رکورد داخل آن بوسیله foreach مشکل رو حل کنم ولی مقداری افت زمانی دارم که البته تا زیر 20الی 30 هزار رکورد قابل ملاحظه در شبکه معمولی نیست ولی بالاتر از اون یکم خودش رو نشون می دهد در روش شما هم هر بار برای sort  یک کوئری اجرا مکنه و نتیجه رو به بایندینگ پاس می کنه آیا روش من اصولی بنظر می رسه یا نه 
در linq to sql شما در متد کوئری خودتون یک query.copytodatatable دارید و این خیلی راحت این مشکل رو حل می کنه ولی در linq to entity  وجود ندارد
خواهشا راهنمایی فرمائید

----------


## linux

> با سلام 
> استاد خیلی  دنبال حل مشکل گشتم ولی تو تمام فرومها این مشکل همینطور پا برجا بود می تونم با ساختن یک datatable  و ریختن اطلاعات کوئری بصورت رکورد به رکورد داخل آن بوسیله foreach مشکل رو حل کنم ولی مقداری افت زمانی دارم که البته تا زیر 20الی 30 هزار رکورد قابل ملاحظه در شبکه معمولی نیست ولی بالاتر از اون یکم خودش رو نشون می دهد در روش شما هم هر بار برای sort  یک کوئری اجرا مکنه و نتیجه رو به بایندینگ پاس می کنه آیا روش من اصولی بنظر می رسه یا نه 
> در linq to sql شما در متد کوئری خودتون یک query.copytodatatable دارید و این خیلی راحت این مشکل رو حل می کنه ولی در linq to entity  وجود ندارد
> خواهشا راهنمایی فرمائید


30 هزارتا رکورد را لود می کنی میگذاری جلوی کاربر ننه مرده که باحاش چی کار کنه؟

----------


## amir3321

> 30 هزارتا رکورد را لود می کنی میگذاری جلوی کاربر ننه مرده که باحاش چی کار کنه؟


30 هزار رکورد رقم کوچکی برای unit test  می باشد در ضمن موقعی که با ارقام زیاد اطلاعات کار می کنی این رقم ها خیلی کوچیکه بعضی وقتها پیش میاد نیاز به لود این حجم اطلاعات جهت گزارشات و محاسبه داری ولی اولویت در لود اطلاعات جهت کاربر همیشه در paging  می باشد 
استاد راهنمایی نفرمودید

----------


## gwbasic

در مورد  sort کردن داده پشت DataGridView در درجه اول داده هاتون رو از DB خوانده و در لیست قرار می دهید و در سپس لیست رو به BindingSource و در نهایت  BindingSource رو به DGV بایند می کنید
برای Sort‌هم  طبق پست قبلی عمل می کنید منتها اون لیست را Sort می کنید (بدیهی هست که نباید دیتا رو دوباره مرتب شده از DB گرفت) البته مرتب کردن لیست چند روش داره که یکیش به صورت زیر هست:

private bool _isSortAscending;
private DataGridViewColumn _sortColumn;
private void dgvCustomer_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    DataGridViewColumn column = dgvCustomer.Columns[e.ColumnIndex];
    _isSortAscending = (_sortColumn == null || _isSortAscending == false);
    string direction = _isSortAscending ? "ASC" : "DESC";
    if(_isSortAscending)
        CustomerBS.DataSource = Customers.OrderBy(c => c.GetType().GetProperty(column.DataPropertyName).G  etValue(c, null));
    else
        CustomerBS.DataSource = Customers.OrderByDescending(c => c.GetType().GetProperty(column.DataPropertyName).G  etValue(c, null));
    if (_sortColumn != null) _sortColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
    column.HeaderCell.SortGlyphDirection = _isSortAscending ? SortOrder.Ascending : SortOrder.Descending;
    _sortColumn = column;
}


من سر نخ رو بهتون دادم باقیش دیگه با خودتون بود که دقیقا نیازتون رو براورده کنید!!!

در مورد داده های زیاد هم منطقی نیست که کل داده ها رو بخواهید در گرید نمایش بده کاربر نیازی به این همه دیتا نداره! نمی تونه استفاده درستی از داده ها به این شکل ببره. برحسب نیاز می تونید داده ها رو مثلا 100 تا 100 تا به Load کنید Linq این امکانو با استفاده از Skip و Take می ده و یا اینکه امکان جستجو در فرم رو به کاربر بدید که بر اساس یکسری فیلد ها که کاربر پر می کنه داده ها از DB‌خوانده بشه.

امیدوارم جوابتون رو گرفته باشید و اجازه بدید تاپیک روند خودشو طی کنه 

موفق باشید

----------


## notepad

با سلام خدمت استاد گرامی
از راهنمایی شما بی نهایت سپاسگزارم . اما با اینکه sqlexpress رو هم start کردم بازم به متد savechanges خطایی میده که innerException آن 
An error occurred while preparing the command definition. است.
بازم به خاطر زحماتتون ممنون

----------


## gwbasic

> با سلام خدمت استاد گرامی
> از راهنمایی شما بی نهایت سپاسگزارم . اما با اینکه sqlexpress رو هم start کردم بازم به متد savechanges خطایی میده که innerException آن 
> An error occurred while preparing the command definition. است.
> بازم به خاطر زحماتتون ممنون


 این خطا فرق می کنه با خطای قبلی پروژتون رو بذارید اینجا ببینم

----------


## Abolfazl.programmer

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

ممنون

----------


## noroozifar

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


منم همین مشکل را داشتم این بر میگرده به ویرایش کد که با هر بار ویرایش کد ویژوال استودیو بانک را ریفرش میکنه اگر می خواهی این مشکل حل بشه باید داخل فایل app محل قرار گرفتن بانک را در Connectionstring به ادرس محل پروزه تغییر بدید .. البته بعد از اتمام کامل پروژه باید دوباره این آدرس را به حالت اول بر گردانی وگرنه پروژه کار نمیکنه الان باید ادرس تقریبا به این حالت باشه داخل فایل app :
 <add name="StoreDBEntities" connectionString="metadata=res://*/StoreModels.csdl|res://*/StoreModels.ssdl|res://*/StoreModels.msl;provider=System.Data.SqlClient;pro  vider connection string=&quot;Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector  y|\StoreDB.mdf;Integrated Security=True;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
من تغییرش دادم به این :
<add name="StoreDBEntities" connectionString="metadata=res://*/StoreModels.csdl|res://*/StoreModels.ssdl|res://*/StoreModels.msl;provider=System.Data.SqlClient;pro  vider connection string=&quot;Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Store\Stor  eDB.mdf;Integrated Security=True;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

حالا مشکل حذف رکوردهای که برای تست ایجاد کردم ندارم و در نهایت که پروژه کامل شد ان را به صورت اول بر میگردانم  اگر اینکار انجام نشود کل پروژه بهم میریزه

چند پست قبل هم آقای مدیر توضیح داده اند می تونی بر گردی ببینید

----------


## notepad

سلامی مجدد خدمت استاد گرامی
ببخشید اگه کمی دیر شد...

فقط این نکته رو بگم که چون متد savechanges مشکل داشت فعلا توی فورم customer هستم
 :لبخند:

----------


## amir3321

استاد ما منتظر ادامه آموزش هستیم میشه یک لطفی بکنید و درباره نحوه بکارگیری dialogresult جهت دریافت اطلاعات از فرم دوم یکم توضیح بدهید چون هنوز سورس دوتا ویدیو اخر رو نزاشتید من نتونستم این موضوع روخوب بفهم اگه خواستیم چند رکورد رو انتخاب کنیم چطور یعنی به حالت یک لیست از رکورد ها شاید من درست متوجه نشدم .
با تشکر

----------


## soroush_man_hd

Error 1 Error 2019: Member Mapping specified is not valid. The type 'Edm.Guid[Nullable=False,DefaultValue=]' of member 'id' in type 'moshakhasatdbModel.moshtb' is not compatible with 'SqlServer.int[Nullable=False,DefaultValue=,StoreGeneratedPattern  =Identity]' of member 'id' in type 'moshakhasatdbModel.Store.moshtb'. E:\formmoshakhasate gozinesh\frommoshakhasat\WindowsFormsApplication1\  Model1.edmx 46 13 WindowsFormsApplication1


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

----------


## gwbasic

ببخشید دوستان که هنوز نتوستم آموزش بعدی رو آماده کنم. فعلا انرژی لازم رو برای ادامه کار ندارم تا مدتی شاید نتونم مطلب آموزشی جدیدی بذارم!!!

@notepad : کد شما بدرستی اجرا میشه! مشکلی نداره

@soroush_man_hd : برای مشخص کردن کلید اصلی باید از یک تایپ استفاده کنید Guid یا int . اگر Guid انتخاب کردید باید سمت database‌ جنس کلید اصلی رو uniqueidentifier انتخاب کنید
مشکل شما اینجاست که سمت database کلید اصلی رو int انتخاب کردید و در مدلتون Guid انتخاب کردید که به هم نگاشت نمی شوند.

باز هم عذر خواهی می کنم از همه دوستان

----------


## noroozifar

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

----------


## noroozifar

سلام دوباره
اقای مدیر من امروز برنامه فرم product را اجرا کردم و یک مشکل هست زمانی که مقادیر را وارد میکنیم و مقدار price که در ابتدا 0 هستش را پاک میکنیم و به جای ان حروف مثلا a به جای عدد وارد میکنیم و بر روی ذخیره کلیک میکنیم عمل ذخیره بدون پیغام خطا انجام میشه در صورتیکه نوع ما از نوع int هستش پس چرا کاراکتر قبول کرد و پیغام خطا نداد البته داخل بانک چیزی ذخیره نمی شود ؟؟؟

----------


## zayens

فیلم هایی که برای آموزش گذاشتین توی:

https://barnamenevis.org/showthread.p...AD%D9%84%D9%87

همه فیلترن!
جای دیگه میشه آپلود کنین؟

----------


## noroozifar

ببخشید اموزش قسمت سه لایه را نمیدید  با استفاده از این روش

----------


## gwbasic

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

----------


## noroozifar

خوب ما که تا اینجا جلو امدیم باید چه کار کنیم ؟؟؟؟  کجا را مطالعه کنیم برای یادگیریش ؟ پست شماره 127 را یک نگاه بندازید پاسخ اون سئوالم هنوز مانده

----------


## حمیدرضا1

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

----------


## shocraneh

با سلام من یک هفته ای میشه که کار رو EF رو شروع کردم. شکر خدا با کمک دوستان تونستم کدهایی رو که همیشه تو پروژه هام داشتم رو پیاده سازی کنم .فقط دو تا سوال باقی موند که دوستان منو به این تاپیک ارجاع دادن.که با بررسی تاپیک های مربوطه سوالات زیادی به ذهنم اومد و البته چند تا اررور تو پروژه؟احیانا دوستان پروژه کامل این بحث رو ندارن؟ممنون از دوستانی که این تاپیک ها رو راه میندازن

اجازه بدین چندتا از سوالتمو همین جا بپرسم؟
1-من از navigator  استفاده نمی کنم و خودم با دکمه این روش رو پیاده سازی میکنم.که البته تو EF به مشکل خوردم.توتاپیک هامدیر navigator رو بهتردونستن .ایا برای پروژه های تجاری navigator از نظر ظاهر تو دید کاربر مشکل نداره؟
2-تو روش کلاسیک چند لایه کار میکردم .بعد از کار با با EF احساس کردم به دلیل جلوگیری از کندشدن سرعتو اینکه کدها خواناتراز روش کلاسیک هستند ، دیگه نباید از این روش استفاده کرد.الان برام سواله واقعا چندلایه بودن اینجا مفیده؟

----------


## shocraneh

> سلامی مجدد خدمت استاد گرامی
> ببخشید اگه کمی دیر شد...
> 
> فقط این نکته رو بگم که چون متد savechanges مشکل داشت فعلا توی فورم customer هستم


 من اینارو دانلود کردم .همون فایلهایی بود که مدیر تو آموزش های ابتدایی رو سایت گذاشته بودن درسته؟؟(دوبرنامه تو شروع کار)پس چرا تو چند لینکه؟ من تغییری توش ندیدم؟؟

----------


## shocraneh

باسلام من این برنامه رو از روآموزش هاش دنبال کردم.من BindingSource رو تو کدتعریف کردم.
1.  private void Initialize(Order order)
        {
            contex = new StoreDBEntities();
            if (order == null)
            {
                this.Order = new Order();
                contex.Order.AddObject(this.Order);// add 
            }
            else
            {
                this.Order = order;
                contex.Order.Attach(order);
                order.OrderDetail.Load();
            }
            if (this.Order.Date == DateTime.MinValue)
                this.Order.Date = DateTime.Now;

            bsOrder = new BindingSource();
            bsOrder.DataSource = order;
            bsOrderDetail = new BindingSource();
            bsOrderDetail.DataSource = bsOrder;
           // bsOrderDetails.DataMember = "OrderDetail";
            bsCustomer = new BindingSource();
            bsCustomer.DataSource = bsOrder ;
          //  bsCustomer.DataMember = "Customer";
            //,false, DataSourceUpdateMode.Never       false, DataSourceUpdateMode.OnPropertyChanged
           // txt_customer.DataBindings.Add("Text", bsCustomer, "FullName");

        }
از DataMember  ها خطا میده

 2. رووی فرم order برای انتخاب مشتری، رو کلیک دکمه
 CustomerForm f = new CustomerForm(); //instance
            DialogResult  Result= f.ShowDialog ();
            if (Result == DialogResult.OK)
            {
            contex.Customer .Attach (f.SelectedCustomer);
            Order.Customer = f.SelectedCustomer;
            }
حالا روی فرم مشتری،  .اینو نوشتم
Customer customer = new Customer();
        public Customer SelectedCustomer
        {  
            get
            {
             
                Customer customer = bsCustomers.Current as Customer;
                return customer;
            }

            set { customer =value ; }
        }
برای رفرش دیتاگرید چی کارکنم.برای باردوم خطا میده

----------


## shocraneh

باسلام . من این پروژه رو از روی آموزش ها ساختم و روی یه تاپیک آپلود کردم و سوالاتم رو پرسیده بودم ولی نمی دونم را مدیران حذفش کردند؟!!!! بهتره همین جا بزارمش
فرم ثبت سفارش مشکل داره :آموزش فایل آخر.برام مهم نیست دوستان دیتاست ها رو روی فرم یا تو کد معرفی کنند . خلاصه مهم اینه که گرید اطلاعات رو نشون بده و سفارش ثبت بشه(حتی تو حالتی که در فایل های آموزشی بود bsOrder  تو کد معرفی شده بود حالا چه تو گرید رو تو محیط دیزاین به dsOrder Detail  که البته Datasource  اون bsorder  بودband  کرده بودند؟) تا یادم نرفته برای انتخاب مشتری یه دکمه رو فرم کاستومر گذاشتم فعلا دوستان از همون دکمه استفاده کنند

----------


## shocraneh

با سلام من خیلی سرچ کردم دوستان لطف کنند مارو هم راه بندازند . مشکل اصلی من نمایش اطلاعات توی گرید است.چه طوری وقتی منبع داده اصلی ما که dsorder  است تو محیط کد معرفی شده ، روی محیط دیزاین کالمن های گرید رو تونستند به به اون بایند کنند

----------


## shocraneh

باتشکر که سورس رو قراردادید انشاا.. دوستان در نظرسنجی شرکت کنند. فقط یه مشکل هست
اولین رکورد رو درست ثبت میکنه ولی دومین سفارش رو پیغام An error occurred while updating the entries. See the inner exception for details میده.مشکل چیه؟

----------


## gwbasic

> باتشکر که سورس رو قراردادید انشاا.. دوستان در نظرسنجی شرکت کنند. فقط یه مشکل هست
> اولین رکورد رو درست ثبت میکنه ولی دومین سفارش رو پیغام An error occurred while updating the entries. See the inner exception for details میده.مشکل چیه؟


ببینید هر وقت با چنین خطایی مواجه شدین به Inner Exception‌ نگاه کنید اونجا احتمالا پیغام دقیقتری می بینید.
مراحلی رو که انجام می دید تا به خطا می خورید رو با جزئیات کامل بنویسید تا من تست کنم

----------


## samadblaj

ممنونم آقای gwbasic لطفا اگه امکانش هست به آموزش ها ادامه بدید تا بلا تکلیف نمونه من که خیلی حال کردم با این آموزش ها خیلی روان و مفید هستش.

----------


## shocraneh

باسلام وتشکر راستش نتونستم خطایابی کنم.
 برای باراول که جدول orderdetail خالیه عمل ثبت سفارش رو انجام میده .اما برای ثبت رکورد بعدی(حتی با run مجددپروژه)در قسمت   context.SaveChanges خطا میده .خط به خط که میرم هر سه bs مقدار گرفته اند. (البته عمل ویرایش به درستی انجام میشه. )
یه سوال دیگه که برام مطرحه در تابع AddProductToCurrentOrderDetails وقتی میگیم محصول قبلا تو کانتکس نباشه ،مگه معنیش این نیست که برای مشتری جاری این محصول رو انتخاب نکرده باشیم ؟! تو اجراهای من تحت هر شرایطی  product = obj as Product  اجرا میشه .توجه اگه بکنید متوجه میشید اگه بخایم به لیست سفارش ثبت شده قبلی هم یک قلم دیگه اضافه کنیم ، بعد از انتخاب محصول  تو دو تارکورد از گرید محصول رو میزنه و بعد از ثبت سفارش دوباره همون پیغام خطا میاد

----------


## shocraneh

باسلام  شرمنده من مدل رو جنریت کرده بودم ولی حواسم به باگ مربوط به تنظیم identity نبود.یه چیز جالبی که بهش برخورد کردم: من id  هامو int  گرفتم و تو اسکیوال identity  کردم . دراین حالت نمی دونم واقعا چرا
 sum += orderdetail.Price * orderdetail.Count;   با خطا مواجه میشه نوع هردو ورودی int32و خروجی هم int32 معرفی شده .خطا:     Cannot implicitly convert type 'int?' to 'int'. An explicit conversion exists (are you missing a cast?)         
2- در   OrdersForm_Load:این کدرولطفا توضیح بدید Orders = context.Order.Include("Customer").ToList();
3-سوالم راجع به AddProductToCurrentOrderDetails روهنوز متوجه نشدم(تاپیک قبلی)

----------


## gwbasic

ببینید یکی از خصوصیات برنامه نویس پیگیر بودن و سمج بودن ولی هیچ وقت نباید مطالعه اصولی فراموش بشه و همیشه الویت ها باید رعایت بشه منظورم اینه که اگه شما یکسری مفاهیم پایه ای رو ندونید در حل مشکلات زمان زیادی رو باید صرف کنید که براتون حتما آزار دهنده خواهد بود.
1- ربطی به identity نداره اگه به متن خطا دقت کنید متوجه می شید موضوع چیه؟ شما احتمالا Count یا Price رو nullable در دیتابیس تعریف کردین که در این صورت هنگام تولید مدل پراپرتی ای از جنس nullable تعریف می شه و باقیه ماجرا

2-  کافیه معنی Include رو در EF بررسی کنید و همچنین Lazy Loading

3- با کدی که من بهتون دادم اجرا کنید بعید می دونم اضافه کردن یک قلم به سفارشی که قبلا ذخیره شده اشکالی ایجاد کنه چون وقتی سفارشی Load میشه اقلام سفارش در Context قرار می گیرند. بنابراین نباید مشکلی باشه. اگه این مورد مشکلی داشت با جزئیات بگید تا بررسی کنم

----------


## shocraneh

باتشکراز توجهتون .آره خطایابی مسئله مهمیه .من در حدی میدونم که برام پیش اومده وتجربه کردم..آیا منبعی هست که بتونه در این زمینه کمک کنه؟ممنون 1-تودیتابیس تنظیم بودولی تو مدلNullable=nounبود.حالا با Nullable=false یه قسمت دیگه کدهمین  خطا رو میده  درتابع AddProductToCurrentOrderDetails قسمت od.Price = product.Price.اصلا چرا با وجود اینکه فیلد قیمت مقدار داره باید به نال بودن یا نبودن حساس باشه؟ 2-من این قسمت رو با مقادیر متفاوت اجرا کرده بودم ونتیجه رو هم دیدم.حتی بدون این تکه کد. ولی درک این قضیه که چرا "Customer"جواب درست میده؟ آخه ما لیست سفارش میخایم ،مشتری چرا! 3-به گمونم سوالم رو درست مطرح نکردم .ثبت به درستی انجام میشه منظورم این بود که کدelse       context.Product.Attach(product  اینجا ضرورتی نداره .(به عبارت بهتر دراینجا هیچ وقت  این خط اجرا نمیشه.درسته؟)

----------


## gwbasic

در فرم Orders‌ لیست سفارشات نمایش داده می شه و هر سفارشی برای یک مشتری هست بنابراین نیاز هست که اطلاعات مشتری برای هر سفارش هم بارگذاری شود تا بتوان آن را نمایش داد ستون مشتری بر اساس مشخصات Customer‌ پر می شه بنابراین نیاز هست که Load‌ بشه

اما در مورد Attach کالا:
اگر Attach انجام نشه Product‌ انتخاب شده در فرم Product‌ به عنوان موجودیت جدید در نظر گرفته می شه و هنگام ذخیره یک رکورد جدید از Product با مشخصات قبلی و Id‌جدیدی ایجاد می شه پس بنابراین باید Attach‌کرد تا object service‌ بتونه تشخیص بده که این موجودیت جدید نیست ولی اینکه قسمت else‌اجرا نمی شه حق با شماست وقتی TryGetObjectByKey‌ استفاده می شه باعث میشه که ابتدا product‌در داخل context‌جستجو بشه و اگه موجود نبود اون رو از database‌ می خونه و این باعث می شه که خود بخود Attach صورت بگیره بنابراین نیازی به else‌ نیست البته این مورد دوم که باعث می شه product دوباره از DB خونده بشه زیاد جالب نیست که باید اصلاح بشه ولی کد بدرستی وظیفش رو انجام می ده

----------


## shocraneh

با تشکر . نمیدونم این تاپیک ها تا کجا ادامه پیدا میکنه و قراره موضوع بعدی چی باشه؟ راستش لیست فازهای پروژه رو که نگاه میکردم ،دیدم فاز 2 گزارش است   گزارش باlinq تو همین سایت بحث شده (شکرخدا کدش هم جواب میده).
من تو روش کلاسیک چندلایه کارمیکنم آیا اساتید اجازه میدن من یک فرم با استفاده از چندلایه ای بزارم تا راجع به ایرادات احتمالیش بحث بشه؟ اگه نظرمثبته بگید موضوع فرم جدید چی باشه .پیشاپیش ممنونم

----------


## gwbasic

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

----------


## shocraneh

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

----------


## gwbasic

یکی از مواردی که منو واقعا دلسرد کرد از ادامه کار عدم دقت و توجه دوستان بود. تصور می کنم اصلا ویدیویی ندیدن فقط یکسری کد دیدن که دلیلشو نمی دونن برای چی نوشته شده !!!

دوستان این یک پروژه بود که شما طریقه کدنویسی رو در عمل ببینید. و مخاطبینشم برنامه نویس های با تجربه هست نه کسی که به لحاظ فنی در سطح پایینی قرار داره. برنامه نویس با تجربه برنامه نویسی هست که به تکنولوژی های مختلف آشنا هست مثل ADO.NET , Entity framework , Nhibernate  و سوکت پروگرامینگ و چه می دونم هر چیزی که شما فکرش رو بکنی. اما یک برنامه نویس با تجربه لزوما یک برنامه نویس حرفه ای و قدرتمند نیست.یک برنامه نویس حرفه ای لزوما چه می دونم WPF نمی دونه و یا هزارو یک چیزه دیگه در عوض برنامه نویس حرفه ای اصول برنامه نویسی رو می دونه. اون می دونه که اصول کد نویسی چی هست. اون به ساده ترین شکل ممکن کد می نویسه. کدی که می نویسه برای هر کسی قابل فهم هست و اصول SOLID رو کاملا آگاه هست Design pattern ها رو به خوبی می دونه و می دونه که چه زمانی باید ازشون استفاده کنه

من نه EF آموزش دادم نه DataBinding و BindingSource ولی در عمل نشونتون دادم که چطور استفاده کنید. در عوض توقع دارم که این مفاهیم رو بدقت بررسی کنید. تعجب می کنم که با وجود BindingSource دوباره از BindingContext استفاده کردین. این نشون می ده که اصلا متوجه کاربردش نشدید. بقدری کدتون ایراد داره که نمی دونم چی باید بگم فقط توصیه می کنم چندبار دیگه ویدیو رو ببینید و با هر مفهومی مشکل داشتین بررسیش کنید.

----------


## gwbasic

> البته من فایل های ویدویی رو دنبال کردم .دلیل استفاده نکردنم از BindingSource اینه که  شکل ظاهری جالبی به فرم نمیده .


BindingSource یک کامپوننت هست که عمل Binding رو تسهیل می کنه. و ربطی به UI نداره. متوجه منظورتون نشدم.
اگه منظورتون BindingNavigator هست در مورد اونم توضیح دادم شما ظاهرش رو به هر شکلی که دوست دارید می تونید تغییر بدید

----------


## shocraneh

باسلام وتشکر
من برنامه روعوض کردم .البته یک سری ایرادات هنوز داره.لطفا دوستان نظر بدن 
  ابتدا نام مدرس رو ثبت میکنه وبعد  برنامه کلاسی مدرس رو مشخص میکنه(دکمه لیست کلاسها)                         
1-(فرمی که بدون نویگیتورکارشده)مشکل اصلی اینه که موقع ذخیره خطای The changes to the database were committed successfully, but an error occurred while updating the object context. The ObjectContext might be in an inconsistent state. Inner exception message: AcceptChanges cannot continue because the object's key values conflict with another object in the ObjectStateManager. Make sure that the key values are unique before calling AcceptChanges.رو میده . البته توی بانک ثبت میشه . اگه دلیل خطارو بخام مختصرا بگم
 private void Initialize()
        {
             bsteacher.DataSource = context.Tbl_teacher;
              bslist.DataSource = bsteacher;
            bslist.DataMember = "Tbl_list";
              }
خطا هنگام ثبت مدرس
private void Save()
        {
             bsteacher.EndEdit();
             bslist.EndEdit();
               context.SaveChanges(); 
         }من باید ابتدا مشخصات مدرس رو ثبت کنم ،بعد براش کلاس تعریف کنم .ولی فکرمیکنم دلیل خطا اینه که این وابستگی براش مشخص نشده
2-برای بهینه شدن فرم frm_listچه روشی رو پیشنهاد میدید؟

----------


## shocraneh

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

----------


## arman1371

سلام
من با آموزش های در اینجا شروع کردم به ساخت نرم افزاری واسه مشاور املاک
متاسفانه مشکلی که دارم اینه که تو همه ی فرم هام وقتی مقداری رو واسه ویرایش میزنم و مقدار داخل فیلد رو عوش میکنم و بعدش انصراف رو میزنم تابع CancelEdit بایندینگ سورس به درستی عمل نمیکنه و متغیر در دیتاگریدویو تغییر میکنه اما تو دیتابیس مشکلی نیست و برنامه به خوبی اجرا میشه
پروژمم میذارم که هم بقیه بتونن استفاده کنن هم اگه کسی فهمید مشکلم چیه بهم بگه.

----------


## shocraneh

> انصراف رو میزنم تابع CancelEdit بایندینگ سورس به درستی عمل نمیکنه و متغیر در دیتاگریدویو تغییر میکنه .


سلام  من هم این مشکل رو دارم .روی پروژه Store  تو فرم ProductrFormاین  اتفاق نمیفته ! اگه دقت کنید به محض اینکه از روی تکس خارج میشیم مقدار  گرید هم عوض میشه (اینجا اتفاقی که نباید میفته).
راستی می تونم بپرسم فرم املاک تون رو چه طوری اجرا میکنید؟؟
لطفا دوستان روی پروژه تاپیک 150 هم نظر بدند.ممنون

----------


## arman1371

سلام
تو پروژه مشاور املاک تو فرم منطقه برای رویداد کلیک دکمه btnAdd کدش یه مشکلی داشت که الان فهمیدم این کد صحیحش هستش
private void btnAdd_Click(object sender, EventArgs e)
        {
            BsMantaghe.AddNew();
            Mantaghe tempMantaghe = (Mantaghe)BsMantaghe.Current;
            tempMantaghe.Shahr = cmbShahr.SelectedItem as Shahr;
            AddOrEditMode = true;
        }





> راستی می تونم بپرسم فرم املاک تون رو چه طوری اجرا میکنید؟؟


منظورتونو نفهمیدم، این برنامه که هنوز کامل نیستش فقط جندتا فرم هستش و دیتابیس و مدل دیگه

----------


## shocraneh

سلام . به نظرمن این فرم ایراد داره .چرا از بیندینگ استفاده نکردید . ارسال بیندینگ سورس به این فرم ها چه ضرورتی داره؟
لطفا دوستان روی خطای تاپیک 150 هم بحث کنند .خیلی برام مهمه .

----------


## shocraneh

دوستانی که با EF  کارمیکنن بیزحمت یه نگاهی به برنامه من بندازند . خیلی عجله دارم .ممنون

----------


## shocraneh

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

----------


## samadblaj

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

----------


## shocraneh

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

----------


## arman1371

از دوستان کسی نمیدونه چرا تو بعضی کدها تابع CancelEdit بایندینگ سورس کار نمیکنه؟

----------


## vahidth

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

----------


## ali006

سلام 
راستش رو بخواید من زیاد #Cبلد نیستم و تازه کارم.میخواستم بانک اطلاعاتیش  رو خوب یاد بگیرم.ظاهرا خیلی گستردس.من قبلا دلفی خیلی کار کردم. تو دلفی  یه بانک اطلاعاتی BDE داشت که یه فیلتر درست میکردی و تمام جستجو ها و  فیلتر ها رو اعمال می کردی و جستجو رو میزدی تمام فیلتر ها رو اعم از تاریخ  و غیره اعمال می کرد و توی یه dbgrid نشون می داد.
حالا من یه همچین چیزی می خوام 						
من یه پروژه ساده می خوام که یه دیتابیس داره (SQL)که 2 آیتم تاریخ و نام رو داره.(نام دانشجو و تاریخ ثبت نام) 
حالا می خوام با یه فرم اطلاعات وارد کنم و با فرم دیگه جستجو و ویرایش و حذف کنم. 
*یه نکته خیلی مهم اینه که میخوام از قابلیت فیلتر استفاده کنم* و فیلتر هم می خوام برای تاریخ و هم برای نام کار کنه. 
مثلا از تاریخ فلان تا تاریخ فلان چه دانشجوهایی ثبت نام کردن یا در  تاریخ فلان چه دانشجو هایی با نام علی ثبت نام کردن .بازم میگم *با فیلتر کردن datagridview* میخوام این کار جستجو رو انجام بدم. 
اگه میشه ممنون میشم کمکم کنید

----------


## rahahost

با سلام به همه اساتید محترم .

بعنوان یک تازه کار که استارتشو با روش جالبی که در وب سایت شروع شده ، شروع کردم .

فیلم آموزشی رو دیدم و تقریبا  متوجه شدم توضیحات شدم اما مشکلی در برنامه وجود داره که نمیدونم کجایه کارو اشتباه انجام دادم .
موقعی که یک مشتری اضافه میکنم و دکمه Save رو میزنم ، عملیات ذخیره سازی انجام میشه اما اگر دو و یا بیشتر ، مشتری ایجاد کنم ، موقعی که دکمه Save رو میزنم ، با خطا روبرو میشم :
System.Data.UpdateException was unhandled
  Message=An error occurred while updating the entries. See the inner exception for details.
  Source=System.Data.Entity
  StackTrace:
       at System.Data.Mapping.Update.Internal.UpdateTranslat  or.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
       at System.Data.EntityClient.EntityAdapter.Update(IEnt  ityStateManager entityCache)
       at System.Data.Objects.ObjectContext.SaveChanges(Save  Options options)
       at System.Data.Objects.ObjectContext.SaveChanges()
       at Anbar_dari.Forms.CustomerForm.SaveChanges() in E:\Proje\C#‎\Anbar dari\Anbar dari\Forms\CustomerForm.cs:line 27
       at Anbar_dari.Forms.CustomerForm.tsbSaveAll_Click(Obj  ect sender, EventArgs e) in E:\Proje\C#‎\Anbar dari\Anbar dari\Forms\CustomerForm.cs:line 22
       at System.Windows.Forms.ToolStripItem.RaiseEvent(Obje  ct key, EventArgs e)
       at System.Windows.Forms.ToolStripButton.OnClick(Event  Args e)
       at System.Windows.Forms.ToolStripItem.HandleClick(Eve  ntArgs e)
       at System.Windows.Forms.ToolStripItem.HandleMouseUp(M  ouseEventArgs e)
       at System.Windows.Forms.ToolStripItem.FireEventIntera  ctive(EventArgs e, ToolStripItemEventType met)
       at System.Windows.Forms.ToolStripItem.FireEvent(Event  Args e, ToolStripItemEventType met)
       at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEven  tArgs mea)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ScrollableControl.WndProc(Mes  sage& m)
       at System.Windows.Forms.ToolStrip.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.O  nMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.W  ndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallba  ck(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchM  essageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.  System.Windows.Forms.UnsafeNativeMethods.IMsoCompo  nentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.Run  MessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.Run  MessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.Run(Form mainForm)
       at Anbar_dari.Program.Main() in E:\Proje\C#‎\Anbar dari\Anbar dari\Program.cs:line 18
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.Run  UsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(  Object state)
       at System.Threading.ExecutionContext.Run(ExecutionCon  text executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionCon  text executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.Data.SqlClient.SqlException
       Message=Violation of PRIMARY KEY constraint 'PK_Customer'. Cannot insert duplicate key in object 'dbo.Customer'.
The statement has been terminated.
       Source=.Net SqlClient Data Provider
       ErrorCode=-2146232060
       Class=14
       LineNumber=1
       Number=2627
       Procedure=""
       Server=\\.\pipe\4FAC4DBF-F7BD-40\tsql\query
       State=1
       StackTrace:
            at System.Data.SqlClient.SqlConnection.OnError(SqlExc  eption exception, Boolean breakConnection)
            at System.Data.SqlClient.SqlInternalConnection.OnErro  r(SqlException exception, Boolean breakConnection)
            at System.Data.SqlClient.TdsParser.ThrowExceptionAndW  arning()
            at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
            at System.Data.SqlClient.SqlCommand.FinishExecuteRead  er(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
            at System.Data.SqlClient.SqlCommand.RunExecuteReaderT  ds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
            at System.Data.SqlClient.SqlCommand.RunExecuteReader(  CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
            at System.Data.SqlClient.SqlCommand.InternalExecuteNo  nQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
            at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
            at System.Data.Mapping.Update.Internal.DynamicUpdateC  ommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues)
            at System.Data.Mapping.Update.Internal.UpdateTranslat  or.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
       InnerException: 

نمیدونم ایراد کارم کجاست !
لطفا راهنماییم کنید .
ممنونم .

----------


## gwbasic

طبق آموزش عمل نکردید خطا بطور واضح در این خط کد بیان شده :
Message=Violation of PRIMARY KEY constraint 'PK_Customer'. Cannot insert duplicate key in object 'dbo.Customer'
map ای که برای Id مشخص کردید و نوعی که برای Id مربوطه در Table رو بررسی کنید و طبق آموزش انجام دهید تا بطور اتوماتیک id توسط sql ساخته شود و Guid تکراری ایجاد نشود

----------


## rbrostam

سلام موقع اجرای سورسی که دانلود کردم این ارور رو میده فوری کمک کنید لطفا

----------


## hassan_kahrizy

سلام
هر کاری می کنم اطلاعات در دیتا بیس ذخیره نمی شه هیچ خطایی هم نمی ده
 () context.SaveChange
تو sql profiler هم می بینم وقتی savechange() اجرا می شه هیچ دستوری در دیتا بیس اجرا نمی شه
مشکل از کجاست؟
بنده از ویژوال استودیو 2012 استفاده می کنم
بدون دیتا بایندینگ کار می کنم با entity framework درست کار می کنم ولی نمی دونم مشکلش با دیتا بایندینگ چیه

----------


## gwbasic

طبق آموزش عمل نکردید یک بار دیگه بررسی کنید کجای کارتون ایراد داره. قطعا Binding تون ایراد داره به درستی ارتباط رو برقرار نکردید

----------


## kordestan

سلام بی زحمت لینک ویدئو هارو درست کنید ...هر چی میزنم رو لینک صحفه ی error ور میاره

----------


## madiseh

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

لطفا مدیران سایت بررسی کنند.....

----------


## hamide741

سلام ا دوتا آموزش اول دانلود نميشن اگه لينكشو درس كنيد  ممنون ميشم

----------


## gwbasic

فایلهای آموزشی رو در جای دیگری UpLoad کردم و لینک های جدید قرار داده شدند

----------


## مهدی هادیان2

بسم الله الرحمن الرحیم
با سلام
خواستم قسمت اول آموزش رو که مربوط به مشتری ست دانلود کنم ولی دانلود نشد؛ فقط پروژه دانلود شد. ویدئوها به صورت کامل دانلود نشد. تنها چند کیلو رو دانلود میکنه. 
با سپاس

----------


## مهدی هادیان2

بسم الله الرحمن الرحیم
با سلام
دوستان لطفا بفرمائید که شما می تونید دانلود رو به طور کامل انجام بدید یا نه؟ که ببینم مسئله از لینک هاست یا چیز دیگه ای است؟
با سپاس

----------


## مهدی هادیان2

بسم الله الرحمن الرحیم
با سلام
دوستان لطفا لینک های آموزشی رو دانلود کنید؛ ببینیم لینک مشکل داره یا نه؟
با تشکر

----------


## wolf_majid

من آموزش اول و دوم رو دانلود کردم مشکلی نبود

----------


## مهدی هادیان2

به نام خدا
از آقای wolf_majid تشکر میکنم که زحمت دانلود رو کشیدند.
امروز صبح دوباره امتحان کردم خداروشکر دانلود انجام شد.

----------


## yas3131

با سلام چطور میشه یک فایل رو آپلود کرد؟ ممنون

----------


## hojjjat

با سلام
من چندتا مشکل دارم
اول اینکه وقتی جدولی میسازم سیو میشه ولی دوباره ازت میخواد سیوش کنی!!!!یعنی ستاره بالای صفحه نمیره
دوم اینکه من تو قسمت add>data اون چیزای که شما میگین ندارم
Screenshot (10).jpg

----------


## momimomi

> فایلهای آموزشی رو در جای دیگری UpLoad کردم و لینک های جدید قرار داده شدند


سلام دوست من
آیا هنوزم آموزشاتون ادامه داره؟

----------


## حمیدرضا1

سلام.منم می خوام بدونم آموزش ادامه داره یا نه؟

----------


## gwbasic

سلام
نه متاسفانه این آموزش 2 سال پیش انجام شده و ادامه نداره. امیدارم فرصت و انگیزه کافی پیدا کنم در آینده آموزشی با تکنولوژی های جدید داشته باشم

----------


## ehsan.sunrise

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

----------


## Mohsen_Cisco1981

با سلام
من یه سوال داشتم ، آیا در اینتیدی فریم ورک میشود بدون این که بانک رو به سولوشن اضافه کنیم( یعنی مستقیم از خود sql server ) کار کنیم؟ :متفکر:

----------


## lovee20002002

سلام  دوستان من با آموزش مشکلی نداشتم و رو اکسپرس مار میکردم  ولی الان اومد رو Sql server 2012 و برنامه ای که میخوام بنویسم شبکه میشه مشکلی از جهت تعریف تیبیل و ساخت بایندینگ سورسم نبود فقط الان موندم چرا Savechanges عمل نمیکنه و سیو نمیشه حتی 2 تا تیبل بیشتر ندارم واسه تست یه Id و نیم و فمیلی زدم فقط تو رویداد load _ page هم تو ویژوال 2013 حتمان باید بایند سورس رو tolist بزارم و گرنه اررور میده و میپره بیرون 
ممنون میشم راهنمایی کنید 
using
 System;

using
 System.Collections.Generic;

using
 System.ComponentModel;

using
 System.Data;

using
 System.Drawing;

using
 System.Linq;

using
 System.Text;

using
 System.Windows.Forms;

using
 System.Data.Sql;

using
 System.Data.SqlClient;

using
 System.Data.SqlTypes;


namespace
 anbar1.Forms

{


publicpartialclasstest : Form

    {


privateanbarEnt context;


public test()

        {

            InitializeComponent();

        }






privatevoid test_Load(object sender, EventArgs e)

        {

            context = 
newanbarEnt();

            bindingSource1.DataSource = context.tests;


        }



privatevoid toolStripButton1_Click(object sender, EventArgs e)

        {

            savechange();



        }



privatevoid savechange()

        {

            context.SaveChanges();


MessageBox.Show("oksave!");


        }

    }

----------

