السلام عليكم...
المعذرة يا أخي "المبرمج البسيط" إن تأخرنا عليك قليلاً... فالجواب كان جاهزاً منذ استلامي للمرفق، و لكني انشغلت عن الرد قليلاً.
أحببت أن يكون الحل عاماً لكل المشروع و ليس خاصاً بنافذة واحدة، و لذلك فالحل كالتالي:
1. انسخ الدالة و الإجراء التاليين إلى الـ Module الموجودة في مشروعك.
كود :
' دالة التأكد من وجود سجلات
Public Function IsEmptyRecordSet(ARecordSet As ADODB.Recordset) As Boolean
If ARecordSet Is Nothing Then
IsEmptyRecordSet = True
ElseIf ARecordSet.State <> adStateOpen Then
IsEmptyRecordSet = True
ElseIf ARecordSet.BOF And ARecordSet.EOF Then
IsEmptyRecordSet = True
Else
IsEmptyRecordSet = False
End If
End Function
' إجراء تعبئة اللائحة
Public Sub FillListFromTable(AListControl As Control, ByVal ATable As String, ByVal AListField As String, Optional ByVal AKeyField As String = "")
Dim TempCnn As New ADODB.Connection
Dim RSList As New ADODB.Recordset
Dim SQLStr As String
Dim ItemIndex As Long
If (TypeOf AListControl Is ListBox) Or (TypeOf AListControl Is ComboBox) Then
AListControl.Clear
SQLStr = "SELECT [" & AListField & "] AS ListField"
AKeyField = Trim$(AKeyField)
If AKeyField <> "" Then
SQLStr = SQLStr & ", [" & AKeyField & "] AS KeyField"
End If
SQLStr = SQLStr & " FROM [" & ATable & "]"
If TempCnn.State = 1 Then TempCnn.Close
TempCnn.CursorLocation = adUseClient
TempCnn.Provider = "Microsoft.Jet.OLEDB.4.0;"
TempCnn.Open App.Path & "\database.mdb"
RSList.Open SQLStr, TempCnn, adOpenStatic, adLockOptimistic
If Not IsEmptyRecordSet(RSList) Then
RSList.MoveFirst
Do While Not RSList.EOF
If Not IsNull(RSList("ListField")) Then
AListControl.AddItem RSList("ListField")
If AKeyField <> "" Then
If Not IsNull(RSList("KeyField")) Then
If IsNumeric(RSList("KeyField")) Then
AListControl.ItemData(AListControl.NewIndex) = RSList("KeyField")
End If
End If
End If
End If
RSList.MoveNext
Loop
End If
RSList.Close
Set RSList = Nothing
TempCnn.Close
Set TempCnn = Nothing
End If
End Sub
الدالة IsEmptyRecordSet تتأكد من وجود سجلات في مجموعة السجلات (Recordset) حيث تعيد True في حالة وجود سجلات، و تعيد False إذا لم يكن هناك سجلات.
الإجراء FillListFromTable هو الذي يقوم بتعبئة اللائحة. اللائحة يمكن أن تكون ComboBox أو ListBox. أما بارامتراته فهي كالتالي:
= البارامتر AListControl: اسم اللائحة، أي اسم الـ ComboBox أو الـ ListBox الذي تريد تعبئته.
= البارامتر ATable: اسم الجدول الذي تريد تعبئة البيانات منه.
= البارامتر AListField: اسم الحقل الذي يحتوي على البيانات المطلوب تعبئتها في اللائحة.
= البارامتر AKeyField: بارامتر اختياري و قيمته الافتراضية نص فارغ (Empty string) قد تستعمله لربط القيم المعبأة في اللائحة بأرقام من حقل عددي في الجدول. بما أنه اختياري فإنه يمكننا إهماله عند الاستدعاء.
و لتعبئة اللائحة قم باستدعاء الإجراء، مثلاً:
كود :
FillListFromTable List1, "item", "num"
FillListFromTable Combo1, "item", "num"
* الكود السابق جربته على برنامجك نفسه و يعمل.
* بالمناسبة: الخطأ الذي أشرت إليه في مشاركتك الأخيرة يعني أنك تحاول فتح الـ RS قبل - أو دون - استدعاء الإجراء conn لفتح الاتصال.
المعذرة مرة أخرى على التأخير.
نرجو الاستفادة و السلام.