• السابق التالي







  • مايو
    16
    عمل خاصية التكميل التلقائي للنصوص بواسطة قائمة منسدلة Auto Complete Menu
    2010
    كتـب بـواسطة : مهند بندق , التصنيف : دروس في البرمجة , عدد المشاهدات (2517)

    بسم الله الرحمن الرحيم

    و الصلاة والسلام على سيدنا محمد خاتم الأنبياء و المرسلين

    محاولا تلبية طلب أحد الزوار كان يسأل عن كيفية تكوين قائمة منسدلة تعمل كخاصية Auto Complete لأداة ComboBox أو TextBox .. كتلك الموجودة في العديد من البرامج ومنها محررات لغات البرمجة , وفي بعض خانات نظام ويندوز ..

     بالطبع كأي فكرة برمجية يمكن تطبيقها بطرق مختلفة يتوقف ذلك على تفكير المبرمج نفسه في تلك اللحظة وسعيه لتكوين حل سريع.. فهذه الفكرة ربما لها طرق متعددة لتطبيقها ..

    إليكم طريقتي في حل هذه المشكلة .. ربما تساعدكم في استنباط أفكار أخرى ..

    بشكل ملخص :-

    سنقوم بجس نبض الحدث TextChanged لأي أداة تحرير نرغب في استعمالها مثلا ComboBox لكني أفضل TextBox هنا.. وفي هذا الحدث نقرأ مدخلات المستخدم أثناء كتابتها ونقوم بدورنا بتكوين جملة بحث عن تلك المدخلات أو ما يشابهها ..

    استعملت قاعدة بيانات MS Access بها جدول بسيط يحتوي على أسماء الطلبة و أعمارهم ..

    وسأستعمل جملة الاستعلام

    SELECT  [St_Name] FROM [StudentsTable] where [St_Name] like 'MyText%' order by [St_Name]

     

    [St_Name] = اسم حقل الاسم.

    [StudentsTable] = اسم الجدول.

    MyText = نص البحث.

    سنقوم الآن بعمل اجراء يعود بمصفوفة من نوع String تحتوي على نتائج البحث وليكن الإجراء كما يلي:

    private string[] GetNames(string MyText)

    {

    OleDbConnection con = new OleDbConnection(ConStr);

    OleDbDataAdapter Dr =

    new OleDbDataAdapter("SELECT [St_Name] FROM [StudentsTable] where [St_Name] like" +

    "'" + MyText + "%' order by [St_Name]", con);

    DataTable Dt = new DataTable();

    Dr.Fill(Dt);

    if (Dt.Rows.Count > 0)

    {

    List<string> StTemp = new List<string>();

    for (int i = 0; i < Dt.Rows.Count; i++)

    {

    StTemp.Add(Dt.Rows[i][0].ToString());

    }

    return StTemp.ToArray();

    }

    else

    {

    return null;

    }

    return null;

    }

    ما حصل في الإجراء السابق هو تكوين كائن OleDbConnection وأعطيناه نص الاتصال ثم أنشأنا كائن  OleDbDataAdapter  وأسندنا له كائن الاتصال وجملة البحث .. ثم تم التنفيذ و تعبئة النتائج في كائن DataTable ومن ثم تحققنا من وجود سجلات في DataTable الخاص بنا وتعبئة تلك النتائج في كائن List من نوع string ومن ثم أرجعنا قيمة الدالة وهي مصفوفة من نوع String بواسطة الطريقة ToArray التي قامت بالتحويل من الكائن List إلى Array of string ..

    الآن مع الخطوة الثانية وهي تكوين أداة ListBox في Runtime إن فضلت وضعها مباشرة على الفورم فلا حرج في ذلك ولكن أفضل تكوينها وقت التشغيل كما يلي :

    ListBox MyListBox;

    private void CreateMyList()

    {

    MyListBox = new ListBox();

    MyListBox.Width = MyTextS.Width;

    MyListBox.Top = MyTextS.Top + MyTextS.Height;

    MyListBox.Left = MyTextS.Left;

    MyListBox.KeyDown +=

    new KeyEventHandler(MyListBox_KeyDown);

    MyListBox.MouseClick +=

    new MouseEventHandler(MyListBox_MouseClick);

    this.Controls.Add(MyListBox);

    MyListBox.Visible = false;

    }

    وكتابة حدث KeyDown و MouseClick لكي نقوم باسناد القيمة المختارة من القائمة إلى مربع النص الخاص بنا.. عند الضغط على مفتاح Enter أو النقر بزر الماوس..

    void MyListBox_MouseClick(object sender, MouseEventArgs e)

    {

    MyTextS.Text = MyListBox.SelectedItem.ToString();

    MyListBox.Visible = false;

    }

    void MyListBox_KeyDown(object sender, KeyEventArgs e)

    {

    if (e.KeyValue == 13 && MyListBox.SelectedItem != string.Empty)

    {

    MyTextS.Text = MyListBox.SelectedItem.ToString();

    MyListBox.Visible = false;

    }

    if (e.KeyValue == 38 && MyListBox.SelectedIndex == 0)

    {

    MyTextS.Focus();

    }

    }

    أريد أن اشير هنا اني قمت بجس المفاتيح التي يضغط عليها المستخدم فمثلا KeyValue عندما يساوي 13 فهو المفتاح Enter و 38 هو مفتاح السهم المشير إلى اعلى في لوحة المفاتيح حتى اسهل الانتقال بين مربع TextBox و ListBox في حالة لو كان العنصر الحالي هو الاول في القائمة.. بكتابة الأمر المناسب بالطريقة Focus مما يوحي المستخدم وكإنها أداة واحدة بمساعدة الكود التالي في الحدث KeyDown لكائن TextBox

    private void MyTextS_KeyDown(object sender, KeyEventArgs e)

    {

    if (e.KeyValue == 40)

    {

    MyListBox.Focus();

    MyListBox.SelectedIndex = 0;

    }

    }

    حيث يمثل الانتقال إلى ListBox عند النقر على المفتاح رقم 40 وهو السهم المشير إلى الاسفل في لوحة المفاتيح..

    والآن نريد تكوين إجراء آخر يقوم باستعمال القائمة التي قمنا بإنشائها وإظهارها في حالة وجود نتائج للبحث ولتستقبل مصفوفة من النصوص .. كما يلي :

    private void CreateAutoCompleteList(string[] ListItems)

    {

    MyListBox.Items.Clear();

    if (ListItems == null)

    {

    MyListBox.Visible = false;

    return;

    }

    if (ListItems.Length > 0)

    {

    MyListBox.Items.AddRange(ListItems);

    if (MyListBox.Items.Count < 4)

    {

    MyListBox.Height = (MyListBox.Items.Count * 18);

    }

    else

    {

    MyListBox.Height = 4 * 18;

    }

    MyListBox.Visible = true;

    }}

    الآن صارت العملية بسيطة , فقط نستدعي الإجراءات التي قمنا بإنشائها .. فسيتم عرض تلك القائمة في حالة وجود أي نتائج مشابهة لما يكتبه المستخدم .. عند الحدث TextChanged ..

    كما يلي :

    private void MyTextS_TextChanged(object sender, EventArgs e)

    {

    this.CreateAutoCompleteList(this.GetNames(MyTextS.Text));

    }

    وستكون النتيجة كما في الصورة:

     

    يمكنك التفنن في إنشاء أداة خاصة بك لتستعملها في جميع مشاريعك , كذلك تحوير الشفرات السابقة كما يتناسب مع برنامجك.. مثلا باستبدال ListBox بـ ContextMenuStrip أو غيرها ..

    لتحميل المثال من هنا

    أتمنى أن تكون الفكرة سهلة من حيث الفهم و التطبيق..

     

    ونلتقي بإذن الله في مواضيع أخرى ,, إلى ذلك الحين تقبلوا مني أطيب التحيات.

    مهند بندق..

     
    التعليقات (2)
    بواسطة أحمدالرفاعي من ليبيا 17 مايو 2010

    السلام عليكم و رحمة الله وبركاته

    اخي مهند بندق

    بكل صدق انت رائع و شخص عبقري جداً .....

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

    و سوف أخبرك بأكثر أمر أعجبني و هو قد يكون غريب

    إستخدامك للكود التالي

    private void MyTextS_KeyDown(object sender, KeyEventArgs e)
    {
    if (e.KeyValue == 40)
    {
    MyListBox.Focus();
    MyListBox.SelectedIndex = 0;
    }
    }

    قيمة في الروعة في بداية الأمر عندما رأيت الرقم 40 حصل معي لبس و لم أفهم ماذا تريد أن تفعل على الرغم من ان إسم الحدث KeyDown يوحي بالفكرة

    و لكن بعدما رأيت MyListBox.Focus();

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

    تقبل تحياتي

    أخوك : أحمدالرفاعي


    بواسطة مهند بندق من ليبيا 17 مايو 2010

    السلام عليكم ورحمة الله وبركاته

    يا هلا ويا هلا ,, لن تكفي عبارات الترحيب بك صديقي أحمد الرفاعي, تمنيت في هذه اللحظة لو اضفت ميزة الابتسامات في محرر التعليقات لكي اعبر عن بهجتي بشكل أوضح ..ربما ساضيفها لاحقا :)

    فلست أفوقك روعة وعبقرية .. فالكود صار هو الكلمة الأصدق بين المبرمجين ... فأنت تكتب وتبدع وعندما يفهمك آخر تُبعت في نفسك تلك النشوة التي تشعرك أنك لست الوحيد الذي يفكر بهذه الطريقة .. وتشعر أن هناك من معك في تلك الشوارع المفصولة باسطر الكود!

    شكرا للمساندة أخي أحمد ...

    لا تحرمنا من تواصلك ..

    تقبل مني أطيب تحية..

    و السلام عليكم ورحمة الله وبركاته






           
    الإسم
    الدولة
    البريد الإلكتروني
    المحتوى  
    أكتب النص الظاهر في الصورة
     


    مايو
    11
    انشاء برنامج الرسام بتقنية الرسم Create Your Painter GDI+ .Net
    2010
    كتـب بـواسطة : مهند بندق , التصنيف : دروس في البرمجة , عدد المشاهدات (3003)
    تحية طيبة لكل زوار هذه المدونة .. بالطبع أغلب المبرمجين تحت Dot Net Framework يعرف ما هي اساسيات تقنية الرسم GDI+ التي تحمل بها العديد من المكتبات الرائعة لتحولك من مبرمج إلى فنان في الرسم ولكن ليس أي رسم هذا رسم عن طريق الكود , وليس للمستخدم أي فكرة عما تعانيه من كتابة كود لرسمك أداة جديدة من أدوات Windows Forms حتى تعرض بالشكل المطلوب ويتمتع هو برفاهية ما يعكسه برنامجك من مظهر ..

    في لحظة خطرت ببالي فكرة بسيطة وهي ....
     


    ابريل
    21
    التعامل مع قواعد البيانات بتقنية Ado.Net عن طريق C#.Net بالوضع المتصل
    2010
    كتـب بـواسطة : مهند بندق , التصنيف : دروس في البرمجة , عدد المشاهدات (4913)
    بناء على طلب أحد الزوار لهذه المدونة مستفسرا عن طريقة ربط قواعد البيانات مع الفيجوال أستوديو دوت نت, ففي هذه التدوينة سأستعمل لغة C#.Net كونها هي الأكثر شيوعا وسلاسة واحترافية من Vb.Net لتلبية هذا الطلب ..

    أولا Ado.Net هي اختصار لـ ActiveX Data Objects أي كائنات التعامل مع قواعد البيانات .. و هي مجموعة من الكائنات تتعامل مع بعضها البعض للوصول إلى مصادر تخزين البيانات واستخدامها أي (إضافة , تعديل ,حذف, قراءة) ... والمقطع .Net أضيف حديثا بعد أن تم تطوير هذه الكائنات لتعمل تحت Dot Net Framework .. وصارت جزءا لا يتجزأ من هذه التقنية ..
     





    حقوق النشر محفوظة لـ مهند بندق © 2009 - 2018
    Programmed And Designed By : Mohaned Bondoq
    Copyright © 2009 - 2018