تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[VB.NET] سؤال عن AutoComplete
#1
انا استخدم AutoComplete في تيكست بوكس وفي داتا جريد فيو ولكن المشكلة انه يجب ادخال اول حرف اريد ان يظهر لي قائمة بجميع الاسماء التي تحتوي على الحرف الذي ادخلته حتى لو كان حرف من منتصف الكلمة
سورس كود برنامج محاسبة ومبيعات احترافي ومتكامل- قم بالاطلاع على البرنامج 

واتساب 00963951283515
الرد }}
تم الشكر بواسطة: سعود , سعود
#2
اخي ابو انس اعتقد ان الحل الذي تريده هو في استخدام كومبوبوكس تملآ عناصره  عن طريق استخدام regex 
ليبحث عن اقرب التطابقات في نص تكستبوكس او عناصر داتاجريد فيو  باستخدام الادخال الذي قمت به 

في المثال الذي عملته استخدمت 2 تكستبوكس الاول rtxt وهو الذي استخدم فيه الاكمال التلقائي
والثاني rtxt2 وهو يحوي النص الذي سيعرض الاكمال التلقائي مقترحات الاكمال بناء على النص الموجود فيه

شاهد الفيديو 



باختصار جرب الكود التالي

كود :
Imports System.Text.RegularExpressions
Imports System.Runtime.InteropServices

Public Class Form1
    Dim autoComp As New ComboBox

    <DllImport("user32.dll")> _
    Private Shared Function GetCaretPos(ByRef lpPoint As Point) As Boolean
    End Function

    Public Function GetCorrectCaretPos() As Point
        Dim pt As Point = Point.Empty
        If GetCaretPos(pt) Then
            Return pt
        Else
            Return Point.Empty
        End If
    End Function

    Dim curWord As String
    Dim spaceKeyHitCounter As Integer
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(autoComp)
    End Sub

    Private Sub rtxt_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles rtxt.KeyDown
        If e.KeyCode = Keys.Space Then
            If spaceKeyHitCounter < 1 Then
                spaceKeyHitCounter += 1
            Else
                spaceKeyHitCounter = 0
                curWord = ""
                autoComp.Hide()
            End If
        ElseIf e.Modifiers = Keys.Control And e.KeyCode = Keys.V Then
            My.Computer.Clipboard.Clear()
            curWord = curWord.Remove(curWord.Length - 1)
            rtxt.SelectionStart -= Len(curWord)
            rtxt.SelectionLength = curWord.Length '- 1
            rtxt.SelectedText = autoComp.Text
            spaceKeyHitCounter = 0
            curWord = ""
            autoComp.Hide()
        ElseIf e.KeyCode = Keys.Back Then
            Try
                curWord = curWord.Remove(curWord.Length - 1)
            Catch ex As Exception

            End Try
        Else
            If CurCharPos = 0 Then
                spaceKeyHitCounter = 1
            End If
            If e.KeyCode = Keys.Enter Then
                If CurCharPos = 0 Then
                    spaceKeyHitCounter = 1
                End If
                curWord = ""
            End If
            curWord += Chr(e.KeyCode)
            curWord = curWord.Trim()
            autoComp.Left = GetCorrectCaretPos().X
            autoComp.Top = GetCorrectCaretPos().Y + autoComp.Height - 5
            autoComp.Show()
            autoComp.BringToFront()
        End If
    End Sub

    Dim CurCharPos As Integer
    Private Sub rtxt_TextChanged(sender As Object, e As System.EventArgs) Handles rtxt.TextChanged
        CurCharPos = rtxt.GetPositionFromCharIndex(rtxt.GetFirstCharIndexFromLine(rtxt.GetLineFromCharIndex(rtxt.SelectionStart))).X
        Dim col As MatchCollection = Regex.Matches(rtxt2.Text, "\b(\w+)\b", RegexOptions.IgnoreCase Or RegexOptions.IgnorePatternWhitespace)
        autoComp.Items.Clear()
        For Each match As Match In col
            If Regex.IsMatch(match.Value, curWord, RegexOptions.IgnoreCase) Then
                If Not autoComp.Items.Contains(match.Value) Then
                    autoComp.Items.Add(match.Value)
                End If
                autoComp.SelectedIndex = 0
                'autoComp.SelectAll()
            End If
        Next
    End Sub
End Class

وللعلم فان الكود مجرد محاولة مني ولا اجزم انه هو بالضبط ماتطلبه 
لكنه على الاقل قد يكون نقطة بداية لما تريد
جربه اولا في مشروع اختبار لانه لابد ان تحتاج الى تعديل هنا او هناك في الكود

ملاحظة autoComp هو اسم الكومبوبوكس

الرد }}
تم الشكر بواسطة: ابو انس , ابراهيم ايبو , سعود
#3
شكرا لك ولكن يظهر اني لم اقم بصياغة سؤالي بشكل جيد
المشكلة في autocomplete انك مضطر لكتابة الحرف الاول 
مثلا لدينا اسماء المواد التالية (هارد توشبا 500 جيجا ، ساتا توشبا هارد 250جيجا )
عند كتابة كلمة هارد ستظهر المادة الاولى لانها تبدأ بكلمة هارد 
انا ما رايده ببساطة ان تظهر المادة الاولى والثانية ايضا لاحتواء كليهما على كلمة هارد
طبعا ضمن قائمة منسدلة
انا احتاج ان اعمل هذا الامر في داتا جريد فيو وفي تيكست بوكس ايضا
شكرا لكم
سورس كود برنامج محاسبة ومبيعات احترافي ومتكامل- قم بالاطلاع على البرنامج 

واتساب 00963951283515
الرد }}
تم الشكر بواسطة: سعود
#4
يا اخي انا اتكلم عن اكمال تلقائي مخصص غير الموجود ضمن ادوات فيجوال بيسك
وبحسب مافهمت انك تريد ان تضهر لك كل اللاقتراحات المتشابههة 
 الكود في ردي السابق يقوم باضهار  جميع اقتراحات الاكمال  المتشابههة فهل جربته 
اذا كنت جربته وكنت انا في وادي وما تريده انت غي وادي اخر فاتمنى ان ترفق المشروع او على الاقل كود الاكمال التلقائي لديك

عموما وجدت كلاس تكستبوكس مخصص هنا تخصيص الاكمال التلقائي لتكستبوكس
وفي الصفحة تجد كود الكلاس المذكور بلغة سي شارب 
وهنا شخص يواجه مشكلة مع الاكمال التلقائي كالتي تواجهها وعلى مايبدو انه وجد الحل لها موقع code project Customize Textbox AutoComplete

بالتوفيق

الرد }}
تم الشكر بواسطة: ابو انس , ابراهيم ايبو , سعود , سعود
#5
في المرفقات مشروع اكمال تلقائي من تصميم الزميل ابراهيم ايبو
ارجو التعديل عليه بحيث يمكن بدل الكتابة الحرف الاول كتابة اي جزء من الكلمة


الملفات المرفقة
.rar   AutoComplet_InDGV.rar (الحجم : 69.08 ك ب / التحميلات : 23)
سورس كود برنامج محاسبة ومبيعات احترافي ومتكامل- قم بالاطلاع على البرنامج 

واتساب 00963951283515
الرد }}
تم الشكر بواسطة: ابراهيم ايبو , ابراهيم ايبو , سعود
#6
اخي ابو انس مشروع الاخ ابراهيم جزاه الله خير يعتمد على الوضيفة AutoComplete المضمنه في ادوات  فيجوال بيسك
يعني ليه نعبي في قربة مشقوقة 
انت تحتاج الى وضيفة اكمال تلقائي متخصصة لكي تستطيع تجاوز التقييدات الموجودة في الوضيفة الاصلية
اسالك بصراحة
هل جربت الكود في ردي عليك ؟
لاني بصراحة ولمجرد الفضول ابغى اعرف لاني اشتغلت عليه مايقرب من ساعتين 
هل جربت الحلول التي في الروابط في ردي السابق؟

الرد }}
تم الشكر بواسطة: ابراهيم ايبو , سعود
#7
السلام عليكم ورحمة الله وبركاته
اخوي الكريمين ابو انس ومعاند الحظ بارك الله بكما ولكما
يقول المثل (المكتوب باين من عنوانه)
المثال اسمه اكمال تلقائي Autocomplete ووظيفته هي ايضا كذلك  بمعنى عندما نكتب اول حرف سيتم جلب كل السجلات التي تبدأ بالحرف الذي كتبناه وسيتم الاقتراح وكلما كتبنا حرف زائد تتم التصفية اي ان الامر يتم تسلسليا من الحرف الاول الى الثاني وهكذا 
اما ماتريده اخي ابو انس هو عملية بحث Searsh عن الحرف الذي كتبته في كل السجلات اينما كان موقع الحرف وهذا ليس Autocomplete
حاليا ليس عندي اي فكرة او معلومة تفيد في طلبك ولكن ان توصلت الى شيئ ساورده كمثال في المنتدى
اعمل الخير وأجرك لا تنتظره فالله خير من إليك يرده
البرمجة ليست مجرد كود بل هي منهج تفكير منطقي لحل المشكلات







الرد }}
تم الشكر بواسطة: معاند الحظ , ابو انس , سعود
#8
وعليكم السلام ورحمة الله وبركاته
شكرا لك على مداخلتك الجميلة
ما اطلبه شاهدته في برامج اخرى تم تصميمها عن طريق اما فيجوال بيسك او سي شارب
اذن هو ممكن
اما عن قضية AutoComplete  فانا ذكرت اني استخدم AutoComplete  ولكني لم اقل اني اريد ان يتم الامر حصرا عن طريق AutoComplete 
ممكن ان يتم الامر بأي طريقة لا مشكلة لدي
سورس كود برنامج محاسبة ومبيعات احترافي ومتكامل- قم بالاطلاع على البرنامج 

واتساب 00963951283515
الرد }}
تم الشكر بواسطة: ابراهيم ايبو , ابراهيم ايبو
#9
اخي ابو انس هل مشكلتك هي  ان الاكمال التلقائي لايضهر العنصر الاكثر تطابقا  في اعلى القائمة؟
ام ماذا لو سمحت

الرد }}
تم الشكر بواسطة: ابراهيم ايبو , ابو انس , ابو انس
#10
استخدم جملة For تمر على كل الصفوف وايضا استخدم
.Contains
الرد }}
تم الشكر بواسطة: ابراهيم ايبو , ابو انس



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


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