السلام عليكم ورحمة الله وبركاته
اخوتي العزاء انااقوم ببرمجة لعة من سيربح المليون ووضعت الاسئلة في قاعدة اكسس لكن واجهني مشكلة لا استطيع استراد الاسئلة من القاعدة ولا الاجابات بشكل عشوائي من الاكسس احتاج كود يقوم باستراد الاسئلة والاجابات بشكل عشوائي الي الليبول بوكس
شكرا
للاستدعاء العشوائي للبيانات من عمود في قاعدة بيانات Access وعرضها في عنصر تحكم Label باستخدام VB.NET، يمكنك اتباع الخطوات التالية:
الخطوات
إضافة المكتبات اللازمة:
تأكد من إضافة المكتبة الخاصة بـ OLE DB في مشروعك. يمكنك القيام بذلك عن طريق استيراد الأسماء التالية في أعلى الكود الخاص بك:
كود :
Imports System.Data.OleDb
إنشاء الاتصال بقاعدة البيانات:
قم بإنشاء سلسلة اتصال (Connection String) لقاعدة البيانات الخاصة بك.
كتابة الكود لاستدعاء البيانات:
استخدم الكود التالي لاستدعاء بيانات عشوائية من عمود معين:
كود :
Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=مسار_قاعدة_البيانات.accdb;"
Dim query As String = "SELECT اسم_العمود FROM اسم_الجدول"
Using connection As New OleDbConnection(connectionString)
Dim command As New OleDbCommand(query, connection)
connection.Open()
Dim reader As OleDbDataReader = command.ExecuteReader()
Dim values As New List(Of String)
While reader.Read()
values.Add(reader("اسم_العمود").ToString())
End While
' توليد رقم عشوائي لاختيار قيمة
Dim random As New Random()
Dim randomIndex As Integer = random.Next(0, values.Count)
' عرض القيمة العشوائية في Label
LabelName.Text = values(randomIndex) ' استبدل LabelName باسم Label الخاص بك
reader.Close()
End Using
الشرح
Connection String: تأكد من تعديل مسار_قاعدة_البيانات.accdb ليعكس المسار الفعلي لملف قاعدة البيانات الخاص بك.
Query: قم بتعديل "اسم_العمود" و"اسم_الجدول" لتناسب هيكل قاعدة البيانات لديك.
Random Selection: يتم إنشاء قائمة بالقيم المسترجعة، ثم يتم اختيار قيمة عشوائية منها باستخدام كائن Random.
بهذا الشكل، يمكنك استدعاء بيانات عشوائية من عمود في قاعدة بيانات Access وعرضها في عنصر تحكم Label باستخدام VB.NET.
شكرا لك اخي الكريم ولكن اريد ان اسئلك سؤال هل الاسئل ممكن تكرر وكيف اقضي علي احتمالية تكرار نفس السؤال شكرا
شكرا لحضرتك لكن ظهر مشكلة اخيرة وهيا الستدعاء الاجبات من نفس الرقم العشوائي هل لها حل
(31-12-24, 01:07 AM)fireswored1 كتب : [ -> ]شكرا لحضرتك لكن ظهر مشكلة اخيرة وهيا الستدعاء الاجبات من نفس الرقم العشوائي هل لها حل
المثال التالي كامل يعمل جيدا وتمت تجربته
المطلوب
قاعدة بيانات أكسس
بها جدول أسمه Questions يحتوي على الأعمدة التالية
ID
Question حقل نصي وفيه ستضع الأسئلة
OptionA حقل نصي وفيه الأجابة الأولى
OptionB حقل نصي وفيه الأجابة الثانية
OptionC حقل نصي وفيه الأجابة الثالثة
OptionD حقل نصي وفيه الأجابة الرابعة
CorrectAnswer حقل نصي وفيه ستضع الأجابة الوحيدة الصحيحة مما سبق
أفتح مشروع جديد
form1
أضف الأدوات التالية
LabelQuestion
ButtonA
ButtonB
ButtonC
ButtonD
ثم أضف الكود التالي كاملا في form1
كود :
Imports System.Data.OleDb
Public Class Form1
Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=مسار_قاعدة_البيانات.accdb;"
Dim questions As New List(Of Question)()
Dim currentQuestionIndex As Integer = 0
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
LoadQuestions()
DisplayQuestion()
End Sub
Private Sub LoadQuestions()
Using connection As New OleDbConnection(connectionString)
Dim command As New OleDbCommand("SELECT * FROM Questions", connection)
connection.Open()
Dim reader As OleDbDataReader = command.ExecuteReader()
While reader.Read()
Dim q As New Question()
q.ID = reader("ID")
q.Text = reader("Question").ToString()
q.OptionA = reader("OptionA").ToString()
q.OptionB = reader("OptionB").ToString()
q.OptionC = reader("OptionC").ToString()
q.OptionD = reader("OptionD").ToString()
q.CorrectAnswer = reader("CorrectAnswer").ToString()
questions.Add(q)
End While
End Using
End Sub
Private Sub DisplayQuestion()
If currentQuestionIndex < questions.Count Then
Dim question As Question = questions(currentQuestionIndex)
LabelQuestion.Text = question.Text
Buttona.Text = question.OptionA
Buttonb.Text = question.OptionB
Buttonc.Text = question.OptionC
Buttond.Text = question.OptionD
Else
MessageBox.Show("انتهت الأسئلة!")
End If
End Sub
Private Sub Button_Click(sender As Object, e As EventArgs) Handles Buttona.Click, Buttonb.Click, Buttonc.Click, Buttond.Click
Dim selectedButton As Button = CType(sender, Button)
Dim selectedAnswer As String = selectedButton.Text
If selectedAnswer = questions(currentQuestionIndex).CorrectAnswer Then
MessageBox.Show("إجابة صحيحة!")
Else
MessageBox.Show("إجابة خاطئة! الإجابة الصحيحة هي: " & questions(currentQuestionIndex).CorrectAnswer)
End If
currentQuestionIndex += 1
DisplayQuestion()
End Sub
End Class
Public Class Question
Public Property ID As Integer
Public Property Text As String
Public Property OptionA As String
Public Property OptionB As String
Public Property OptionC As String
Public Property OptionD As String
Public Property CorrectAnswer As String
End Class
حتى الأن الفكرة تعمل بشكل جيد
عليك التعديل في التصميم على حسب رؤيتك
ولا تنسي تغيير مسار القاعدة في الكود
أتمنى أن أكون وفقت في الشرح
لإتمام عملية استيراد الأسئلة والإجابات من قاعدة بيانات Access بشكل عشوائي وإظهارها في عناصر مثل
Label أو
ListBox في تطبيقك بلغة
Visual Basic.NET، يمكنك استخدام الكود التالي:
الخطوات
- تأكد من أنك قد أنشأت قاعدة البيانات وقمت بإضافة جدول يحتوي على الأعمدة المناسبة للأسئلة والإجابات.
- أضف مرجعًا لـ System.Data.OleDb في مشروعك للتعامل مع قواعد بيانات Access.
- استخدم الكود التالي لاستيراد البيانات بشكل عشوائي.
الكود
vb.net
نسخ الكود
كود :
Imports System.Data.OleDb
Public Class Form1
' استبدل بمسار قاعدة البيانات الخاص بك
Private Const DbPath As String = "C:\PathToYourDatabase\QuestionsDatabase.accdb"
Private ConnectionString As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={DbPath};"
' جلب سؤال عشوائي وإظهاره
Private Sub LoadRandomQuestion()
Dim query As String = "SELECT TOP 1 * FROM Questions ORDER BY RND(ID)"
Dim questionText As String = ""
Dim answer1 As String = ""
Dim answer2 As String = ""
Dim answer3 As String = ""
Dim answer4 As String = ""
Using conn As New OleDbConnection(ConnectionString)
Dim cmd As New OleDbCommand(query, conn)
conn.Open()
Dim reader As OleDbDataReader = cmd.ExecuteReader()
If reader.Read() Then
questionText = reader("Question").ToString()
answer1 = reader("Answer1").ToString()
answer2 = reader("Answer2").ToString()
answer3 = reader("Answer3").ToString()
answer4 = reader("Answer4").ToString()
End If
reader.Close()
End Using
' عرض السؤال والإجابات في واجهة المستخدم
lblQuestion.Text = questionText
lstAnswers.Items.Clear()
lstAnswers.Items.Add(answer1)
lstAnswers.Items.Add(answer2)
lstAnswers.Items.Add(answer3)
lstAnswers.Items.Add(answer4)
End Sub
' استدعاء الوظيفة عند تحميل الفورم
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
LoadRandomQuestion()
End Sub
End Class
ملاحظات
- هيكل قاعدة البيانات:
- تأكد من أن لديك جدولًا باسم Questions يحتوي على الأعمدة:
- ID: (رقم تلقائي أو مفتاح أساسي)
- Question: نص السؤال
- Answer1, Answer2, Answer3, Answer4: الإجابات المختلفة.
- الاستعلام العشوائي:
- نستخدم
ORDER BY RND(ID)
- لجلب صف عشوائي من الجدول.
- التعامل مع المكونات:
- استبدل
lblQuestion
- و
lstAnswers
- بالأسماء المناسبة للعناصر لديك.
- إضافة الإجابات بشكل عشوائي:
- إذا أردت خلط الإجابات داخل الـ
ListBox
- ، يمكنك استخدام الشيفرة التالية:
vb.net
نسخ الكود
Dim random As New Random()Dim shuffledAnswers = lstAnswers.Items.Cast(Of String)().OrderBy(Function() random.Next()).ToList()lstAnswers.Items.Clear()lstAnswers.Items.AddRange(shuffledAnswers.ToArray())
تشغيل الكود
- انسخ الكود أعلاه في مشروع Windows Forms.
- تأكد من تحديث المسار إلى قاعدة البيانات
DbPath
- .
- شغّل التطبيق للتأكد من أن الأسئلة والإجابات تظهر بشكل صحيح وعشوائي.
اخي الكريم شكرا لك علي المساعدة ولكن هذا الكود يقوم بعمل اخطاء عندي كمثال انا لا اضع بداية الاسئلة في بوتونبوكس بل افعل شئ اخر لو يكون في شرح لكل كود اكون مشكور انا احتاج اضغط عل زر ابداء فيداء سرد الاسئلة واخفاء البوتون الذي قام إدخاله وبعد الانتهاء من الاسئلة او اجب اجابة خاطئة يظهر بوتون بداية الاسئلة من جديد ولكن ليست هذه المشكلة الكود الذي قمنا به في استدعاء الاسئلة شكل عشوائي كان فعال احتاج شئ بداخله يقوم باستدعاء الاجاات ايضا في نفس صف السؤال واستيرادهم علي ليبول بوكس او بوتون بوكس وهناك سيكون بوتون اوليبول بوكس زائد سيرفع به الاجابة الصحيحة وحين الضغط علي اي اجابة من الاربعه ساقوم باضافة كود يطابق هذا البوتون او الليبول الاجابة الصحيحة
لإتمام عملية استيراد الأسئلة والإجابات من قاعدة بيانات Access بشكل عشوائي وإظهارها في عناصر مثل Label أو ListBox في تطبيقك بلغة Visual Basic.NET، يمكنك استخدام الكود التالي:
الخطوات
- تأكد من أنك قد أنشأت قاعدة البيانات وقمت بإضافة جدول يحتوي على الأعمدة المناسبة للأسئلة والإجابات.
- أضف مرجعًا لـ System.Data.OleDb في مشروعك للتعامل مع قواعد بيانات Access.
- استخدم الكود التالي لاستيراد البيانات بشكل عشوائي.
الكود
vb.net
نسخ الكود
كود :
كود :
Imports System.Data.OleDb
Public Class Form1
' استبدل بمسار قاعدة البيانات الخاص بك
Private Const DbPath As String = "C:\PathToYourDatabase\QuestionsDatabase.accdb"
Private ConnectionString As String = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={DbPath};"
' جلب سؤال عشوائي وإظهاره
Private Sub LoadRandomQuestion()
Dim query As String = "SELECT TOP 1 * FROM Questions ORDER BY RND(ID)"
Dim questionText As String = ""
Dim answer1 As String = ""
Dim answer2 As String = ""
Dim answer3 As String = ""
Dim answer4 As String = ""
Using conn As New OleDbConnection(ConnectionString)
Dim cmd As New OleDbCommand(query, conn)
conn.Open()
Dim reader As OleDbDataReader = cmd.ExecuteReader()
If reader.Read() Then
questionText = reader("Question").ToString()
answer1 = reader("Answer1").ToString()
answer2 = reader("Answer2").ToString()
answer3 = reader("Answer3").ToString()
answer4 = reader("Answer4").ToString()
End If
reader.Close()
End Using
' عرض السؤال والإجابات في واجهة المستخدم
lblQuestion.Text = questionText
lstAnswers.Items.Clear()
lstAnswers.Items.Add(answer1)
lstAnswers.Items.Add(answer2)
lstAnswers.Items.Add(answer3)
lstAnswers.Items.Add(answer4)
End Sub
' استدعاء الوظيفة عند تحميل الفورم
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
LoadRandomQuestion()
End Sub
End Class
ملاحظات
- هيكل قاعدة البيانات:
- تأكد من أن لديك جدولًا باسم Questions يحتوي على الأعمدة:
- ID: (رقم تلقائي أو مفتاح أساسي)
- Question: نص السؤال
- Answer1, Answer2, Answer3, Answer4: الإجابات المختلفة.
- الاستعلام العشوائي:
- نستخدم
ORDER BY RND(ID)
- لجلب صف عشوائي من الجدول.
- التعامل مع المكونات:
- استبدل
lblQuestion
- و
lstAnswers
- بالأسماء المناسبة للعناصر لديك.
- إضافة الإجابات بشكل عشوائي:
- إذا أردت خلط الإجابات داخل الـ
ListBox
- ، يمكنك استخدام الشيفرة التالية:
vb.net
نسخ الكود
Dim random As New Random()Dim shuffledAnswers = lstAnswers.Items.Cast(Of String)().OrderBy(Function() random.Next()).ToList()lstAnswers.Items.Clear()lstAnswers.Items.AddRange(shuffledAnswers.ToArray())
اخي الكريم هذا الكود رائع ولكن يأتي بسوال واحد فقط نفسه في كل مرة جزاك الله خيرا
شكرا للجميع لقد قمت بحل المشكلة بالستفادة من جميع اكوادكم قمت التعديل واتت النتيجة المجرجوة سارفق الكود لاستفادة الجميع
كود :
Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Data.mdb;"
Dim query As String = "SELECT question,Answer1,Answer2,Answer3,Answer4,CorrectAnswer FROM Questions"
Dim answer1 As String = ""
Dim answer2 As String = ""
Dim answer3 As String = ""
Dim answer4 As String = ""
Dim CorrectAnswer As String = ""
Using connection As New OleDbConnection(connectionString)
Dim command As New OleDbCommand(query, connection)
connection.Open()
Dim reader As OleDbDataReader = command.ExecuteReader()
Dim values As New List(Of String)
Dim values1 As New List(Of String)
Dim values2 As New List(Of String)
Dim values3 As New List(Of String)
Dim values4 As New List(Of String)
Dim values5 As New List(Of String)
While reader.Read()
values.Add(reader("Question").ToString())
values1.Add(reader("Answer1").ToString())
values2.Add(reader("Answer2").ToString())
values3.Add(reader("Answer3").ToString())
values4.Add(reader("Answer4").ToString())
values5.Add(reader("CorrectAnswer").ToString())
End While
reader.Close()
Dim selectedValues As New HashSet(Of String)()
Dim selectedValues1 As New HashSet(Of String)()
Dim selectedValues2 As New HashSet(Of String)()
Dim selectedValues3 As New HashSet(Of String)()
Dim selectedValues4 As New HashSet(Of String)()
Dim selectedValues5 As New HashSet(Of String)()
Dim random As New Random()
If values.Count > 0 Then
Dim randomIndex As Integer
Do
randomIndex = random.Next(0, values.Count)
randomIndex = random.Next(0, values1.Count)
randomIndex = random.Next(0, values2.Count)
randomIndex = random.Next(0, values3.Count)
randomIndex = random.Next(0, values4.Count)
randomIndex = random.Next(0, values5.Count)
Loop While selectedValues1.Contains(values(randomIndex))
selectedValues1.Add(values(randomIndex))
Do
Loop While selectedValues1.Contains(values1(randomIndex))
selectedValues1.Add(values1(randomIndex))
Do
Loop While selectedValues2.Contains(values2(randomIndex))
selectedValues1.Add(values2(randomIndex))
Do
Loop While selectedValues3.Contains(values3(randomIndex))
selectedValues1.Add(values3(randomIndex))
Do
Loop While selectedValues4.Contains(values4(randomIndex))
selectedValues1.Add(values4(randomIndex))
Do
Loop While selectedValues5.Contains(values5(randomIndex))
selectedValues1.Add(values5(randomIndex))
LabelQuestion.Text = values(randomIndex)
Label2.Text = values1(randomIndex)
Label3.Text = values2(randomIndex)
Label4.Text = values3(randomIndex)
Label5.Text = values4(randomIndex)
Label6.Text = values5(randomIndex)
Else
MessageBox.Show("لا توجد بيانات في العمود المحدد.")
End If
End Using