Problem Statement

Develop an application for preparation of a quiz and its online conduction. The key features to be considered are as follows:

Solution

First we create a Database for our system. For this lab we consider three role. An admin that can manage users and courses or assignment of courses. A teacher can create quizzes, and students can attempt quizzes for thier respective assigned courses.

System Features
Role Functionality
Admin Adds teachers and students, creates courses, and assigns courses to users.
Teacher Views assigned courses, creates quizzes, and adds questions with correct options.
Student Views enrolled courses, selects a quiz, answers questions, and sees the final score.
Database Tables

The application is based on the following main tables:

Table Purpose
USERS_T Stores user information such as full name, email, password, and role.
COURSES_T Stores course title, description, and the teacher assigned to the course.
STUDENT_COURSES_T Maps students to the courses they are enrolled in.
QUIZZES_T Stores quiz title, description, allowed time, course, and creator.
QUESTIONS_T Stores quiz questions and their order within a quiz.
OPTIONS_T Stores answer options for each question and marks the correct option(s).
ATTEMPTS_T Stores quiz attempts, start time, submission time, and score.
ANSWERS Stores the option selected by a student for each question in an attempt.
DB Design

Database Schema

Working Flow
Step Description
1 The user logs in through the authentication page and is redirected to the correct dashboard based on role.
2 The admin creates users and courses, then assigns courses to teachers and students.
3 The teacher creates a quiz for an assigned course and adds multiple-choice questions.
4 The student selects an enrolled course, chooses a quiz, and attempts it question by question.
5 The system stores each answer, calculates the score from correct options, and saves the final result.

Code Implementation

Authenticate.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Authenticate.aspx.vb" Inherits="Authenticate" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Log In</title>

    <STYLE>

        *{
            box-sizing: border-box;
        }

        body, HTML,HEAD{
            padding: 0;
            margin: 0;
            height:95%;
            font-family: "Times New Roman";
        }
        body{
            display:flex;
            justify-content:center;
            align-items:center;
            background:#f4f6fb;
        }
        .main-container{
            border: 2px solid #e5e7eb;
            background: white;
            width: 100%;
            padding: 4.0rem;
            display:flex;
            justify-content:center;
            align-items:center;
            flex-direction:column;
            border-radius: 12px;
            transition: transform 0.3s ease;

            box-shadow: 5px 10px 10px rgba(0,0,0,0.2);

        }

        .main-container h1{
            border-bottom: 2px solid #2512cb;
            padding-bottom: 0.5rem;
            margin-top: 0;
            color: #4f46e5;
            margin-bottom: 2.5rem;
        }

        .main-container:hover{
           transform: translateY(-5px);
        }

        .input-box{
            margin-bottom: 1.0rem;
        }

        .button{
            width: 30%;
            transition: transform 0.3s ease;
            border-radius: 10px;
            cursor: pointer;
            transition: transform 0.2s ease, background-color 0.2s;
        }

        .button:hover{
            transform: translateY(-2px);
            background: #3730a3;
            box-shadow: 0 4px 6px rgba(0,0,0,0.2);
        }

    </STYLE>

</head>
<body>
    <form id="form1" runat="server">
        <div class="main-container">
            <h1>Online Quiz Portal</h1>
            
            <div class="input-box">
                <label for="emailTxt" id="emaillbl"><b>Email</b></label><br /> 
                <asp:TextBox ID="emailTxt" runat="server" Width="172px"></asp:TextBox><br />
            </div>

            <div class="input-box">
                <label for="passwordTxt" id="passlbl"><b>Password</b></label><br />
                <asp:TextBox ID="passwordTxt" runat="server" Textmode="Password" Width="172px"></asp:TextBox><br />
            </div>


            <asp:Button ID="loginbtn" runat="server" Text="Login" CssClass="button" />

            
        </div>
        
        <p>
            <asp:Label ID="Status" runat="server" Text=""></asp:Label>
        </p>

    </form>
</body>
</html>
            
Authenticate.aspx.vb
Imports System.Data
Imports System.Data.SqlClient

Partial Class Authenticate
    Inherits System.Web.UI.Page


    Private Sub loginbtn_Click(sender As Object, e As EventArgs) Handles loginbtn.Click
        Dim email As String = emailTxt.Text
        Dim pass As String = passwordTxt.Text

        If String.IsNullOrEmpty(email) Or String.IsNullOrEmpty(pass) Then
            Response.Redirect("./Authenticate.aspx")
            Exit Sub
        End If

        Dim conn As New SqlConnection

        Dim constr As String
        constr = "Data Source=WIN-3G30IJDBABE\SQLEXPRESS;Integrated Security=True;Database = QuizApp"

        conn.ConnectionString = constr

        Dim cmd As New SqlCommand
        cmd.Connection = conn

        cmd.CommandText = "SELECT FULL_NAME,ROLE,ID FROM USERS_T WHERE "
        cmd.CommandText &= "EMAIL = '" & email & "' AND PASSWORD = '"
        cmd.CommandText &= pass & "' "

        Dim dr As SqlDataReader

        Try
            conn.Open()
            dr = cmd.ExecuteReader()


            If dr.Read() Then

                Dim role As String = dr("ROLE").ToString()
                Dim id As String = dr("ID").ToString()
                Dim name As String = dr("FULL_NAME").ToString()

                Session("UserEmail") = email
                Session("UserRole") = role
                Session("UserId") = id
                Session("FULL_NAME") = name

                Select Case role.ToLower()
                    Case "admin"
                        Response.Redirect("Admin.aspx")
                    Case "teacher"
                        Response.Redirect("Teacher.aspx")
                    Case "student"
                        Response.Redirect("Student.aspx")
                End Select
            Else
                Status.Text = "Invalid Email or Password."
                Response.Redirect("Authenticate.aspx")
            End If

            dr.Close()

        Catch ex As Exception
            Status.Text = ex.Message
        Finally
            cmd.Dispose()
            conn.Close()
        End Try

    End Sub
End Class

                
Admin.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Admin.aspx.vb" Inherits="Admin" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Admin Dashboard</title>
    <style>
        * {
            box-sizing: border-box;
        }

        body, html {
            padding: 0;
            margin: 0;
            height: 100%;
            font-family: "Times New Roman";
            background: #f4f6fb;
        }

        .main-container {
            background: white;
            border: 1px solid black;
            padding: 40px;
            margin: 5% auto;
            max-width: 800px;
            min-width: 300px;
            border-radius: 8px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.05);
        }

        .main-body h2 {
            margin-top: 0;
            color: #4f46e5;
            font-size: 30px;
            text-align: center;
            margin-bottom: 10px;
        }

        .header {
            text-align: center;
            margin-bottom: 30px;
        }

            .header span {
                color: #4f46e5;
                font-size: 32px;
                font-weight: bold;
            }

        .admin-card {
            background: #f9fafb;
            padding: 25px;
            border-radius: 8px;
            border: 1px solid #e5e7eb;
            margin-bottom: 30px;
            box-shadow: 0 2px 4px rgba(0,0,0,0.02);
        }


            .admin-card h3 {
                color: #4f46e5;
                margin-top: 0;
                margin-bottom: 20px;
                border-bottom: 2px solid #e5e7eb;
                padding-bottom: 10px;
                font-size: 20px;
            }

        .form-group {
            margin-bottom: 15px;
        }

            .form-group label {
                color: #333;
                font-size: 16px;
                font-weight: bold;
                margin-bottom: 8px;
            }

        .form-control {
            width: 100%;
            padding: 12px;
            border: 1px solid #e5e7eb;
            border-radius: 8px;
            font-family: "Times New Roman";
            font-size: 16px;
            transition: border-color 0.2s;
        }

        .btn-submit {
            width: 20%;
            transition: transform 0.3s ease;
            border-radius: 10px;
            cursor: pointer;
            transition: transform 0.2s ease, background-color 0.2s;
        }

            .btn-submit:hover {
                transform: translateY(-2px);
                background: #3730a3;
                box-shadow: 0 4px 6px rgba(0,0,0,0.2);
            }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div class="main-container">
            <div class="header">
                <asp:Label ID="name" runat="server" Text=""></asp:Label>
            </div>

            <asp:Label ID="lblMessage" runat="server" CssClass="message-label"></asp:Label>
            <div class="admin-card">
                <h3>1. Add New Teacher</h3>
                <div class="form-group">
                    <label>Full Name:</label>
                    <asp:TextBox ID="txtTeacherName" runat="server" CssClass="form-control"></asp:TextBox>
                </div>
                <div class="form-group">
                    <label>Email:</label>
                    <asp:TextBox ID="txtTeacherEmail" runat="server" CssClass="form-control"></asp:TextBox>
                </div>
                <div class="form-group">
                    <label>Password:</label>
                    <asp:TextBox ID="txtTeacherPassword" runat="server" CssClass="form-control" TextMode="Password"></asp:TextBox>
                </div>
                <asp:Button ID="btnAddTeacher" runat="server" Text="Add Teacher" CssClass="btn-submit" />
            </div>

            <div class="admin-card">
                <h3>2. Add a New Student</h3>
                <div class="form-group">
                    <label>Full Name:</label>
                    <asp:TextBox ID="txtStudentName" runat="server" CssClass="form-control"></asp:TextBox>
                </div>
                <div class="form-group">
                    <label>Email:</label>
                    <asp:TextBox ID="txtStudentEmail" runat="server" CssClass="form-control"></asp:TextBox>
                </div>
                <div class="form-group">
                    <label>Password:</label>
                    <asp:TextBox ID="txtStudentPassword" runat="server" CssClass="form-control" TextMode="Password"></asp:TextBox>
                </div>
                <asp:Button ID="btnAddStudent" runat="server" Text="Add Student" CssClass="btn-submit" />
            </div>

            <div class="admin-card">
                <h3>3. Assign Course to Teacher</h3>
                <div class="form-group">
                    <label>Select Teacher:</label>
                    <asp:DropDownList ID="ddlTeachers" runat="server" CssClass="form-control"></asp:DropDownList>
                </div>
                <div class="form-group">
                    <label>Select Course:</label>
                    <asp:DropDownList ID="ddlTeacherCourses" runat="server" CssClass="form-control"></asp:DropDownList>
                </div>
                <asp:Button ID="btnAssignTeacher" runat="server" Text="Assign to Teacher" CssClass="btn-submit" />
            </div>

            <div class="admin-card">
                <h3>4. Assign Course to Student</h3>
                <div class="form-group">
                    <label>Select Student:</label>
                    <asp:DropDownList ID="ddlStudents" runat="server" CssClass="form-control"></asp:DropDownList>
                </div>
                <div class="form-group">
                    <label>Select Course:</label>
                    <asp:DropDownList ID="ddlStudentCourses" runat="server" CssClass="form-control"></asp:DropDownList>
                </div>
                <asp:Button ID="btnAssignStudent" runat="server" Text="Assign to Student" CssClass="btn-submit" />
            </div>

            <div class="admin-card">
                <h3>5. Create New Course</h3>
                <div class="form-group">
                    <label>Course Title:</label>
                    <asp:TextBox ID="txtCourseTitle" runat="server" CssClass="form-control"></asp:TextBox>
                </div>
                <div class="form-group">
                    <label>Description:</label>
                    <asp:TextBox ID="txtCourseDesc" runat="server" CssClass="form-control" TextMode="MultiLine" Rows="3"></asp:TextBox>
                </div>
                <div class="form-group">
                    <label>Assign to Teacher (Optional):</label>
                    <asp:DropDownList ID="ddlCourseTeacher" runat="server" CssClass="form-control"></asp:DropDownList>
                </div>
                <asp:Button ID="btnCreateCourse" runat="server" Text="Create Course" CssClass="btn-submit" />
            </div>

            <asp:Label ID="Status" runat="server" Text=""></asp:Label>
        </div>
    </form>
</body>
</html>
                
Admin.aspx.vb

Imports System.Data
Imports System.Data.SqlClient

Partial Class Admin
    Inherits System.Web.UI.Page

    Dim constr As String = "Data Source=WIN-3G30IJDBABE\SQLEXPRESS;Integrated Security=True;Database = QuizApp"

    Private Sub form1_Load(sender As Object, e As EventArgs) Handles form1.Load
        If Session("UserRole") Is Nothing OrElse Session("UserRole").ToString().ToLower() <> "admin" Then
            Response.Redirect("Authenticate.aspx")
        End If
        name.Text = "Welcome " + Session("FULL_NAME")

        If Not IsPostBack Then
            load_dropdowns()
        End If

    End Sub

    Private Sub load_dropdowns()

        Dim conn As New SqlConnection
        conn.ConnectionString = constr

        Dim cmd As New SqlCommand
        cmd.Connection = conn

        cmd.CommandText = "SELECT ID, FULL_NAME FROM USERS_T WHERE ROLE = 'teacher'"

        Dim dr As SqlDataReader

        Try
            conn.Open()
            dr = cmd.ExecuteReader()
            ddlTeachers.Items.Clear()
            ddlCourseTeacher.Items.Clear()

            ddlCourseTeacher.Items.Add(New ListItem("-- Unassigned --", "0"))

            While dr.Read()
                Dim tItem As New ListItem(dr("FULL_NAME").ToString(), dr("ID").ToString())
                ddlTeachers.Items.Add(tItem)
                ddlCourseTeacher.Items.Add(tItem)
            End While
            dr.Close()

            cmd.CommandText = "SELECT ID, FULL_NAME FROM USERS_T WHERE ROLE = 'student'"
            dr = cmd.ExecuteReader()
            ddlStudents.Items.Clear()
            While dr.Read()
                ddlStudents.Items.Add(New ListItem(dr("FULL_NAME").ToString(), dr("ID").ToString()))
            End While
            dr.Close()

            cmd.CommandText = "SELECT ID, TITLE FROM COURSES_T"
            dr = cmd.ExecuteReader()
            ddlTeacherCourses.Items.Clear()
            ddlStudentCourses.Items.Clear()
            While dr.Read()
                Dim courseItem As New ListItem(dr("TITLE").ToString(), dr("ID").ToString())
                ddlTeacherCourses.Items.Add(courseItem)
                ddlStudentCourses.Items.Add(courseItem)
            End While
            dr.Close()


        Catch ex As Exception
            Status.Text = ex.Message
        Finally
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub

    Private Sub btnAddTeacher_Click(sender As Object, e As EventArgs) Handles btnAddTeacher.Click
        Dim name As String = txtTeacherName.Text.Trim()
        Dim email As String = txtTeacherEmail.Text.Trim()
        Dim pass As String = txtTeacherPassword.Text.Trim()
        Dim role As String = "teacher"

        If name = "" Or email = "" Or pass = "" Then
            Status.Text = "Please fill in all fields to add a teacher."
            Exit Sub
        End If


        Dim conn As New SqlConnection
        conn.ConnectionString = constr

        Dim cmd As New SqlCommand
        cmd.Connection = conn

        cmd.CommandText = "INSERT INTO USERS_T(FULL_NAME,EMAIL,PASSWORD,ROLE) "
        cmd.CommandText &= "VALUES ('" & name & "', '" & email & "', '" & pass & "', '" & role & "')"
        Try
            conn.Open()
            Dim ins As Integer = cmd.ExecuteNonQuery()

            Status.Text = ins & " Teacher Added"
            txtTeacherName.Text = ""
            txtTeacherEmail.Text = ""
            txtTeacherPassword.Text = ""
            load_dropdowns()

        Catch ex As Exception
            Status.Text = ex.Message
        Finally
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub

    Private Sub btnAddStudent_Click(sender As Object, e As EventArgs) Handles btnAddStudent.Click
        Dim name As String = txtStudentName.Text.Trim()
        Dim email As String = txtStudentEmail.Text.Trim()
        Dim pass As String = txtStudentPassword.Text.Trim()
        Dim role As String = "student"

        If name = "" Or email = "" Or pass = "" Then
            Status.Text = "Please fill in all fields to add a student."
            Exit Sub
        End If


        Dim conn As New SqlConnection
        conn.ConnectionString = constr

        Dim cmd As New SqlCommand
        cmd.Connection = conn

        cmd.CommandText = "INSERT INTO USERS_T(FULL_NAME,EMAIL,PASSWORD,ROLE) "
        cmd.CommandText &= "VALUES ('" & name & "', '" & email & "', '" & pass & "', '" & role & "')"
        Try
            conn.Open()
            Dim ins As Integer = cmd.ExecuteNonQuery()

            Status.Text = ins & " Student Added"
            txtStudentName.Text = ""
            txtStudentEmail.Text = ""
            txtStudentPassword.Text = ""
            load_dropdowns()

        Catch ex As Exception
            Status.Text = ex.Message
        Finally
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub

    Private Sub btnAssignTeacher_Click(sender As Object, e As EventArgs) Handles btnAssignTeacher.Click
        If ddlTeachers.Items.Count = 0 Or ddlTeacherCourses.Items.Count = 0 Then
            Status.Text = "Not enough data to assign a course."
            Exit Sub
        End If

        Dim teacherId As String = ddlTeachers.SelectedValue
        Dim courseId As String = ddlTeacherCourses.SelectedValue

        Dim conn As New SqlConnection
        conn.ConnectionString = constr

        Dim cmd As New SqlCommand
        cmd.Connection = conn

        cmd.CommandText = "UPDATE COURSES_T SET ASSIGNED_TO = " & teacherId & " WHERE ID = " & courseId
        Try
            conn.Open()
            Dim ins As Integer = cmd.ExecuteNonQuery()

            If ins > 0 Then
                Status.Text = "Course Sucessfully assigned assigned to the teacher ! "
            Else
                Status.Text = "Could not find the course to update."
            End If

        Catch ex As Exception
            Status.Text = ex.Message
        Finally
            cmd.Dispose()
            conn.Close()
        End Try

    End Sub

    Private Sub btnAssignStudent_Click(sender As Object, e As EventArgs) Handles btnAssignStudent.Click
        Dim studentId As String = ddlStudents.SelectedValue
        Dim courseId As String = ddlStudentCourses.SelectedValue


        Dim conn As New SqlConnection
        conn.ConnectionString = constr

        Dim cmd As New SqlCommand
        cmd.Connection = conn

        cmd.CommandText = "INSERT INTO STUDENT_COURSES_T(STUDENT_ID,COURSE_ID) "
        cmd.CommandText &= "VALUES (" & studentId & "," & courseId & ")"
        Try
            conn.Open()
            Dim ins As Integer = cmd.ExecuteNonQuery()

            If ins > 0 Then
                Status.Text = "Course Sucessfully assigned assigned to the student ! "
            Else
                Status.Text = "Could not find the course to update."
            End If

        Catch ex As Exception
            Status.Text = ex.Message
        Finally
            cmd.Dispose()
            conn.Close()
        End Try

    End Sub

    Private Sub btnCreateCourse_Click(sender As Object, e As EventArgs) Handles btnCreateCourse.Click
        Dim title As String = txtCourseTitle.Text
        Dim desc As String = txtCourseDesc.Text
        Dim teacherId As String = ddlCourseTeacher.SelectedValue

        If title = "" Or desc = "" Then
            Status.Text = "Please provide a Title and Description for the course."
            Exit Sub
        End If

        Dim conn As New SqlConnection
        conn.ConnectionString = constr

        Dim cmd As New SqlCommand
        cmd.Connection = conn

        cmd.CommandText = "INSERT INTO COURSES_T(TITLE ,DESCRIPTION, ASSIGNED_TO) "
        cmd.CommandText &= "VALUES ('" & title & "','" & desc & "','" & teacherId & "')"

        Try
            conn.Open()
            Dim ins As Integer = cmd.ExecuteNonQuery()

            If ins > 0 Then
                Status.Text = "Course Sucessfully created! "
            Else
                Status.Text = "Error in course creation."
            End If

            txtCourseTitle.Text = ""
            txtCourseDesc.Text = ""
            ddlCourseTeacher.SelectedIndex = 0
            load_dropdowns()
        Catch ex As Exception
            Status.Text = ex.Message
        Finally
            cmd.Dispose()
            conn.Close()
        End Try

    End Sub
End Class
                
Teacher.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Teacher.aspx.vb"
Inherits="Teacher" %>

<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head runat="server">
    <title>Teacher Dashboard</title>
    <style>
        *{
            box-sizing: border-box;
        }

        body, HTML{
            padding: 0;
            margin: 0;
            height: 100%;
            font-family: "Times New Roman";
            background: #f4f6fb;
        }
        .header{
            padding-bottom: 0.5rem;
            margin-bottom: 2.0rem;
            color: #4f46e5;
            background:white;
            border:1px solid black;
            padding: 2% 1%;
            margin:1% 2%;
            border-radius: 8px;
        }

        .header h2{
            margin:0;
            color: #4f46e5;
            font-size: 30px;
            text-align:center;
        }

        .quiz-list-container{
            background:red;
            padding: 40px;
            padding: 2% 1%;
            margin:1% 2%;
            border-radius: 8px;
            background:white;
            border:1px solid black;
        }

        .quiz-list-container h3 {
            color: #333;
            margin-top: 0;
            margin-bottom: 20px;
            font-size: 22px;
        }

        .button {
            float: right;
        }

        .create-btn{
            padding: 10px 20px;
            transition: transform 0.2s ease, background-color 0.2s;
            border-radius: 8px;
            background-color: #4f46e5;
            border: none;
            color: white;
            font-weight: bold;
            font-size: 16px;
            cursor: pointer;
        }

        .create-btn:hover{
            transform: translateY(-2px);
            background: #3730a3;
            box-shadow: 0 4px 6px rgba(0,0,0,0.2);
        }

        ul{
            list-style-type: none;
            padding: 0;
            margin: 0;
        }

        ul li{
            background: white;
            margin-bottom: 12px;
            padding: 15px 20px;
            border-radius: 8px;
            border: 1px solid #e5e7eb;
            transition: border-color 0.2s, box-shadow 0.2s;
        }

        ul li:hover{
            border-color: #4f46e5;
            box-shadow: 0 4px 8px rgba(79, 70, 229, 0.15);
        }

        ul li a {
            text-decoration: none;
            color: #4f46e5;
            font-weight: bold;
            display: block;
            width: 100%;
        }


    </style>
  </head>
  <body>
    <form id="form1" runat="server">
      <div class="main-container">
        <div class="header">
          <h2>
            Welcome,
            <asp:Label ID="teacherLbl" runat="server" Text="Teacher"></asp:Label>!
          </h2>
        </div>

        <div class="quiz-list-container">
          <div class="button">
            <asp:Button
              ID="btnCreateQuiz"
              runat="server"
              Text="+ Create New Quiz"
              CssClass="create-btn"
            />
          </div>
          <h3>Your Published Quizzes</h3>
          <asp:BulletedList
            ID="listQuizzes"
            runat="server"
            DisplayMode="LinkButton"
            OnClick="show_quiz_details"
          ></asp:BulletedList>
        </div>
      </div>
    </form>
  </body>
</html>
                
Teacher.aspx.vb
Imports System.Data
Imports System.Data.SqlClient

Partial Class Teacher
    Inherits System.Web.UI.Page

    Dim connstr As String = "Data Source=WIN-3G30IJDBABE\SQLEXPRESS;Integrated Security=True;Database = QuizApp"

    Private Sub form1_Load(sender As Object, e As EventArgs) Handles form1.Load


        If Session("UserRole") Is Nothing OrElse Session("UserRole").ToString().ToLower() <> "teacher" Then
            Response.Redirect("Authenticate.aspx")
        End If

        If Not IsPostBack Then
            teacherLbl.Text = Session("FULL_NAME").ToString()
            load_quizzes()
        End If

    End Sub

    Private Sub load_quizzes()

        Dim teacher_id As String = Session("UserId")

        Dim conn As SqlConnection = New SqlConnection
        conn.ConnectionString = connstr

        Dim cmd As SqlCommand = New SqlCommand
        cmd.Connection = conn

        cmd.CommandText = "SELECT ID, TITLE, DESCRIPTION FROM QUIZZES_T WHERE CREATED_BY = " & teacher_id

        Dim dr As SqlDataReader
        Try
            conn.Open()
            dr = cmd.ExecuteReader()

            While dr.Read()
                Dim li As New ListItem(dr("TITLE").ToString(), dr("ID").ToString())
                listQuizzes.Items.Add(li)

            End While
        Catch ex As Exception

        Finally
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub

    Public Sub show_quiz_details(sender As Object, e As BulletedListEventArgs)
        Dim selectedQuizId As String = listQuizzes.Items(e.Index).Value
        Session("QuizId") = selectedQuizId
        Response.Redirect("/QuizDetails.aspx")
    End Sub

    Private Sub btnCreateQuiz_Click(sender As Object, e As EventArgs) Handles btnCreateQuiz.Click
        Response.Redirect("CreateQuiz.aspx")
    End Sub
End Class
                
QuizDetails.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="CreateQuiz.aspx.vb" Inherits="CreateQuiz" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Create Quiz</title>
    <style>
        * {
            box-sizing: border-box;
        }

        body, html {
            padding: 0;
            margin: 0;
            height: 94%;
            font-family: "Times New Roman";
            background: #f4f6fb;
        }

        .main-body {
            background: white;
            border: 1px solid black;
            padding: 40px;
            margin-left: 30%;
            margin-right: 30%;
            margin-top: 5%;
            max-width: 600px;
            min-width: 300px;
            border-radius: 8px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.05);
        }

            .main-body h2 {
                margin-top: 0;
                color: #4f46e5;
                font-size: 30px;
                text-align: center;
                margin-bottom: 30px;
            }

        .button-container {
            display: flex;
            align-items: center;
            justify-content: center;
        }

        .button {
            width: 31%;
            transition: transform 0.3s ease;
            border-radius: 10px;
            cursor: pointer;
            transition: transform 0.2s ease, background-color 0.2s;
        }

            .button:hover {
                transform: translateY(-2px);
                background: #3730a3;
                box-shadow: 0 4px 6px rgba(0,0,0,0.2);
            }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div class="main-body">
            <h2>Create Quiz</h2>

            <label>Select Course:</label>
            <asp:DropDownList ID="ddlCourses" runat="server"></asp:DropDownList>
            <br />
            <br />

            <label>Quiz Title:</label>
            <asp:TextBox ID="quizTitleTxt" runat="server"></asp:TextBox>
            <br />
            <br />

            <label>Description:</label>
            <asp:TextBox ID="quizDescriptionTxt" runat="server" TextMode="MultiLine"></asp:TextBox>
            <br />
            <br />

            <label>Allowed Time (Minutes):</label>
            <asp:TextBox ID="txtTime" runat="server" TextMode="Number" Text="10"></asp:TextBox>
            <br />
            <br />

            <label>Settings:</label><br />
            <asp:CheckBox ID="chkRandom" runat="server" Text="Randomize Questions" /><br />
            <asp:CheckBox ID="chkShuffle" runat="server" Text="Shuffle Options" />
            <br />
            <br />

            <div class="button-container">
                <asp:Button ID="addQuestion" runat="server" Text="Save and Add Questions" CssClass="button" />
            </div>

            <br />

            <div class="button-container">
                <asp:Button ID="returnbtn" runat="server" Text="Return" CssClass="button" />
            </div>

            <asp:Label ID="lblMsg" runat="server" ForeColor="Red"></asp:Label>
        </div>
    </form>
</body>
</html>
                
QuizDetails.aspx.vb
Imports System.Data
Imports System.Data.SqlClient

Partial Class QuizDetails
    Inherits System.Web.UI.Page

    Dim connstr As String = "Data Source=WIN-3G30IJDBABE\SQLEXPRESS;Integrated Security=True;Database = QuizApp"

    Private Sub btnback_Click(sender As Object, e As EventArgs) Handles btnback.Click
        Response.Redirect("Teacher.aspx")
    End Sub

    Private Sub form1_Load(sender As Object, e As EventArgs) Handles form1.Load
        If Session("UserRole") Is Nothing OrElse Session("UserRole").ToString().ToLower() <> "teacher" Then
            Response.Redirect("Authenticate.aspx")
        ElseIf Session("QuizId") Is Nothing Then
            Response.Redirect("Teacher.aspx")
        End If

        If Not IsPostBack Then
            load_questions()
            load_marks()
        End If
    End Sub

    Private Sub load_questions()
        Dim quizId As Integer = Session("QuizId")

        Dim conn As SqlConnection = New SqlConnection
        conn.ConnectionString = connstr

        Dim cmd As SqlCommand = New SqlCommand
        cmd.Connection = conn

        cmd.CommandText = "SELECT QUESTION_TEXT, OPTION_TEXT "
        cmd.CommandText &= "FROM QUESTIONs_T, OPTIONs_T "
        cmd.CommandText &= "WHERE Questions_t.Id = Options_T.question_id "
        cmd.CommandText &= "and options_t.IS_CORRECT = 1 and quiz_id = " & quizId


        Dim dr As SqlDataReader
        Try
            Dim head As TableRow = New TableRow
            Dim cell1 As TableCell = New TableCell
            Dim cell2 As TableCell = New TableCell

            Dim lbl As Label = New Label
            lbl.Text = "Questions"
            lbl.Style.Add("font-weight", "bold")
            cell1.Controls.Add(lbl)
            Dim lbl2 As Label = New Label
            lbl2.Text = "Correct Answer"
            lbl2.Style.Add("font-weight", "bold")
            cell2.Controls.Add(lbl2)

            head.Controls.Add(cell1)
            head.Controls.Add(cell2)

            questionTable.Controls.Add(head)

            conn.Open()
            dr = cmd.ExecuteReader()
            While dr.Read()
                Dim qText As String = dr("QUESTION_TEXT").ToString()
                Dim ansText As String = dr("OPTION_TEXT").ToString()

                Dim qlbl As Label = New Label
                qlbl.Text = qText

                Dim albl As Label = New Label
                albl.Text = ansText

                Dim qcell As TableCell = New TableCell
                qcell.Controls.Add(qlbl)

                Dim acell As TableCell = New TableCell
                acell.Controls.Add(albl)

                Dim row As TableRow = New TableRow
                row.Controls.Add(qcell)
                row.Controls.Add(acell)

                questionTable.Controls.Add(row)

            End While

        Catch ex As Exception
            Response.Write(ex.Message)
        Finally
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub

    Private Sub load_marks()
        Dim quizId As Integer = Session("QuizId")

        Dim conn As SqlConnection = New SqlConnection
        conn.ConnectionString = connstr

        Dim cmd As SqlCommand = New SqlCommand
        cmd.Connection = conn

        Dim dr As SqlDataReader
        cmd.CommandText = "Select COUNT(id) as Total_Marks "
        cmd.CommandText &= "FROM QUESTIONS_T Where QUIZ_ID = " & quizId

        Dim Total_Marks As Integer
        Try
            conn.Open()
            dr = cmd.ExecuteReader()
            dr.Read()
            Total_Marks = dr("Total_Marks")

        Catch ex As Exception
            Response.Write(ex.Message)
        Finally
            cmd.Dispose()
            conn.Close()
        End Try

        cmd.CommandText = "SELECT max(SCORE) as SCORE, FULL_NAME "
        cmd.CommandText &= "FROM USERS_T U,QUIZZES_T Q,ATTEMPTS_T A "
        cmd.CommandText &= "WHERE U.ID = A.STUDENT_ID and Q.ID = A.QUIZ_ID and q.ID = " & quizId & " "
        cmd.CommandText &= "Group by u.ID,FULL_NAME"


        Try
            Dim head As TableRow = New TableRow
            Dim cell1 As TableCell = New TableCell
            Dim cell2 As TableCell = New TableCell

            Dim lbl As Label = New Label
            lbl.Text = "Student Name"
            lbl.Style.Add("font-weight", "bold")
            cell1.Controls.Add(lbl)

            Dim lbl2 As Label = New Label
            lbl2.Text = "Score"
            lbl2.Style.Add("font-weight", "bold")
            cell2.Controls.Add(lbl2)

            head.Controls.Add(cell1)
            head.Controls.Add(cell2)

            markstable.Controls.Add(head)

            conn.Open()
            dr = cmd.ExecuteReader()


            While dr.Read()
                Dim studentName As String = dr("FULL_NAME").ToString()
                Dim marks As String = dr("SCORE").ToString()

                Dim slbl As Label = New Label
                slbl.Text = studentName

                Dim mlbl As Label = New Label
                mlbl.Text = marks & " / " & Total_Marks.ToString()

                Dim scell As TableCell = New TableCell
                scell.Controls.Add(slbl)

                Dim mcell As TableCell = New TableCell
                mcell.Controls.Add(mlbl)

                Dim row As TableRow = New TableRow
                row.Controls.Add(scell)
                row.Controls.Add(mcell)

                markstable.Controls.Add(row)
            End While

        Catch ex As Exception
            Response.Write(ex.Message)
        Finally
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub

End Class
                
CreateQuiz.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="CreateQuiz.aspx.vb" Inherits="CreateQuiz" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Create Quiz</title>
    <style>
        * {
            box-sizing: border-box;
        }

        body, html {
            padding: 0;
            margin: 0;
            height: 94%;
            font-family: "Times New Roman";
            background: #f4f6fb;
        }

        .main-body {
            background: white;
            border: 1px solid black;
            padding: 40px;
            margin-left: 30%;
            margin-right: 30%;
            margin-top: 5%;
            max-width: 600px;
            min-width: 300px;
            border-radius: 8px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.05);
        }

            .main-body h2 {
                margin-top: 0;
                color: #4f46e5;
                font-size: 30px;
                text-align: center;
                margin-bottom: 30px;
            }

        .button-container {
            display: flex;
            align-items: center;
            justify-content: center;
        }

        .button {
            width: 31%;
            transition: transform 0.3s ease;
            border-radius: 10px;
            cursor: pointer;
            transition: transform 0.2s ease, background-color 0.2s;
        }

            .button:hover {
                transform: translateY(-2px);
                background: #3730a3;
                box-shadow: 0 4px 6px rgba(0,0,0,0.2);
            }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div class="main-body">
            <h2>Create Quiz</h2>

            <label>Select Course:</label>
            <asp:DropDownList ID="ddlCourses" runat="server"></asp:DropDownList>
            <br />
            <br />

            <label>Quiz Title:</label>
            <asp:TextBox ID="quizTitleTxt" runat="server"></asp:TextBox>
            <br />
            <br />

            <label>Description:</label>
            <asp:TextBox ID="quizDescriptionTxt" runat="server" TextMode="MultiLine"></asp:TextBox>
            <br />
            <br />

            <label>Allowed Time (Minutes):</label>
            <asp:TextBox ID="txtTime" runat="server" TextMode="Number" Text="10"></asp:TextBox>
            <br />
            <br />

            <label>Settings:</label><br />
            <asp:CheckBox ID="chkRandom" runat="server" Text="Randomize Questions" /><br />
            <asp:CheckBox ID="chkShuffle" runat="server" Text="Shuffle Options" />
            <br />
            <br />

            <div class="button-container">
                <asp:Button ID="addQuestion" runat="server" Text="Save and Add Questions" CssClass="button" />
            </div>

            <br />

            <div class="button-container">
                <asp:Button ID="returnbtn" runat="server" Text="Return" CssClass="button" />
            </div>

            <asp:Label ID="lblMsg" runat="server" ForeColor="Red"></asp:Label>
        </div>
    </form>
</body>
</html>
                
CreateQuiz.aspx.vb

Imports System.Data.SqlClient

Partial Class CreateQuiz
    Inherits System.Web.UI.Page

    Dim constr As String = "Data Source=WIN-3G30IJDBABE\SQLEXPRESS;Integrated Security=True;Database=QuizApp"

    Private Sub form1_Load(sender As Object, e As EventArgs) Handles form1.Load
        If Session("UserRole") Is Nothing OrElse Session("UserRole").ToString().ToLower() <> "teacher" Then
            Response.Redirect("Authenticate.aspx")
        End If
        If Not IsPostBack Then
            loadCourses()
        End If
    End Sub

    Private Sub loadCourses()
        Dim conn As New SqlConnection
        conn.ConnectionString = constr

        Dim cmd As New SqlCommand
        cmd.Connection = conn

        cmd.CommandText = "SELECT ID, TITLE FROM COURSES_T WHERE ASSIGNED_TO = " & Session("UserId")

        Dim dr As SqlDataReader

        Try
            conn.Open()
            dr = cmd.ExecuteReader()

            While dr.Read()
                Dim li As New ListItem(dr("TITLE").ToString(), dr("ID").ToString())
                ddlCourses.Items.Add(li)
            End While
        Catch ex As Exception

        Finally
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub

    Private Sub addQuestion_Click(sender As Object, e As EventArgs) Handles addQuestion.Click
        Dim quiztitle As String = quizTitleTxt.Text
        Dim quizDescription As String = quizDescriptionTxt.Text
        Dim time As String = txtTime.Text
        Dim courseId As String = ddlCourses.SelectedValue

        Dim conn As New SqlConnection
        conn.ConnectionString = constr

        Dim cmd As New SqlCommand
        cmd.Connection = conn

        cmd.CommandText = "INSERT INTO QUIZZES_T(COURSE_ID,CREATED_BY,TITLE,DESCRIPTION,ALLOWED_TIME_MINUTES) "
        cmd.CommandText &= "VALUES (" & courseId & "," & Session("UserId") & ",'" & quiztitle
        cmd.CommandText &= "','" & quizDescription & "'," & time & ")"

        Try
            conn.Open()
            cmd.ExecuteNonQuery()

            cmd.CommandText = "SELECT ID FROM QUIZZES_T "
            cmd.CommandText &= "WHERE TITLE = '" & quiztitle & "' AND CREATED_BY = " & Session("UserId")

            Dim dr As SqlDataReader
            dr = cmd.ExecuteReader()
            dr.Read()

            Dim newQuizId As String = dr("ID").ToString
            Response.Redirect("AddQuestions.aspx?QuizID=" & newQuizId)

        Catch ex As Exception
            Response.Write(ex.Message)
        Finally
            cmd.Dispose()
            conn.Close()
        End Try

    End Sub

    Private Sub returnbtn_Click(sender As Object, e As EventArgs) Handles returnbtn.Click
        Response.Redirect("Teacher.aspx")
    End Sub
End Class

                
AddQustions.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="AddQuestions.aspx.vb" Inherits="AddQuestions" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Add Qustions</title>
    <style>
        * {
            box-sizing: border-box;
        }

        body, html {
            padding: 0;
            margin: 0;
            height: 100%;
            font-family: "Times New Roman";
            background: #f4f6fb;
        }

        .main-container {
            background: white;
            border: 1px solid black;
            padding: 40px;
            margin: 5% auto;
            max-width: 800px;
            min-width: 300px;
            border-radius: 8px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.05);
        }

            .main-container h2 {
                margin-top: 0;
                color: #4f46e5;
                font-size: 30px;
                text-align: center;
                margin-bottom: 30px;
            }

        .box {
            margin-bottom: 25px;
        }

        #QuizInfoLbl {
            display: block;
            text-align: center;
            color: #6b7280;
            font-size: 16px;
            margin-bottom: 20px;
        }

        label {
            display: block;
            color: #333;
            font-size: 18px;
            margin-bottom: 8px;
        }

        textarea {
            width: 100%;
            padding: 12px;
            border: 1px solid #e5e7eb;
            border-radius: 8px;
            font-family: "Times New Roman";
            font-size: 16px;
            min-height: 100px;
            resize: vertical;
            transition: border-color 0.2s, box-shadow 0.2s;
        }

            textarea:focus {
                outline: none;
                border-color: #4f46e5;
                box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.15);
            }

        .option-box {
            display: flex;
            align-items: center;
            background: #f9fafb;
            padding: 15px;
            border-radius: 8px;
            border: 1px solid #e5e7eb;
            gap: 15px;
        }

        .button-container {
            display: flex;
            align-items: center;
            justify-content: center;
        }

        .button {
            width: 31%;
            transition: transform 0.3s ease;
            border-radius: 10px;
            cursor: pointer;
            transition: transform 0.2s ease, background-color 0.2s;
        }

            .button:hover {
                transform: translateY(-2px);
                background: #3730a3;
                box-shadow: 0 4px 6px rgba(0,0,0,0.2);
            }
    </style>

</head>
<body>
    <form id="form1" runat="server">
        <div class="main-container">
            <h2>Add Questions to Quiz</h2>
            <asp:Label ID="QuizInfoLbl" runat="server" Font-Bold="True"></asp:Label>
            <hr />

            <div class="box">
                <label><b>Question Statement</b></label>
                <asp:TextBox ID="questiontxt" runat="server" TextMode="MultiLine"></asp:TextBox>
            </div>

            <div class="option-box">
                <label><b>Option a: </b></label>
                <asp:TextBox ID="txtOption1" runat="server" />
                <asp:CheckBox ID="chkCorrect1" runat="server" Text=" Correct" />
            </div>

            <div class="option-box">
                <label><b>Option b: </b></label>
                <asp:TextBox ID="txtOption2" runat="server" />
                <asp:CheckBox ID="chkCorrect2" runat="server" Text=" Correct" />
            </div>

            <div class="option-box">
                <label><b>Option c: </b></label>
                <asp:TextBox ID="txtOption3" runat="server" />
                <asp:CheckBox ID="chkCorrect3" runat="server" Text=" Correct" />
            </div>

            <div class="option-box">
                <label><b>Option d: </b></label>
                <asp:TextBox ID="txtOption4" runat="server" />
                <asp:CheckBox ID="chkCorrect4" runat="server" Text=" Correct" />
            </div>

            <asp:Button ID="btnaddquestion" runat="server" Text="+ Add Question" CssClass="button" />
            <asp:Button ID="btnfinish" runat="server" Text="Finish Quiz" CssClass="button" />


        </div>
    </form>
</body>
</html>
                
AddQuestions.aspx.vb
Imports System.Data
Imports System.Data.SqlClient
Partial Class AddQuestions
    Inherits System.Web.UI.Page

    Dim constr As String = "Data Source=WIN-3G30IJDBABE\SQLEXPRESS;Integrated Security=True;Database=QuizApp"
    Private Sub clear()
        questiontxt.Text = ""
        txtOption1.Text = ""
        txtOption2.Text = ""
        txtOption3.Text = ""
        txtOption4.Text = ""

        chkCorrect1.Checked = False
        chkCorrect2.Checked = False
        chkCorrect3.Checked = False
        chkCorrect4.Checked = False

        questiontxt.Focus()

    End Sub

    Private Sub form1_Load(sender As Object, e As EventArgs) Handles form1.Load
        Dim currentQuizId As String = Request.QueryString("QuizID")

        If Not IsPostBack Then
            QuizInfoLbl.Text = "Adding questions to Quiz ID: " & currentQuizId
        End If
    End Sub

    Private Function CheckValue(ByVal chk As CheckBox) As Integer
        If chk.Checked Then
            Return 1
        Else
            Return 0
        End If
    End Function

    Private Sub btnaddquestion_Click(sender As Object, e As EventArgs) Handles btnaddquestion.Click
        Dim currentQuizId As String = Request.QueryString("QuizID")

        Dim conn As New SqlConnection
        conn.ConnectionString = constr

        Dim cmd As New SqlCommand
        cmd.Connection = conn

        cmd.CommandText = "INSERT INTO QUESTIONS_T (QUIZ_ID, QUESTION_TEXT, ORDER_INDEX) "
        cmd.CommandText &= "VALUES(" & currentQuizId & ", '" & questiontxt.Text & "', 1)"

        Try
            conn.Open()
            cmd.ExecuteNonQuery()


            cmd.CommandText = "SELECT ID FROM QUESTIONS_T "
            cmd.CommandText &= "WHERE QUIZ_ID = " & currentQuizId & " AND "
            cmd.CommandText &= "QUESTION_TEXT LIKE '" & questiontxt.Text & "'"

            Dim dr As SqlDataReader
            dr = cmd.ExecuteReader()
            dr.Read()

            Dim newQustionId As String = dr("ID").ToString
            dr.Close()


            cmd.CommandText = "INSERT INTO OPTIONS_T (QUESTION_ID,OPTION_TEXT,IS_CORRECT) "
            cmd.CommandText &= "VALUES (" & newQustionId & ", '" & txtOption1.Text & "', " & CheckValue(chkCorrect1) & ")"
            cmd.ExecuteNonQuery()

            cmd.CommandText = "INSERT INTO OPTIONS_T (QUESTION_ID,OPTION_TEXT,IS_CORRECT) "
            cmd.CommandText &= "VALUES (" & newQustionId & ", '" & txtOption2.Text & "', " & CheckValue(chkCorrect2) & ")"
            cmd.ExecuteNonQuery()

            cmd.CommandText = "INSERT INTO OPTIONS_T (QUESTION_ID,OPTION_TEXT,IS_CORRECT) "
            cmd.CommandText &= "VALUES (" & newQustionId & ", '" & txtOption3.Text & "', " & CheckValue(chkCorrect3) & ")"
            cmd.ExecuteNonQuery()

            cmd.CommandText = "INSERT INTO OPTIONS_T (QUESTION_ID,OPTION_TEXT,IS_CORRECT) "
            cmd.CommandText &= "VALUES (" & newQustionId & ", '" & txtOption4.Text & "', " & CheckValue(chkCorrect4) & ")"
            cmd.ExecuteNonQuery()

        Catch ex As Exception
            Response.Write(ex.Message)
        Finally
            cmd.Dispose()
            conn.Close()
        End Try

        clear()

    End Sub

    Private Sub btnfinish_Click(sender As Object, e As EventArgs) Handles btnfinish.Click
        Response.Redirect("Teacher.aspx")
    End Sub
End Class

Student.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Student.aspx.vb" Inherits="Student" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Student</title>
    <style>
        * {
            box-sizing: border-box;
        }

        body, html {
            padding: 0;
            margin: 0;
            height: 100%;
            font-family: "Times New Roman";
            background: #f4f6fb;
        }

        .main-container {
            background: white;
            border: 1px solid black;
            padding: 40px;
            margin: 5% auto;
            max-width: 800px;
            min-width: 300px;
            border-radius: 8px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.05);
        }

        .main-body h2 {
            margin-top: 0;
            color: #4f46e5;
            font-size: 30px;
            text-align: center;
            margin-bottom: 10px;
        }

        hr {
            border: none;
            border-top: 2px solid #e5e7eb;
            margin: 20px 0 25px 0;
        }

        .quiz-list-container h3 {
            color: #333;
            margin-top: 0;
            margin-bottom: 15px;
            font-size: 20px;
        }

        .quiz-list-container h3 {
            color: #333;
            margin-top: 0;
            margin-bottom: 15px;
            font-size: 20px;
        }

        ul {
            list-style-type: none;
            padding: 0;
            margin: 0;
        }

            ul li {
                background: white;
                margin-bottom: 12px;
                padding: 15px 20px;
                border-radius: 8px;
                border: 1px solid #e5e7eb;
                transition: border-color 0.2s, box-shadow 0.2s;
            }

                ul li a {
                    text-decoration: none;
                    color: #4f46e5;
                    font-weight: bold;
                    display: block;
                    width: 100%;
                }

                ul li:hover {
                    border-color: #4f46e5;
                    box-shadow: 0 4px 8px rgba(79, 70, 229, 0.15);
                }



        .button {
            width: 20%;
            transition: transform 0.3s ease;
            border-radius: 10px;
            cursor: pointer;
            transition: transform 0.2s ease, background-color 0.2s;
        }

            .button:hover {
                transform: translateY(-2px);
                background: #3730a3;
                box-shadow: 0 4px 6px rgba(0,0,0,0.2);
            }
    </style>

</head>
<body>
    <form id="form1" runat="server">
        <div class="main-container">
            <h2>
                <asp:Label ID="studentLbl" runat="server" Text=""></asp:Label></h2>
            <hr />
            <div class="quiz-list-container">
                <h3>Select Course</h3>
                <asp:DropDownList ID="ddlcourses" runat="server" Height="16px" Width="183px"></asp:DropDownList>
                <asp:Button ID="btnshowQuizzes" runat="server" Text="Show Quizes" CssClass="button" />

                <hr />
                <br />
                <br />

                <asp:BulletedList ID="listQuizzes" runat="server" DisplayMode="LinkButton" OnClick="Quiz_Click"></asp:BulletedList>
                <asp:Label ID="lblMessage" runat="server" Text=""></asp:Label>
            </div>
        </div>
    </form>
</body>
</html>
        
Student.aspx.vb
Imports System.Data
Imports System.Data.SqlClient
Partial Class Student
    Inherits System.Web.UI.Page

    Dim connstr As String = "Data Source=WIN-3G30IJDBABE\SQLEXPRESS;Integrated Security=True;Database = QuizApp"

    Private Sub form1_Load(sender As Object, e As EventArgs) Handles form1.Load
        If Session("UserRole") Is Nothing OrElse Session("UserRole").ToString().ToLower() <> "student" Then
            Response.Redirect("Authenticate.aspx")
        End If

        If Not IsPostBack Then
            studentLbl.Text = Session("FULL_NAME").ToString()
            load_courses()
        End If
    End Sub

    Private Sub load_courses()
        Dim student_id As String = Session("UserId")

        Dim conn As SqlConnection = New SqlConnection
        conn.ConnectionString = connstr

        Dim cmd As SqlCommand = New SqlCommand
        cmd.Connection = conn

        cmd.CommandText = "SELECT COURSE_ID, TITLE "
        cmd.CommandText &= "FROM STUDENT_COURSES_T, COURSES_T "
        cmd.CommandText &= "WHERE STUDENT_COURSES_T.COURSE_ID = COURSES_T.ID AND "
        cmd.CommandText &= "STUDENT_ID = " & student_id

        Dim dr As SqlDataReader
        Try
            conn.Open()
            dr = cmd.ExecuteReader()

            While dr.Read()
                Dim li As New ListItem(dr("TITLE").ToString(), dr("COURSE_ID").ToString())
                ddlcourses.Items.Add(li)
            End While
        Catch ex As Exception

        Finally
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub

    Private Sub btnshowQuizzes_Click(sender As Object, e As EventArgs) Handles btnshowQuizzes.Click
        Dim selectedCourseId As String = ddlcourses.SelectedValue

        If String.IsNullOrEmpty(selectedCourseId) Then
            lblMessage.Text = "Please select a course first."
            Exit Sub
        End If

        Dim conn As SqlConnection = New SqlConnection
        conn.ConnectionString = connstr

        Dim cmd As SqlCommand = New SqlCommand
        cmd.Connection = conn

        cmd.CommandText = "SELECT ID AS QUIZ_ID, TITLE FROM QUIZZES_T WHERE COURSE_ID = " & selectedCourseId

        Dim dr As SqlDataReader
        Try
            conn.Open()
            dr = cmd.ExecuteReader()

            listQuizzes.Items.Clear()
            lblMessage.Text = ""

            While dr.Read()
                Dim li As New ListItem(dr("TITLE").ToString(), dr("QUIZ_ID").ToString())
                listQuizzes.Items.Add(li)
            End While

            If listQuizzes.Items.Count = 0 Then
                lblMessage.Text = "There are no quizzes available for this course right now."
            End If

        Catch ex As Exception
            lblMessage.Text = ex.Message
        Finally
            cmd.Dispose()
            conn.Close()
        End Try

    End Sub

    Public Sub Quiz_click(sender As Object, e As BulletedListEventArgs)
        Dim selectedQuizID As String = listQuizzes.Items(e.Index).Value
        Dim quizTitle As String = listQuizzes.Items(e.Index).Text
        Dim student_id As String = Session("UserId").ToString()

        Dim conn As SqlConnection = New SqlConnection
        conn.ConnectionString = connstr

        Dim cmd As SqlCommand = New SqlCommand
        cmd.Connection = conn


        cmd.CommandText = "SELECT max(SCORE) AS SCORE FROM ATTEMPTS_T WHERE STUDENT_ID = " & student_id & " AND QUIZ_ID = " & selectedQuizID

        Try
            conn.Open()
            Dim dr As SqlDataReader = cmd.ExecuteReader()

            If dr.Read() AndAlso Not IsDBNull(dr("SCORE")) Then
                Dim previousScore As String = dr("SCORE").ToString()
                lblMessage.Text = "You have already attempted '" & quizTitle & "'. Your score is: " & previousScore
                lblMessage.ForeColor = Drawing.Color.DarkRed
            Else
                Session("QuizId") = selectedQuizID
                Session("QuizTitle") = quizTitle
                Response.Redirect("AttemptQuiz.aspx")
            End If

        Catch ex As Exception
            lblMessage.Text = "Error: " & ex.Message
            lblMessage.ForeColor = Drawing.Color.Red
        Finally
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub

End Class

      
AttemptQuiz.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="AttemptQuiz.aspx.vb" Inherits="AttemptQuiz" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Attemp Quiz</title>
    <style>
        * {
            box-sizing: border-box;
        }

        body, html {
            padding: 0;
            margin: 0;
            height: 100%;
            font-family: "Times New Roman";
            background: #f4f6fb;
        }

        .main-container {
            background: white;
            border: 1px solid black;
            padding: 40px;
            margin: 5% auto;
            max-width: 800px;
            min-width: 300px;
            border-radius: 8px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.05);
        }

            .main-container h2 {
                margin-top: 0;
                color: #4f46e5;
                font-size: 30px;
                text-align: center;
                margin-bottom: 5px;
            }

        .question-card {
            background: #f9fafb;
            padding: 30px;
            border-radius: 8px;
            border: 1px solid #e5e7eb;
            margin-bottom: 25px;
        }

        .button {
            width: 20%;
            transition: transform 0.3s ease;
            border-radius: 10px;
            cursor: pointer;
            transition: transform 0.2s ease, background-color 0.2s;
        }

            .button:hover {
                transform: translateY(-2px);
                background: #3730a3;
                box-shadow: 0 4px 6px rgba(0,0,0,0.2);
            }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div class="main-container">
            <h2>
                <asp:Label ID="quizId" runat="server" Text="Label"></asp:Label></h2>
            <asp:Label ID="statuslbl" runat="server" Text="Label"></asp:Label>
            <hr />

            <div class="question-card" id="quizContainer" runat="server">
                <h4>
                    <asp:Label ID="progressLbl" runat="server" Text="Label"></asp:Label></h4>
                <h3>
                    <asp:Label ID="qustionlbl" runat="server"></asp:Label></h3>
                <asp:RadioButtonList ID="rblOptions" runat="server" CellPadding="5"></asp:RadioButtonList>
                <asp:Button ID="btnNext" runat="server" Text="Next Question" CssClass="button" />
                <asp:Button ID="btnSubmit" runat="server" Text="Submit Quiz" Visible="False" CssClass="button" />
            </div>
            <asp:Label ID="lblFinalScore" runat="server" Font-Bold="True" Font-Size="Large" ForeColor="Green"></asp:Label>
            <br />
            <asp:Button ID="returnBtn" runat="server" Text="Return" CssClass="button" />
        </div>
    </form>
</body>
</html>
AttemptQuiz.aspx.vb
Imports System.Data.SqlClient

Partial Class AttemptQuiz
    Inherits System.Web.UI.Page
    Dim constr As String = "Data Source=WIN-3G30IJDBABE\SQLEXPRESS;Integrated Security=True;Database=QuizApp"

    Private Sub form1_Load(sender As Object, e As EventArgs) Handles form1.Load
        If Not IsPostBack Then

            If Session("UserId") Is Nothing Then
                Response.Redirect("Authenticate.aspx")
                Exit Sub
            End If

            Dim quiz_id As String = Session("QuizId")
            Dim quiz_title As String = Session("QuizTitle").ToString
            quizId.Text = "Attempting " & quiz_title
            load_questions()
        End If
    End Sub

    Private Sub load_questions()
        qustionlbl.Text = ""
        Dim currentQuizId As String = Session("QuizId")
        Dim studentId As String = Session("UserId").ToString()

        Dim conn As New SqlConnection
        conn.ConnectionString = constr

        Dim cmd As New SqlCommand
        cmd.Connection = conn

        cmd.CommandText = "INSERT INTO ATTEMPTS_T (QUIZ_ID, STUDENT_ID, STARTED_AT) VALUES ("
        cmd.CommandText &= currentQuizId & ", " & studentId & ", GETDATE())"

        Dim dr As SqlDataReader

        Try
            conn.Open()
            cmd.ExecuteNonQuery()

            cmd.CommandText = "SELECT MAX(ID) AS ID FROM ATTEMPTS_T WHERE QUIZ_ID = " & currentQuizId & " AND STUDENT_ID = " & studentId
            dr = cmd.ExecuteReader()
            dr.Read()
            Session("AttemptID") = dr("ID").ToString()
            dr.Close()

            cmd.CommandText = "SELECT ID FROM QUESTIONS_T WHERE QUIZ_ID = " & currentQuizId
            dr = cmd.ExecuteReader()

            Dim question_counts As Integer = 0
            While dr.Read()
                Dim questionid As String = dr("ID").ToString()
                question_counts = question_counts + 1
                Session("Question " & question_counts) = questionid
            End While

            dr.Close()

            Session("TotalQuestions") = question_counts
            ViewState("CurrentQuestionNumber") = 1

            If question_counts > 0 Then
                DisplaySpecificQuestion(1)
            Else
                qustionlbl.Text = "This quiz has no questions."
                rblOptions.Visible = False
                btnNext.Visible = False
                btnSubmit.Visible = False
                returnBtn.Visible = False
            End If

        Catch ex As Exception
            statuslbl.Text = ex.Message
        Finally
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub

    Private Sub DisplaySpecificQuestion(ByVal questionNum As Integer)
        statuslbl.Text = ""
        rblOptions.Items.Clear()

        Dim totalQuestion As Integer = CType(Session("TotalQuestions"), Integer)
        progressLbl.Text = "Question " & questionNum & " of " & totalQuestion

        Dim questionId As String = Session("Question " & questionNum).ToString()

        Dim conn As New SqlConnection
        conn.ConnectionString = constr

        Dim cmd As New SqlCommand
        cmd.Connection = conn

        Dim dr As SqlDataReader

        Try
            cmd.CommandText = "SELECT QUESTION_TEXT FROM QUESTIONS_T WHERE ID = " & questionId

            conn.Open()
            dr = cmd.ExecuteReader()
            dr.Read()
            qustionlbl.Text = dr("QUESTION_TEXT").ToString()

            cmd.CommandText = "SELECT ID, OPTION_TEXT FROM OPTIONS_T WHERE "
            cmd.CommandText &= "QUESTION_ID = " & questionId
            dr.Close()

            dr = cmd.ExecuteReader()

            While dr.Read()
                Dim li As ListItem = New ListItem(dr("OPTION_TEXT").ToString(), dr("ID").ToString())
                rblOptions.Items.Add(li)
            End While

            If questionNum = totalQuestion Then
                btnNext.Visible = False
                btnSubmit.Visible = True
            Else
                btnNext.Visible = True
                btnSubmit.Visible = False
            End If

        Catch ex As Exception
            statuslbl.Text = ex.Message
        Finally
            cmd.Dispose()
            conn.Close()
        End Try
    End Sub

    Private Function SaveCurrentAnswer() As Boolean
        If rblOptions.SelectedIndex = -1 Then
            statuslbl.Text = "Please select an answer before continuing!"
            Return False
        End If

        Dim currentNum As Integer = CType(ViewState("CurrentQuestionNumber"), Integer)
        Dim questionId As String = Session("Question " & currentNum).ToString()
        Dim selectedOptionId As String = rblOptions.SelectedValue
        Dim attemptId As String = Session("AttemptID").ToString()

        Dim conn As New SqlConnection
        conn.ConnectionString = constr

        Dim cmd As New SqlCommand
        cmd.Connection = conn

        Try
            conn.Open()

            cmd.CommandText = "INSERT INTO answers (ATTEMPT_ID, QUESTION_ID, SELECTED_OPTION_ID) "
            cmd.CommandText &= "VALUES (" & attemptId & ", " & questionId & ", " & selectedOptionId & ")"

            cmd.ExecuteNonQuery()

            Return True

        Catch ex As Exception
            statuslbl.Text = "Error saving answer: " & ex.Message
            Return False
        Finally
            conn.Close()
        End Try
    End Function

    Protected Sub btnNext_Click(sender As Object, e As EventArgs) Handles btnNext.Click
        If Not SaveCurrentAnswer() Then
            Exit Sub
        End If

        Dim currentNum As Integer = CType(ViewState("CurrentQuestionNumber"), Integer)
        currentNum = currentNum + 1
        ViewState("CurrentQuestionNumber") = currentNum
        DisplaySpecificQuestion(currentNum)
    End Sub

    Protected Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click
        If Not SaveCurrentAnswer() Then
            Exit Sub
        End If

        GradeQuiz()
    End Sub

    Private Sub GradeQuiz()
        Dim attemptId As String = Session("AttemptID").ToString()
        Dim totalQuestions As String = Session("TotalQuestions").ToString()
        Dim score As Integer = 0

        Dim conn As New SqlConnection
        conn.ConnectionString = constr

        Dim cmd As New SqlCommand
        cmd.Connection = conn

        Dim dr As SqlDataReader
        Try
            conn.Open()

            cmd.CommandText = "SELECT COUNT(*) AS GRADE "
            cmd.CommandText &= "FROM answers A, OPTIONS_T O "
            cmd.CommandText &= "WHERE A.SELECTED_OPTION_ID = O.ID AND A.ATTEMPT_ID = " & attemptId & " AND "
            cmd.CommandText &= "O.IS_CORRECT = 1"

            dr = cmd.ExecuteReader()
            dr.Read()

            score = dr("GRADE")
            dr.Close()

            cmd.CommandText = "UPDATE ATTEMPTS_T "
            cmd.CommandText &= "SET SCORE = " & score & ", SUBMITTED_AT = GETDATE() "
            cmd.CommandText &= "WHERE ID = " & attemptId

            cmd.ExecuteNonQuery()

            quizContainer.Visible = False
            statuslbl.Text = ""
            lblFinalScore.Text = "Quiz Complete! Your Score: " & score & " / " & totalQuestions
            returnBtn.Visible = True

        Catch ex As Exception
            statuslbl.Text = "Error grading quiz: " & ex.Message
        Finally
            conn.Close()
        End Try

    End Sub

    Private Sub returnBtn_Click(sender As Object, e As EventArgs) Handles returnBtn.Click
        Response.Redirect("Student.aspx")
    End Sub
End Class
        

Users for Testing

The following users can be used for testing of the app

Admin
Login Email Login Password
afzaal@gmail.com admin1234
Teacher
Login Email Login Password
irfan@gmail.com irfan123
naveed@gmail.com naveed123
Students
Login Email Login Password
basit@gmail.com basit123
naqvi@gmail.com naqvi123
umer@gmail.com umer123
Web hosting by Somee.com