تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
إنشاء مشروع باستخدام sql server و linq وتقارير crystal report
#1
[FONT=&amp]نحمده ونصلي على رسوله الكريم[/FONT]
[FONT=&amp]السلام عليكم ورحمة الله[/FONT]

[FONT=&amp]قد سمع الجميع عن هذه التقنية، وربما البعض قد استخدمها أيضاً، ولكن باعتقادي أنها غير مستخدمة بشكل كبير في عالم البرمجة العربية![/FONT]
Linq[FONT=&amp] تقنية استعلام عن البيانات بأشكال كثيرة، وليست محصورة في التعامل مع قواعد البيانات فقط. تجد فيها السهولة والقوة في آنٍ واحد، تخلو من التعقيدات، وتختصر الكود البرمجي، تصبح جداول وأعمدة قاعدة البيانات فئات وخصائص، يتم التعامل معها من كود لغة البرمجة المستخدمة....[/FONT]

[FONT=&amp]لو نظرنا لهذا الكود، على افتراض أن ([/FONT]Person[FONT=&amp]) فئة داخل المشروع:[/FONT]
كود :
[align=left]label1.Text = Person.Name;
textBox1.Text = Person.Age;

[/align]
[FONT=&amp]أو هذا الكود:[/FONT]
كود :
[align=left]Person.Name = "Abd Allah";
Person.Age = 40;

[/align]
[FONT=&amp]* أترك لك كتابة كود [/FONT]sql[FONT=&amp] لجلب البيانات من الجدول واستعراضها في الأدوات، أو تغيير قيمها، لتقارن ذلك بنفسك.[/FONT]

[FONT=&amp]البعض يرفض هذه الطريقة في التعامل مع قواعد البيانات، وذلك بأنها لا توحي للشخص أنه يتعامل مع قاعدة بيانات، والبعض يقول: هكذا ماتت [/FONT]sql[FONT=&amp]! لغة التعامل مع قواعد البيانات.[/FONT]
[FONT=&amp]الزبون لا يهمه الكود وشكلة، ولا التقنيات المستخدمة أو لغة البرمجة، ما يهمه أن يحصل على طلبه، والمبرمج يهمه الإنتاجية وسرعة البرمجة، كمان أن شكل وترتيب الكود له أهمية كبيرة أيضا، ناهيك عن التصميم وترتيب الأدوات....[/FONT]

[FONT=&amp]لن أطيل الكلام، ودعنا نبدأ مشروع صغير (دليل هاتف)، سوف نضع فيه ما يلزم لمشروع كبير إن شاء الله، فكل مشاريع قواعد البيانات متشابهة، فقط حجم المشروع وعدد الشاشات هما الفرق.[/FONT]
[FONT=&amp]
سوف يحتوي مشروعنا على ما يلي:[/FONT]

  1. [FONT=&amp]نموذج لتسجيل الدخول.
    [/FONT]
  2. [FONT=&amp]نموذج لإضافة مستخدم.
    [/FONT]
  3. [FONT=&amp]نموذج لحذف / إيقاف مستخدم.
    [/FONT]
  4. [FONT=&amp]نموذج لتعديل اسم المستخدم وكلمة المرور.
    [/FONT]
  5. [FONT=&amp]تبويب (أو لسان) لإدخال (اسم ورقم / أرقام هاتف في الدليل).
    [/FONT]
  6. [FONT=&amp]تبويب لتعديل البيانات (اسم، رقم / أرقام الهاتف).
    [/FONT]
  7. [FONT=&amp]تبويب لحذف البيانات (اسم، رقم / أرقام الهاتف).
    [/FONT]
  8. [FONT=&amp]تبويب لاستعراض البيانات.[/FONT]
[FONT=&amp] على الله نتوكل وبه نستعين.[/FONT]
الرد }}}
تم الشكر بواسطة: مبرمج بلا حدود , ابراهيم ايبو
#2
لنلقي نظرة على قاعدة البيانات، سوف نحتاج للجداول التالية:
  • جدول للمستخدمين.
  • جدول للأسماء.
  • جدول لأرقام الهواتف.
جدول المستخدمين سوف يحتوي على الأعمدة:
  • عمود للاسم.
  • عمود لكلمة المرور.
  • عمود هل المستخدم مدير.
  • عمود هل المستخدم مفعل.
جدول الاسماء سوف يحتوي على الأعمدة:
  • الاسم.
  • العنوان.
  • ملاحظات.
جدول أرقام الهواتف سوف يحتوي على الأعمدة:
  • رقم الشخص. (علاقة)
  • رقم الهاتف.
* في كل جدول سوف يكون هنالك حقل ID خواصه: مفتاح أساسي وترقيم تلقائي.

نبدأ مشروع جديد باسم (TelephoneBook)، أول ما سنقوم به هو عمل قاعدة البيانات، نتوجه للـ Menu Bar ونختار:
  • Project
  • Add New Item
ثم نختار LINQ To SQL Classes، ليكن اسمه (PhoneBookDB).

* يمكننا فعل ذلك من Solution Explorer أيضاً، بتحديد المشروع ثم الضغط بالزر الأيمن من الفأرة واختيار:
  • Add
  • New Item
التبويب الذي ظهر أمامنا بعد إضافة العنصر يبدو فارغاً ولا يحتوي سوى:



نختار Toolbox لتطالعنا نافذة الأدوات، ستبدو كما في هذه الصورة:



هذه الأدوات الخاصة بالفئة (محتوى البيانات)، نسحب منها أداة Class ونضعها على المصمم:



الآن لو ضغطنا مرتين بالفأرة على كلمة Class1 سيتم تمكيننا من تحرير الاسم:



نغير الاسم لـ Users ثم نضغط Enter من لوحة المفاتيح. نضغط بالزر الأيمن من الفأرة على الـ Users لنضيف خاصية جديدة من:
  • Add
  • Property
الآن نجد الخاصية الجديدة في حالة تحرير الاسم، نكتب ID، ثم من لوحة المفاتيح نضغط Enter مرتين، ليتم اعتماد الاسم وإنشاء خاصية جديدة اسمها Username:



بعد أن أضفنا خاصية الـ Username إما أن نضغط من لوحة المفاتيح Enter ليتم إنشاء خاصية جديدة، وإما أن نضغط بالزر الأيمن للفأرة ونختار كما فعلنا أول مرة، لنضيف خاصية اسمها Password وخاصيتين أخريين اسمهما Admin و Active:



بقي علينا أن نضبط الخصائص، نحدد ID ثم نضغط F4 لننتقل لنافذة Properties أو بالضغط عليها بزر الفأرة الأيمن ثم اختيار Properties، لنجعل خصائص الخاصية ID كما يلي:
كود :
[align=left]Auto Generated Value = True
Auto-Sync = OnInsert
Primary Key = True
Read Only = True
Source = ID
Type = Integer (System.Int32)
[/align]
(خاصية Source مهمة جداً، فهي لتحديد العمود المرتبط من قاعدة البيانات بهذه الخاصية، إذا كان فارغاً سيكون هناك خطأ في إنشاء قاعدة البيانات، ليتم تجاوز إنشاء هذه العامود، وإكمال الباقي)
خصائص الخاصية Username:
كود :
[align=left]Source = Username
[/align]
النوع لن نغير فيه شيء لأنه من نوع نص String وهو ما نريد، لكن سيأخذ الحجم الافتراضي من طول النص في قاعدة البيانات وهو 4000 حرف، وهذا حجم كبير، لذلك هناك خاصية اسمها Server Date Type تمكننا من تحديد النوع، سنكتب فيها (nvarchar(20 لنحدد طول النص بـ 20 حرف كحد أقصى.

خصائص الخاصية Password:
كود :
[align=left]Source = Password
Server Date Type = nvarchar(20)
[/align]
خصائص الخاصية Admin:
كود :
[align=left]Source = Admin
Type = Boolean (System.Boolean)
[/align]
خصائص الخاصية Active:
كود :
[align=left]Source = Active
Type = Boolean (System.Boolean)
[/align]
الآن وقد أتممنا هذه الفئة، سننشئ فئة جديدة اسمها Persons، فيها هذه الخصائص:

  1. ID
  2. Name
  3. Address
  4. Notes
خصائص الخاصية ID نجعلها كما في الفئة السابقة (يمكننا نسخ الخاصية ID من الفئة Users ولصقها في الفئة الجديدة لتحمل جميل الخصائص، دون عناء التغيير)، خصائص الخاصية Name كما في الـ Username من الفئة السابقة أيضاً، الخاصية Address فقط نزيد من قيمه عدد الحروف في خاصية Server Date Type لتساوي (nvarchar(50، والخاصية Note نغير فيها خاصية الـ Source لتكون نفس الاسم، كما فعلنا في السابق، وندع Server Date Type فارغة لتكون في أعلى قيمة وهي 4000 حرف، ولا ننسى أنها من المحتمل أن تكون فارغة (أي لا يتم اسناد أي قيم لها من المستخدم)، لذلك نضبط الخاصية Nullable لتساوي True.

الآن ننشئ فئة جديدة اسمها PhoneNumbers، فيها من الخصائص ما يلي:
ID وخصائصها كالسابق.
PersonID وخصائصها: (Type = Integer (System.Int32، ولا ننسى أن نضبط خاصية الـ Source. (هذه الخاصية للعلاقة ما بين الجدولين).
Phone وخصائصها: (Server Date Type = nvarchar(10، ولا ننسى أيضاً خاصية الـ Source.

الآن نحدد فئة الـ Users ونذهب لنافذة الخصائص لنضع قيمة الخاصية Source بنفس اسم الفئة، وكذلك باقي الفئات.
الفئة Users: الخاصية Source = Users
الفئة Persons: الخاصية Source = Persons
الفئة PhoneNumbers: الخاصية Source = PhoneNumbers

قد شارفنا على الانتهاء من العمل في قاعدة البيانات، بقي أن نربط جدول الأشخاص مع جدول الأرقم بعلاقة.
الرد }}}
تم الشكر بواسطة: مبرمج بلا حدود
#3
السلام عليكم ورحمة الله وبركاته اخى الكريم جزاك الله خيرا كثيرا على هذا الشرح الرائع وارجو المتابعة فقد نفذت المشروع معك وفى انتظار استكماله باذن الله تعالى بنفس طريقة الشرح.
الرد }}}
تم الشكر بواسطة:
#4
إذا اخي العزيز DreamsDotNet هذا الدرس هو تطبيق لتقنية LinQ صح

يعني هذا غير Ado.net وغير SqlServer معلش اخي الحبيب بدك اتطول بالك علي مثل ما خبرتك انا 0 بقواعد البيانات Wink
الرد }}}
تم الشكر بواسطة:
#5
Fathy كتب :السلام عليكم ورحمة الله وبركاته اخى الكريم جزاك الله خيرا كثيرا على هذا الشرح الرائع وارجو المتابعة فقد نفذت المشروع معك وفى انتظار استكماله باذن الله تعالى بنفس طريقة الشرح.
وأنت كذلك، أسأل الله أن أوفق بالشرح....

<br> كتب :إذا اخي العزيز DreamsDotNet هذا الدرس هو تطبيق لتقنية LinQ صح

يعني هذا غير Ado.net وغير SqlServer معلش اخي الحبيب بدك اتطول بالك علي مثل ما خبرتك انا 0 بقواعد البيانات Wink
نعم الـ linq تقنية أخرى غير تقنية الـ ado.net، ولكن كلاهما يتعامل مع قاعدة بيانات sql server.
الرد }}}
تم الشكر بواسطة:
#6
لننشئ العلاقة بين فئة Persons وفئة PhoneNumbers، ولكن قبل ذلك لنعرف ما هي العلاقات.

في بعض الأحيان يكون لشخص ما أكثر من رقم هاتف، قد يملك الشخص ثلاث هواتف أو أربعة أو عشرة، فليس هناك حصر، لهذا لا نستطيع أن نضيف خاصية رقم الهاتف في الفئة Persons، لأنها ببساطه سوف تحمل رقم واحد فقط، فالحل يكون بإضافة جدول جديد يتم تخزين الأرقام فيه، والسؤال الذي يطرح نفسه الآن هو: كيف لنا أن نميز أن هذا الرقم هو لفلان وهذا الرقم لآخر؟! الإجابة هي بإنشاء علاقة بين الجدولين الرئيسي وهو Persons والفرعي وهو PhoneNumbers، من خلال ربط العمود ID الذي يتم توليده تلقائياً كلما أضفنا اسماً جديداً، بالعمود PersonID والذي من نفس النوع Integer، بهذا نكون قد عرفنا أن رقم الهاتف يعود لاسم المستخدم والذي رقمه هو مخزن في حقل PersonID.

لننشئ العلاقة بالتوجه لنافذة الأدوات وتحديد الأداة Association:



ثم النقر مرة على الفئة Persons والتوجه للفئة PhoneNumbers والنقر عليها أيضاً مرةً واحدةً، لنرى هذه النافذة:



نختار من العمود الأول في الجدول من هذه النافذة، عمود ID ومن العمود الثاني نختار عمود PersonID:



ثم موافق ليبدو الجدولين أو الفئتين كما يلي:




الآن نضغط بزر الفأرة الأيمن على مكان فارغ في المصمم ونختار Properties، في خاصية Context Namespace نضع القيمة DB، وفي خاصية Entity Namespace نضع القيمة DB أيضاً، وخاصية Name نجعلها PhoneBookDB، ثم خاصية Connection نختار منها New لتطالعنا هذه النافذة:



نختار منها الأول وهو Microsoft SQL Server، ثم Continue لنرى:



نكتب في الـ Combobox التابع لـ Server name: .\sqlexpress، ثم نختبر الإتصال بالضغط على زر Test Connection، فإن نجح نضغط OK، وإلا نراجع خدمة الـ SQL Server.

الآن وقد انتهينا من قاعدة البيانات، نغلق التبويب الخاص بها ثم نذهب لـ Solution Explorer، ونختار منها Form1 لنفتحه في تبويب التصميم، ننقر عليه نقراً مزدوجاً لنذهب لتبويب الكود داخل حدث التحميل، نعرف متغير عام خارج أي حدث:
:#C
كود :
[align=left]private DB.PhoneBookDB db = new DB.PhoneBookDB();[/align]

:VB
كود :
[align=left]Private db As New DB.PhoneBookDB()[/align]


سيكون شكل الكود للآن كمان يلي:
:#C
كود :
[align=left]public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private DB.PhoneBookDB db = new DB.PhoneBookDB();

        private void MainForm_Load(object sender, EventArgs e)
        {

        }
    }
[/align]

:VB
كود :
[align=left]Public Class MainForm

    Private db As New DB.PhoneBookDB()

    Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub
End Class
[/align]

إلى الآن لم ننشئ قاعدة البيانات، لعمل ذلك نكتب في حدث التحميل:
:#C
كود :
[align=left]if(!db.DatabaseExists())
    try
    {
        db.CreateDatabase();
    }
    catch (Exception ex) { MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }
[/align]

:VB
كود :
[align=left]If Not db.DatabaseExists() Then
    Try
        db.CreateDatabase()

    Catch ex As Exception
        MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Exit Sub
    End Try
End If[/align]

اختبرنا ما إذا لم تكن قاعدة البيانات موجود، وعلى ذلك يتم إنشائها أو الخروج من الإجراء. إن حصل خطأ وقد يكون ذلك بسبب أن خدمة SQL Server متوقفة أو أننا لم نكمل خاصية الـ Source للفئات وخصائصها، فإن كانت الأخرى، كما قلنا سيتم إنشاء قاعدة البيانات، ولكن بتجاوز الفئة أو الخاصية التي لم يكتب قيمة لها في الـ Source، فإن أردنا حذف قاعدة البيانات نكتب:
:#C
كود :
[align=left]db.DeleteDatabase();
[/align]

:VB
كود :
[align=left]db.DeleteDatabase()
[/align]

نعمل تشغيل للبرنامج ليتم إنشاء قاعدة البيانات، ثم نعود لفتح فئة محتوى البيانات من Solution Explorer والتي اسميناها PhoneBookDB.dbml، لنربط قاعدة البيانات مع محتوى البيانات، في أي مكان فارغ من المصمم نختار بعد الضغط بزر الفأرة الأيمن Properties، ثم من الخصائص نختار Connection ثم New ثم Microsoft SQL Server ثم Continue وبعد ذلك نكتب في اسم السيرفر .\sqlexpress، ثم نختار قاعدة البيانات من قائمة Select or enter a database name والتي اسميناها PhoneBookDB:



نعود للنموذج بعد أن أتممنا بفضل الله إنشاء قاعدة البيانات وربطها مع الفئة، لنعمل مدير للبرنامج:
:#C
كود :
[align=left]var users = from d in db.Users
            where d.Admin
            select d;
[/align]

:VB
كود :
[align=left]Dim users = From d In db.Users
            Where d.Admin
            Select d
[/align]

هذه جملة التحديد في تقنية Linq وصيغتها كما رأينا، بعد كملة From نكتب اسم متغير يمثل الجدول الذي نكتب اسمه بعد ذلك وهو هنا Users، والشرط إذا كان Admin يساوي True، نقوم بجلب جميع المستخدمين في حال كان المستخدم مدير للبرنامج، فإن كان ينتهي الإجراء وإلا سنعمل مدير افتراضي للبرنامج، لنختبر ذلك:
:#C
كود :
[align=left]if (users.Count() == 0)
[/align]

:VB
كود :
[align=left]If users.Count() = 0 Then

End If
[/align]

إذا كان مجموع القيم المحددة من الجدول تساوي 0، فهذا يعني أنه لا يوجد مدير، لعمل مدير للبرنامج نكتب بين فكي جملة الشرط السابقة:
:#C
كود :
[align=left]DB.Users admin = new DB.Users();
admin.Username = "Admin";
admin.Password = "Admin";
admin.Admin = true;
admin.Active = true;[/align]

:VB
كود :
[align=left]Dim admin As New DB.Users
admin.Username = "Admin"
admin.Password = "Admin"
admin.Admin = True
admin.Active = True
[/align]

في السطر الأول عرفنا متغير من الفئة Admin، ثم بعد ذلك اسندنا قيم للخصائص المعرفة داخل الفئة، للآن لم يتم حفظ البيانات التي عملناها، لذلك نكمل على الكود السابق:
:#C
كود :
[align=left]db.Users.InsertOnSubmit(admin);
db.SubmitChanges();
[/align]

:VB
كود :
[align=left]db.Users.InsertOnSubmit(admin)
db.SubmitChanges()
[/align]

في السطر الأول استخدمنا الإجراء InsertOnSubmit التابع للخاصية Users وأرسلنا في الوسيطة المتغير الذي عرفناه فوق وهو admin ليتم إدخاله بقاعدة البيانات بعد أن نرسل أمر حفظ التغييرات، وأرسلنا التغييرات لقاعدة البيانات بالسطر:
db.SubmitChanges()
ليتم بذلك حفظ التغييرات. هكذا أنشأنا قاعدة البيانات كمان أنشأنا مدير للبرنامج.
الكود كامل:
:#C
كود :
[align=left]public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private DB.PhoneBookDB db = new DB.PhoneBookDB();

        private void MainForm_Load(object sender, EventArgs e)
        {
            if(!db.DatabaseExists())
                try
                {
                    db.CreateDatabase();
                }
                catch (Exception ex) { MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }

            try
            {
                var users = from d in db.Users
                            where d.Admin
                            select d;

                if (users.Count() == 0)
                {
                    DB.Users admin = new DB.Users();
                    admin.Username = "Admin";
                    admin.Password = "Admin";
                    admin.Admin = true;
                    admin.Active = true;

                    db.Users.InsertOnSubmit(admin);
                    db.SubmitChanges();
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }
    }
[/align]

:VB
كود :
[align=left]Public Class MainForm

    Private db As New DB.PhoneBookDB()

    Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If Not db.DatabaseExists() Then
            Try
                db.CreateDatabase()

            Catch ex As Exception
                MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Exit Sub
            End Try
        End If

        Try
            Dim users = From d In db.Users
                      Where d.Admin
                      Select d

            If users.Count() = 0 Then
                Dim admin As New DB.Users
                admin.Username = "Admin"
                admin.Password = "Admin"
                admin.Admin = True
                admin.Active = True

                db.Users.InsertOnSubmit(admin)
                db.SubmitChanges()
            End If

        Catch ex As Exception
            MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
End Class
[/align]
الرد }}}
تم الشكر بواسطة:
#7
[COLOR="#FF0000"]وعليكم السلام ورحمه الله وبركاته

المشروع جاء بوقته صح Rolleyes

الله يعطيك العافيه دائما مبدع

لي عوده بالتطبيق ان شاء الله :o

دمت لمن تحب[/COLOR]
الرد }}}
تم الشكر بواسطة:
#8
Nŏ Co كتب :وعليكم السلام ورحمه الله وبركاته

المشروع جاء بوقته صح Rolleyes

الله يعطيك العافيه دائما مبدع

لي عوده بالتطبيق ان شاء الله :o

دمت لمن تحب

باركك الله وأهلا بك
أتمنى أن يكون الشرح بسيط ومفهوم
جزيت الجنة
الرد }}}
تم الشكر بواسطة:
#9
اخى المبدع الاستاذ ربيع
بما اننا اصدقاء فاسمح لى ان احكى لاعضاء المنتدى قصة قاعدة البيانات التى صنعتها لى.....
كنت اعمل على مشروع وكان استاذ ربيع يساعدنى فى عمله.... فصنع لى مثال ... كل ما ارسله لى هو المف التنفيذى (exe) لايوجد به اى شيئ اخر
والمشروع كان من المفترض ان يكون به قاعدة بيانات.
ففتحت الملف واذا بى اجد ان به قاعدة بيانات واستطيع ان اضيف واعدل واحذف واحفظ فى قاعدة البانات كما اريد بمنتهى السهوله والسرعه.
فأخذت ابحث كثيراّ عن مكان قاعدة البيانات فى جهازى فلم اجدها...فكدت اجن(كنت لسه اهبل Big Grin)
فطلبت منه السورس كود فاعطانى اياه فاذا بى اجد ان جميع اكواد انشاء قاعدة البانات والحفظ والتعديل والحذف بضع اسطر لاتتعدى اصابع اليد الواحده.
ومنذ ذلك اليوم وانا اعشق طريقة الاستاذ ربيع فى التعامل مع قواعد البانات.
اما بالنسبه الى linq فانا اعتقد ان اى مبرمج يريد ان يكون محترف فلابد ان يتعلم التعامل مع وان يتقنها لانها (فى وجة نظرى المتواضعه طبعاّ) من افضل الطرق للتعامل مع قواعد البيانات والمصفوفات والكائنات و...و...
فهى تختصر الاكواد بطريقه مدهشه وتسهل البرمجه لمن يريد ان يكتب برنامج بإحترافيه وسهوله وسرعه.

بارك الله فيك ياربيع وذادك من علمه... والى الأمام دائماّ.
"الناس نيام فإذا ماتوا إنتبهوا"
الرد }}}
تم الشكر بواسطة:
#10
نعود الآن لتصميم النموذج، ونضع عليه أداة الـ MenuStrip وأداة الـ TabControl، نضبط خاصية الـ Dock لأداة الـ TabControl على القيمه Fill:



MenuStrip ستحتوي ما يلي:
  • ملف:

[LIST=1|INDENT=2]
[*]مستخدم جديد: خاصية الـ Name = newuser
[*]حذف مستخدم: خاصية الـ Name = deluser
[*]تعديل البيانات: خاصية الـ Name = edituser
[*]تسجيل الخروج: خاصية الـ Name = signout
[*]إنهاء: خاصية الـ Name = exitapp
[/LIST]



الآن سنعمل نموذج لتسجيل الدخول، من Solution Explorer نضغط على المشروع بالزر الأيمن للفأرة، ثم نختار:
- Add
- Windows Form

ليكن اسمه LoginForm، خصائصة كما يلي:
FormBorderStyle = FixedDialog
MaximizeBox = False
MinimizeBox = False
ShowIcon = False
ShowInTaskbar = False
تسجيل الدخول = Text



نضيف من صندوق الأدوات أداتي Label وأداتي TextBox، و Button، خصائص الأدوات نضبطها كما يلي:
:textBox1
Name = unbox

:textBox2
Name = pasbox
* = PasswordChar

:button1
"دخول" = Text
في الكود الخاص بنموذج تسجيل الدخول، نعرف متغيرين عامين على النموذج:
* في #c نعرف ثلاث متغيرات.
:#C
كود :
[align=left]private DB.PhoneBookDB db = new DB.PhoneBookDB();
internal bool endapp = true;
internal MainForm mf = null;[/align]

:VB
كود :
[align=left]Private db As New DB.PhoneBookDB()
Friend endapp As Boolean = True[/align]

نضغط على زر الدخول مرتين بالفأرة لنذهب للحدث الافتراضي التابع له Click، سوف نختبر قيم النص لأداتي مربع النص فيما إذا كانت فارغة:
:#C
كود :
[align=left]if (String.IsNullOrEmpty(unbox.Text.Trim()) || String.IsNullOrEmpty(pasbox.Text.Trim()))
{
    MessageBox.Show("يجب إدخال اسم المستخدم وكلمة المرور", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    return;
}
[/align]

:VB
كود :
[align=left]If String.IsNullOrEmpty(unbox.Text.Trim()) OrElse String.IsNullOrEmpty(pasbox.Text.Trim()) Then
    MessageBox.Show("يجب إدخال اسم المستخدم وكلمة المرور", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    Exit Sub
End If
[/align]

نتبعه الكود التالي:
:#C
كود :
[align=left]try
{
    var user = from u in db.Users
               where u.Username == unbox.Text.Trim() && u.Password == pasbox.Text.Trim()
               select u;

    if (user.Count() != 0)
    {
        if (!user.SingleOrDefault().Active)
        {
            MessageBox.Show("لقد أدخلت اسم مستخدم موقوف", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            return;
        }

        endapp = false;
        Close();
    }
    else MessageBox.Show("اسم المستخدم أو كلمة المرور خطأ", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}

catch { } [/align]

:VB
كود :
[align=left]Try
    Dim user = From u In db.Users
               Where u.Username = unbox.Text.Trim().ToLower() AndAlso u.Password = pasbox.Text.Trim().ToLower()
               Select u

    If user.Count() <> 0 Then
        If Not user.SingleOrDefault().Active Then
            MessageBox.Show("لقد أدخلت اسم مستخدم موقوف", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Exit Sub
        End If

        endapp = False
        Close()

    Else
        MessageBox.Show("اسم المستخدم أو كلمة المرور خطأ", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    End If

Catch

End Try
[/align]

جملة تحديد تم شرحها سابقاً، وباقي الكود واضح، اللهم المتغير endapp سوف يتضح بعد كتابة الكود التالي في حدث FormClosing:
:#C
كود :
[align=left]if (endapp) Application.Exit();[/align]

:VB
كود :
[align=left]If endapp Then End
[/align]

يجب علينا أن ننهي البرنامج في حالة إغلاق النموذج بدون تسجيل الدخول، كي لا يتم الدخول للبرنامج.

نعود للنموذج الرئيسي ونذهب لتبويب الكود التابع له، لنضيف إجراء كما يلي:
:#C
كود :
[align=left]private void LogIn()
{
    tabControl1.SelectedIndex = 0;

    LoginForm lf = new LoginForm();
    lf.endapp = true;
    lf.mf = this;
    lf.unbox.Text = String.Empty;
    lf.pasbox.Text = String.Empty;
    lf.ShowDialog();
}
[/align]

:VB
كود :
[align=left]Private Sub LogIn()
    TabControl1.SelectedIndex = 0

    LoginForm.endapp = True
    LoginForm.unbox.Text = String.Empty
    LoginForm.pasbox.Text = String.Empty
    LoginForm.ShowDialog()
End Sub
[/align]

في آخر كود إجراء التحميل للنموذج الرئيسي، تحت جملة الشرط نكتب:
:#C
كود :
[align=left]LogIn();[/align]

:VB
كود :
[align=left]LogIn()[/align]

الكود كاملاً داخل حدث تحميل النموذج الرئيسي:
:#C
كود :
[align=left]        private void MainForm_Load(object sender, EventArgs e)
        {
            if (!db.DatabaseExists())
                try { db.CreateDatabase(); }
                catch (Exception ex) { MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error); return; }

            try
            {
                var users = from d in db.Users
                            where d.Admin
                            select d;

                if (users.Count() == 0)
                {
                    DB.Users admin = new DB.Users();
                    admin.Username = "Admin";
                    admin.Password = "Admin";
                    admin.Admin = true;
                    admin.Active = true;

                    db.Users.InsertOnSubmit(admin);
                    db.SubmitChanges();
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error); }

            LogIn();
        }[/align]

:VB
كود :
[align=left]    Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If Not db.DatabaseExists() Then
            Try
                db.CreateDatabase()

            Catch ex As Exception
                MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Exit Sub
            End Try
        End If

        Try
            Dim users = From d In db.Users
                      Where d.Admin
                      Select d

            If users.Count() = 0 Then
                Dim admin As New DB.Users
                admin.Username = "Admin"
                admin.Password = "Admin"
                admin.Admin = True
                admin.Active = True

                db.Users.InsertOnSubmit(admin)
                db.SubmitChanges()
            End If

        Catch ex As Exception
            MessageBox.Show(ex.Message, "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

        LogIn()
    End Sub
[/align]

لنرى مشروعنا كيف يعمل الآن، نجرب تسجيل الدخول دون كتابة شيء في مربعات النصوص، نجرب أيضاً كتابة اسم مستخدم وكلمة مرور خطأ، وأيضاً نغلق النموذج لنرى أنه لا يعود للنموذج الرئيسي بل يخرج من البرنامج كامل، ولا ننسى أن ندخل معلومات صحيحة لنرى أنه يعمل بشكل جيد.

سوف ننهي خيارات المستخدم أولاً، لذا قبل أن نبدأ بها يجب علينا تحديد الصلاحيات، سوف نمنع المستخدمين من إضافة مستخدم جديد للبرنامج وحذف مستخدم من البرنامج، باستثناء المدير، نعود للكود داخل حدث ضغط زر تسجيل الدخول ونكتب داخل جملة الشرط الرئيسية وتحت جملة الشرط الفرعية:
:#C
كود :
[align=left]mf.newuser.Enabled = user.SingleOrDefault().Admin;
mf.deluser.Enabled = mf.newuser.Enabled;
[/align]

:VB
كود :
[align=left]MainForm.newuser.Enabled = user.SingleOrDefault().Admin
MainForm.deluser.Enabled = MainForm.newuser.Enabled
[/align]

SingleOrDefault دالة تعود بصف واحد من جملة التحديد، والصف يحتوي خاصية Admin التي أدرجناها سابقا في فئة الـ Users، أسندنا قيمتها لخاصية التمكين في خيار إضافة مستخدم جديد، كما أسندنا قيمة التمكين في خيار حذف المستخدم لتساوي قيمة التمكين في خيار إضافة مستخدم جديد، بقي أن نخزن اسم المستخدم لكي نعدل بياناته، دون الحاجة لكتابة اسمه الحالي وكلمة المرور الخاصة به الحالية في النموذج الخاص بذلك، سوف نضيف في النموذج الرئيسي خاصية نخزن بها اسم المستخدم:
:#C
كود :
[align=left]private string un  = String.Empty;

internal string Username
{
    get { return un; }
    set { un = value; }
}
[/align]

:VB
كود :
[align=left]Private un As String = String.Empty

Friend Property Username As String
    Get
        Return un
    End Get

    Set(ByVal value As String)
        un = value
    End Set
End Property
[/align]

نذهب لنموذج تسجيل الدخول، لنكتب تحت سطري الصلاحيات:
:#C
كود :
[align=left]mf.Username = unbox.Text.Trim();
[/align]

:VB
كود :
[align=left]MainForm.Username = unbox.Text.Trim()
[/align]

الكود كامل في نموذج تسجيل الدخول:
:#C
كود :
[align=left]    public partial class LoginForm : Form
    {
        public LoginForm()
        {
            InitializeComponent();
        }

        private DB.PhoneBookDB db = new DB.PhoneBookDB();
        internal bool endapp = true;
        internal MainForm mf = null;

        private void Button1_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(unbox.Text.Trim()) || String.IsNullOrEmpty(pasbox.Text.Trim()))
            {
                MessageBox.Show("يجب إدخال اسم المستخدم وكلمة المرور", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            try
            {
                var user = from u in db.Users
                           where u.Username == unbox.Text.Trim() && u.Password == pasbox.Text.Trim()
                           select u;

                if (user.Count() != 0)
                {
                    if (!user.SingleOrDefault().Active)
                    {
                        MessageBox.Show("لقد أدخلت اسم مستخدم موقوف", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return;
                    }

                    mf.newuser.Enabled = user.SingleOrDefault().Admin;
                    mf.deluser.Enabled = mf.newuser.Enabled;
                    mf.Username = unbox.Text.Trim();

                    endapp = false;
                    Close();
                }
                else MessageBox.Show("اسم المستخدم أو كلمة المرور خطأ", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            catch { }
        }

        private void LoginForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (endapp) Application.Exit();
        }
    }
[/align]

:VB
كود :
[align=left]Public Class LoginForm

    Private db As New DB.PhoneBookDB()
    Friend endapp As Boolean = True

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If String.IsNullOrEmpty(unbox.Text.Trim()) OrElse String.IsNullOrEmpty(pasbox.Text.Trim()) Then
            MessageBox.Show("يجب إدخال اسم المستخدم وكلمة المرور", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Exit Sub
        End If

        Try
            Dim user = From u In db.Users
             Where u.Username = unbox.Text.Trim().ToLower() AndAlso u.Password = pasbox.Text.Trim().ToLower()
             Select u

            If user.Count() <> 0 Then
                If Not user.SingleOrDefault().Active Then
                    MessageBox.Show("لقد أدخلت اسم مستخدم موقوف", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    Exit Sub
                End If

                MainForm.newuser.Enabled = user.SingleOrDefault().Admin
                MainForm.deluser.Enabled = MainForm.newuser.Enabled
                MainForm.Username = unbox.Text.Trim()

                endapp = False
                Close()

            Else
                MessageBox.Show("اسم المستخدم أو كلمة المرور خطأ", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            End If

        Catch

        End Try
    End Sub

    Private Sub LoginForm_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If endapp Then End
    End Sub
End Class
[/align]
الرد }}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم