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







  • مايو
    17
    ملحق : عمل خاصية التكميل التلقائي للنصوص بواسطة قائمة منسدلة
    2010
    كتـب بـواسطة : مهند بندق , التصنيف : دروس في البرمجة , عدد المشاهدات (5391)


    في موضوع سابق (( عمل خاصية التكميل التلقائي للنصوص بواسطة قائمة منسدلة Auto Complete Menu)) تم شرح كيفية انشاء خاصية Auto Complete للنصوص عند كتابة المستخدم .. قمت ببعض التحوير وبعد اتمام الشرح وجدته أنه أكبر مما قد يتحمله رد أو تعليق فهذه التدوينة تابعة لما سبق , ولفهم محتواها يرجى مراجعة الموضوع المشار اليه اعلاه..

    بعد التمعن في الطريقة السابقة , وجدت انها من حيث الكفاءة غير جيدة إلى حد ما حيث يحدث ضغط شديد على قاعدة البيانات في كل حركة أو في كل مرة يكتب فيها المستخدم أي حرف جديد , ومن ناحية أخرى فكرت لو كان المستخدم مصدر بياناته ليس قاعدة بيانات طبيعية مثل MS Access ربما يكون عبارة عن ملف XML أو أصلا مصفوفة من النصوص .. فما الحل في هذه الحالة ..

    الحل المتاح لدينا هو تكوين دالة تقوم بعمل Like 'MyText%' أي أنها تقوم بالبحث على النص المشابه لما كتبه المستخدم ولكن ليس في جدول قاعدة بيانات بل داخل مصفوفة أو قائمة نصوص..

    توصلت إلى تكوين الدالة المطلوبة بعد بعض التجربة .. وأردت ان اشارككم بها .. لزيادة الفائدة ..

    نص الدالة والتي تعود بمصفوفة أخرى ولكن تحتوي فقط على العناصر المشابهة لما كتبه المستخدم:

    private string[] GetLikeStrings(string MyValue,

    string[] OriginalArray)

    {

    if (OriginalArray.Length <= 0)

    {

    return null;

    }

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

    foreach (string i in OriginalArray)

    {

    if (i.Length >= MyValue.Length)

    {

    string TemSt = i.Remove(MyValue.Length, i.Length –

    MyValue.Length);

    if (TemSt == MyValue)

    {

    TempList.Add(i);

    }

    }

    }

    if (TempList.Count > 0)

    {

    return TempList.ToArray();

    }

    return null;

    }

    يبدو شكلها معقد ولكن ببساطة عملها كالآتي :

    1 – تقوم بالدوران على كل العناصر الموجودة في المصفوفة الاصلية.

    2- تقوم بقص عدد الاحرف الزائدة عن عدد الأحرف المراد المقارنة به وسيكون هو النص الذي أدخله المستخدم.

    3- نقوم بمقارنة ما تبقى من بداية النص المتحصل عليه في تلك الدورة أي النص بعد أن صار صالح للمقارنة من حيث عدد الأحرف.

    4 – لو كان النص مطابق للمدخل من قبل المستخدم سيتم إضافته إلى List Of Strings قمت بإنشائه مؤقتا.

    5- بعد اتمام كل الدورات وتم العثور على عناصر مشابهة أي في القائمة المؤقتة نعود بمصفوفة من نوع String باستعمال الطريقة المعتادة ToArray ..

    هكذا تحصلنا على العناصر المشابهة لما اردنا بدون التعامل المباشر مع قاعدة البيانات ..

    وأنصح بهذه الطريقة جدا فهي أفضل من الأولى من ناحية الكفاءة وسرعة العمل ولا تضغط على مزود قاعدة البيانات خصوصا لو كان على الشبكة فلن تحتاجها إلا في المرة الاولى التي ستملأ فيها المصفوفة التي نعمل عليها ويفضل ملئها في الحدث FormLoad

    وعليك استبدال الدالة السابقة بتلك التي تتعامل مع قاعدة البيانات وتلاحظ ان كلاهما يعود بـ Array Of Strings أي ستستعمل في نفس المكان لتتعامل مع ListBox المنبثقة..

     

    هذا المثال بعد التنقيح SP1 J

     

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

     

    ولاستعمال هذه الدالة أيضا مع تطبيقات الويب , يمكن ذلك ببعض التحوير وبالاستعانة بأدوات AJAX Control Toolkit الشهيرة و المجانية التي يمكنك تحميلها من هذا الرابط

    http://ajaxcontroltoolkit.codeplex.com/releases/view/43475

    فيمكنك استخدام أداة AutoCompleteExtender , ان كنت لست من مستخدمي Ajax مسبقا اتبع التعليمات على هذا الرابط

    http://www.asp.net/ajaxlibrary/act_AutoComplete_Simple.ashx

    ولعلك لاحظت أنه استعمل دالة أخرى غير المعروضة في هذا الموضوع فقد اعتمد فيها على تقنية LINQ ,, حاولت تهجين الدالة الموجودة في هذا الملحق ولتكون أكثر سلاسة للمبتدئين لتعمل كتلك الموجودة في خطوات الاستعمال لتكون على هذا الشكل:

    [System.Web.Services.WebMethodAttribute(), System.Web.Script.Services.ScriptMethodAttribute()]

    public static string[] GetLikeStrings(string prefixText, int count, string contextKey)

    {

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

    foreach (string i in OriginalArray)

    {

    if (i.Length >= prefixText.Length)

    {

    string TemSt = i.Remove(prefixText.Length, i.Length - prefixText.Length);

    if (TemSt == prefixText)

    {

    TempList.Add(i);

    }

    if (TempList.Count >= count)

    {

    break;

    }

    }

    }

    if (TempList.Count > 0)

    {

    return TempList.ToArray();

    }

    return null;

    }

    فرضا أننا قمنا بتعريف المصفوفة OriginalArray مسبقا وقمنا بملئها بواسطة قاعدة البيانات , أو بشكل يدوي في حدث Page_Load على سبيل المثال كما يلي :

    protected void Page_Load(object sender, EventArgs e)

    {

    OriginalArray = new string[] { "مهند بندق", "مهند محسن", "مروان مصطفى", "أحمد الرفاعي", "سعاد حسن", "محسن" };

    }

    وستعمل تماما كتلك الموجودة في Windows Forms كما في الصورة

     

    هذا المثال أيضا متوفر للتحميل ومفتوح المصدر من هنا

     

    وما التوفيق الا من عند الله.

    لا تنسونا من صالح دعاكم وتقبلوا مني أطيب التحيات..

    مهند بندق..

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

    تم آخر تعديل بتاريخ 24-05-2010, السبب: إضافة طريقة استعمال هذه الخاصية مع Web .

     

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

    كعادتك لا يفارقك الإبداع

    جميل جداً ما أضفته في هذه الدالة ولكن لدي ملاحظة صغيرة

    بإفتراض أن قاعدة البيانات تحتوي على 1000 شخص إسمهم مهند
    و بالطبع تختلف أسماء الآباء و الألقاب

    و من الطبيعي جداً ان لا يكون الكود السابق يقوم بجلب كل البيانات أعتقد انه من المنطق تحديد عدد الصفوف المرجعة متلاً

    SELECT TOP 15 [St_Name] FROM [StudentsTable] where [St_Name] like" +
    "'" + MyText + "%' order by [St_Name]


    فالمنطق يقول انه يجب ان لا نقوم بجلب الألف شخص اللذين إسمهم مهند هذا ما أعتقده

    و كلما زاد عدد الحروف إقترب المستخدم من الهدف الذي يريده

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

    بكل صدق الساعة الآن 3 إلا عشر دقائق بعد منتصف الليل ولم أعد أستطيع التركيز لأن اليوم كان مرهق جداً و ممل جداً و متعب جداً

    ربما أحاول في الغد ان اعود لأوضح أكثر ما قصدته من كلامي السابق ...

    تحياتي أيها العبقري ( يا مهند بندق ) .

    نفع الله بك و بعلمك و زادك الله علماً


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

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

    مرحبا من جديد بالصديق أحمد الرفاعي..

    ملاحظة قوية وغابت عن ذهني.. وصحيح ما قلت ولكن لازلت متمسك بتخفيف الضغط على قاعدة البيانات...

    فالحل في هذه الحالة كما استبدلنا Like'MyText%' بالحلقة التكرارية السابقة سنقوم باستبدال Top 10 ... بشرط بسيط وهو

    if (TempList.Count >= 10)
    {
    break;
    }

    داخل الحلقة التكرارية , حيث سيتم الخروج من تلك الحلقة عند وصول عدد النتائج إلى 10 نتائج ..

    أما عن 1000 سجل .. في رأيي لا تزال طريقة البحث الاعتيادية أي دون خاصية التكميل أسرع ويفضل أيضا ان تستعمل هذه الخاصية في المكان المناسب ..مثلا لن نستعملها مع أسماء الطلبة الذي يفوق عددهم 5000 طالب ... بل سنستعملها مع أسماء المواد الدراسية التي ربما لا يتجاوز عددها 100 مادة .. بالرغم أن ليس هناك فرق ملحوظ حسب اعتقادي من حيث السرعة..


    هذا رايي و الفكرة متاحة لمن اعجبته ..

    شكرا على اطرائك ومتابعتك اخي احمد..

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

    و السلام عليكم


    بواسطة حنان من ليبيا 24 مايو 2010

    شكراً اخي مهند

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

    شكراً لك

    سامحني فلقد أتعبتك جداً

    تحياتي




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

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

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

    بالنسبة لاستعمال هذه الخاصية على تطبيقات الويب هي ممكنة عن طريق تقنية AJAX , وتوجد مكتبة أدوات تم تطويرها من قبل محترفين تسمى Ajax Control Toolkit أستعملها شخصيا فهي توفر الكثير من العناء..

    تستطيعين تحميلها من هذا الرابط
    http://ajaxcontroltoolkit.codeplex.com/releases/view/43475

    فقط قومي باستدعاء مكتبة DLL الموجودة في الملف المحمل بعد فك ضغطه , وستضاف أدوات اخرى في ToolBox الخاص بالفيجوال ستوديو , وبامكانك الحصول على ماتريدين عن طريق أداة تسمى AutoCompleteExtender تربط مع أي أداة تحرير نصوص متوفرة ...

    ولتفاصيل استعمالها ستجدين كل ما ترغبين معرفته عن هذه الأداة خاصة , وعن هذه الأدوات عامة عند تتبعك لبعض الروابط على هذه الصفحة

    http://www.asp.net/ajaxlibrary/act_AutoComplete_Simple.ashx

    ملاحظة : تم إضافة تحديث بتاريخ اليوم للموضوع حول طريقة استعمال هذه الأداة مع نفس الدالة الطروحة في هذا الملحق

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

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






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





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