PDA

View Full Version : ساخت آزمون گیر در ویندوز فرم



korosh00
چهارشنبه 27 دی 1402, 20:33 عصر
سلام

مراحل ساخت سیستم آزمون گیر تحت ویندوز رو میشه بفرمایید .
مثلا در یک صفحه چطور 10 سوال نمایش داده بشه هر سوال 4گزینه و بعد از زدن تمام 10 سوال یک صفحه خودش صفحه بعد رو نمایش بده تا حدود مثلا 100 سوال .
سپاس

پرستو پارسایی
پنج شنبه 28 دی 1402, 21:10 عصر
سلام ببینید این مثال کمکتان میکنه

using System;
using System.Collections.Generic;
using System.Windows.Forms;


namespace ExamSystem
{
public partial class MainForm : Form
{
private List<Question> questions;
private int currentQuestionIndex;


public MainForm()
{
InitializeComponent();


questions = new List<Question>
{
new Question("سوال 1", new List<string> { "گزینه الف", "گزینه ب", "گزینه ج", "گزینه د" }),
new Question("سوال 2", new List<string> { "گزینه الف", "گزینه ب", "گزینه ج", "گزینه د" }),
// و سایر سوالات
};


currentQuestionIndex = 0;
ShowQuestion();
}


private void ShowQuestion()
{
if (currentQuestionIndex < questions.Count)
{
Question currentQuestion = questions[currentQuestionIndex];
lblQuestion.Text = currentQuestion.Text;
rbOption1.Text = currentQuestion.Options[0];
rbOption2.Text = currentQuestion.Options[1];
rbOption3.Text = currentQuestion.Options[2];
rbOption4.Text = currentQuestion.Options[3];
}
else
{
// نمایش صفحه بعدی
MessageBox.Show("شما به صفحه بعدی رفتید!");
}
}


private void btnNext_Click(object sender, EventArgs e)
{
// ذخیره پاسخ کاربر


currentQuestionIndex++;
ShowQuestion();
}
}


public class Question
{
public string Text { get; set; }
public List<string> Options { get; set; }


public Question(string text, List<string> options)
{
Text = text;
Options = options;
}
}
}

korosh00
جمعه 29 دی 1402, 07:07 صبح
ممنون .برای ساخت صفحه نمایش سوالات از لیست استفاده می کنید ؟ برای اتصال به دیتابیس چکارمیکنید ؟

پرستو پارسایی
جمعه 29 دی 1402, 17:43 عصر
در btnNext میتونید دستورات ذخیره در دیتابیس را اعمال کنید . اطلاعات کافی در مورد دیتابیس خودتان ندادید . با این حال این نمونه با اسکیوال اکسپرس هست امیدوارم مفید واقع بشه



using System;using System.Collections.Generic;
using System.Data.SqlClient;
using System.Windows.Forms;


namespace ExamSystem
{
public partial class MainForm : Form
{
private List<Question> questions;
private int currentQuestionIndex;
private SqlConnection connection;

public MainForm()
{
InitializeComponent();

// ایجاد اتصال به بانک اطلاعاتی
string connectionString = "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=YourDatabaseName;Integrated Security=True";
connection = new SqlConnection(connectionString);

questions = new List<Question>
{
new Question("سوال 1", new List<string> { "گزینه الف", "گزینه ب", "گزینه ج", "گزینه د" }),
new Question("سوال 2", new List<string> { "گزینه الف", "گزینه ب", "گزینه ج", "گزینه د" }),
// و سایر سوالات
};

currentQuestionIndex = 0;
ShowQuestion();
}

private void ShowQuestion()
{
if (currentQuestionIndex < questions.Count)
{
Question currentQuestion = questions[currentQuestionIndex];
lblQuestion.Text = currentQuestion.Text;
rbOption1.Text = currentQuestion.Options[0];
rbOption2.Text = currentQuestion.Options[1];
rbOption3.Text = currentQuestion.Options[2];
rbOption4.Text = currentQuestion.Options[3];
}
else
{
// نمایش صفحه بعدی
MessageBox.Show("شما به صفحه بعدی رفتید!");
}
}

private void btnNext_Click(object sender, EventArgs e)
{
// ذخیره پاسخ کاربر
SaveUserAnswer();

currentQuestionIndex++;
ShowQuestion();
}

private void SaveUserAnswer()
{
// بررسی کدام گزینه انتخاب شده است و ذخیره در بانک اطلاعاتی
string selectedOption = "";
if (rbOption1.Checked)
selectedOption = rbOption1.Text;
else if (rbOption2.Checked)
selectedOption = rbOption2.Text;
else if (rbOption3.Checked)
selectedOption = rbOption3.Text;
else if (rbOption4.Checked)
selectedOption = rbOption4.Text;

// اجرای دستور INSERT به منظور ذخیره پاسخ کاربر در بانک اطلاعاتی
string query = "INSERT INTO UserAnswers (Question, Answer) VALUES (@Question, @Answer)";
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@Question", lblQuestion.Text);
command.Parameters.AddWithValue("@Answer", selectedOption);

try
{
connection.Open();
command.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show("خطا در ذخیره پاسخ کاربر: " + ex.Message);
}
finally
{
connection.Close();
}
}
}

public class Question
{
public string Text { get; set; }
public List<string> Options { get; set; }

public Question(string text, List<string> options)
{
Text = text;
Options = options;
}
}
}



هر بار که کاربر پاسخی را انتخاب می کنه، پاسخ ذخیره می شه. دستور INSERT برای ذخیره پاسخ کاربر در بانک اطلاعاتی اجرا می شه. نیاز به ایجاد جدول UserAnswers در بانک اطلاعاتی و تنظیمات اتصال به بانک اطلاعاتی خودتان هست که به کد اضافه کنید

korosh00
شنبه 30 دی 1402, 20:41 عصر
ممنون از توجه شما به سوال .
الان اگه بخواهیم در هر صفحه مثلا ۴سوال نمایش داده بشه چکاری میکنید ؟

پرستو پارسایی
شنبه 30 دی 1402, 21:12 عصر
برای نمایش 4 سوال در هر صفحه، می‌تونید از متغیرهای startIndex و endIndex استفاده کنید. مقدار اولیه startIndex را برابر با صفر قرار بدید و مقدار endIndex را برابر با 3 (تعداد سوالات در هر صفحه) قرار بدید. سپس در هر بار فراخوانی متد ShowQuestion()، سوالات از startIndex تا endIndex نمایش داده می‌شن و مقادیر startIndex و endIndex با 4 افزایش می‌یابند. اگر endIndex بزرگتر از تعداد کل سوالات باشه، به جای نمایش صفحه بعدی، پیامی نمایش داده می‌شه که به کاربر اطلاع می‌ده که به انتهای سوالات رسیده .

متغیرهای startIndex و endIndex تعیین می‌کنن که کدام سوالات در هر صفحه نمایش داده بشن. همچنین در هر بار کلیک بر روی دکمه "بعدی"، startIndex با 4 افزایش می‌یابد و endIndex برابر startIndex + 3 قرار می‌گیره. این مقادیر با استفاده از Math.Min() با تعداد کل سوالات و اندازه صفحه مقایسه می‌شن تا از ایجاد خطای خارج از محدوده جلوگیری بشه.


اینهم کد اصلاح شدش:




using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Windows.Forms;


namespace ExamSystem
{
public partial class MainForm : Form
{
private List<Question> questions;
private int startIndex;
private int endIndex;
private SqlConnection connection;


public MainForm()
{
InitializeComponent();


// ایجاد اتصال به بانک اطلاعاتی
string connectionString = "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=YourDatabaseName;Integrated Security=True";
connection = new SqlConnection(connectionString);


questions = new List<Question>
{
new Question("سوال 1", new List<string> { "گزینه الف", "گزینه ب", "گزینه ج", "گزینه د" }),
new Question("سوال 2", new List<string> { "گزینه الف", "گزینه ب", "گزینه ج", "گزینه د" }),
// و سایر سوالات
};


startIndex = 0;
endIndex = Math.Min(3, questions.Count - 1);
ShowQuestions();
}


private void ShowQuestions()
{
for (int i = startIndex; i <= endIndex; i++)
{
Question currentQuestion = questions[i];
// نمایش سوالات در تکست باکس یا لیبلهای مورد نظر
// ...
}


if (endIndex == questions.Count - 1)
{
// نمایش پیام به کاربر که به انتهای سوالات رسیده است
MessageBox.Show("شما به انتهای سوالات رسیده‌اید!");
}
}


private void btnNext_Click(object sender, EventArgs e)
{
// ذخیره پاسخ کاربر
SaveUserAnswers();


startIndex += 4;
endIndex = Math.Min(startIndex + 3, questions.Count - 1);
ShowQuestions();
}


private void SaveUserAnswers()
{
// ذخیره پاسخ‌های کاربر در بانک اطلاعاتی
// ...
}
}


public class Question
{
public string Text { get; set; }
public List<string> Options { get; set; }


public Question(string text, List<string> options)
{
Text = text;
Options = options;
}
}
}

korosh00
دوشنبه 02 بهمن 1402, 01:10 صبح
ممنون از زحمات شما

korosh00
جمعه 06 بهمن 1402, 19:18 عصر
سلام
من نتونستم انجام بدم . فقط میتونم اطلاعات رو مانند سوال و جواب از دیتابیس بیارم نشون بدم اونم تکی تکی . امکان داره یک نمونه کد کامل بگذارید . این کد اجرا نمیشه !

پرستو پارسایی
شنبه 14 بهمن 1402, 19:14 عصر
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;


public class Program : Form
{
// لیستی از سوالات
private List<string> questions = new List<string>()
{
"سوال ۱",
"سوال ۲",
"سوال ۳",
"سوال ۴"
};


// لیستی از گزینه‌های هر سوال
private List<List<string>> options = new List<List<string>>()
{
new List<string>() { "گزینه ۱.۱", "گزینه ۱.۲", "گزینه ۱.۳", "گزینه ۱.۴" },
new List<string>() { "گزینه ۲.۱", "گزینه ۲.۲", "گزینه ۲.۳", "گزینه ۲.۴" },
new List<string>() { "گزینه ۳.۱", "گزینه ۳.۲", "گزینه ۳.۳", "گزینه ۳.۴" },
new List<string>() { "گزینه ۴.۱", "گزینه ۴.۲", "گزینه ۴.۳", "گزینه ۴.۴" }
};


// شاخص سوال فعلی
private int currentQuestionIndex = 0;


// لیستی از لیبل‌ها
private List<Label> labels = new List<Label>();

// لیستی از گروه‌های رادیو باتن‌ها
private List<List<RadioButton>> radioButtons = new List<List<RadioButton>>();


public Program()
{
// اضافه کردن رویداد Load به فرم
this.Load += Program_Load;
}


private void Program_Load(object sender, EventArgs e)
{
// برای هر سوال، یک لیبل و چهار رادیو باتن ایجاد می‌کنیم و آنها را به فرم اضافه می‌کنیم
for (int i = 0; i < 4; i++)
{
Label label = new Label();
label.Text = questions[i];
label.Location = new Point(10, 10 + i * 50);
labels.Add(label);
this.Controls.Add(label);


List<RadioButton> radioButtonGroup = new List<RadioButton>();


for (int j = 0; j < 4; j++)
{
RadioButton radioButton = new RadioButton();
radioButton.Text = options[i][j];
radioButton.Location = new Point(10, 30 + i * 50 + j * 20);
radioButtonGroup.Add(radioButton);
this.Controls.Add(radioButton);
}


radioButtons.Add(radioButtonGroup);
}


// ایجاد و اضافه کردن دکمه Next
Button nextButton = new Button();
nextButton.Text = "بعدی";
nextButton.Location = new Point(10, 230);

// اضافه کردن رویداد Click به دکمه Next
nextButton.Click += NextButton_Click;
this.Controls.Add(nextButton);
}


private void NextButton_Click(object sender, EventArgs e)
{
// در صورتی که هنوز به آخرین سوال نرسیده‌ایم، سوال بعدی را نمایش می‌دهیم
if (currentQuestionIndex < 3)
{
currentQuestionIndex++;


for (int i = 0; i < 4; i++)
{
// تغییر متن لیبل‌ها و گزینه‌ها بر اساس سوال بعدی
labels[i].Text = questions[currentQuestionIndex];

for (int j = 0; j < 4; j++)
{
// تغییر متن رادیو باتن‌ها بر اساس گزینه‌های سوال بعدی و عدم انتخاب آنها
radioButtons[i][j].Text = options[currentQuestionIndex][j];
radioButtons[i][j].Checked = false;
}
}
}
else
{
MessageBox.Show("شما به آخرین سوال رسیده‌اید.");
}
}


public static void Main()
{
Application.Run(new Program());
}
}

از این کد ایده بگیرید امیدوارم مفید واقع بشه

korosh00
شنبه 14 بهمن 1402, 20:12 عصر
لود سوالات از دیتابیس به چه نحو است ؟ هر صفحه ۴یا ۵ سوال لود بشه . با زدن کلیک ۴ سوال بعدی لود بشه و همینطور تا آخر

shahryari
جمعه 25 اسفند 1402, 18:15 عصر
سلام
سالها پیش یکی از دوستان در این لینک (https://barnamenevis.org/showthread.php?415427-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%88%DB%8C%D8%AF%D8%A6%D9%88%DB%8C%DB%8C-%DB%8C%DA%A9-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-%D8%A7%D8%B2-%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7-%D8%AA%D8%A7-%D8%A7%D9%86%D8%AA%D9%87%D8%A7) بطور مفصل آموزش دادن