Implementation

Lab 10 - Source Code Reference

Complete Source Code for the Role-Based Half-Blood Restaurant System

Table of Contents

Database Schema

Lab_10/DB/setup_somee.sql

-- ============================================================
-- Half-Blood Restaurant - Somee DB Setup Script
-- Run this ONCE on PVFC_db at Somee to create all tables
-- ============================================================

-- Drop existing tables if they exist (safe cleanup)
IF OBJECT_ID('Feedback', 'U') IS NOT NULL DROP TABLE Feedback;
IF OBJECT_ID('Reservation', 'U') IS NOT NULL DROP TABLE Reservation;
IF OBJECT_ID('OrderItem', 'U') IS NOT NULL DROP TABLE OrderItem;
IF OBJECT_ID('OrderTable', 'U') IS NOT NULL DROP TABLE OrderTable;
IF OBJECT_ID('Store', 'U') IS NOT NULL DROP TABLE Store;
IF OBJECT_ID('MenuItem', 'U') IS NOT NULL DROP TABLE MenuItem;
IF OBJECT_ID('SupplierPhone', 'U') IS NOT NULL DROP TABLE SupplierPhone;
IF OBJECT_ID('Supplier', 'U') IS NOT NULL DROP TABLE Supplier;
IF OBJECT_ID('EmployeePhone', 'U') IS NOT NULL DROP TABLE EmployeePhone;
IF OBJECT_ID('Employee', 'U') IS NOT NULL DROP TABLE Employee;
IF OBJECT_ID('CustomerPhone', 'U') IS NOT NULL DROP TABLE CustomerPhone;
IF OBJECT_ID('Customer', 'U') IS NOT NULL DROP TABLE Customer;
IF OBJECT_ID('PaymentMethod', 'U') IS NOT NULL DROP TABLE PaymentMethod;
IF OBJECT_ID('EmployeeRole', 'U') IS NOT NULL DROP TABLE EmployeeRole;
GO

-- Lookup tables
CREATE TABLE PaymentMethod (
    MethodID   INT IDENTITY(1,1) PRIMARY KEY,
    MethodName VARCHAR(50) NOT NULL
);

CREATE TABLE EmployeeRole (
    RoleID          INT IDENTITY(1,1) PRIMARY KEY,
    RoleName        VARCHAR(50) NOT NULL,
    RoleDescription VARCHAR(255)
);

-- Main entities
CREATE TABLE Customer (
    CustomerID   INT IDENTITY(1,1) PRIMARY KEY,
    Username     VARCHAR(50) UNIQUE,
    Password     VARCHAR(50),
    CustomerName VARCHAR(100) NOT NULL,
    CustomerType VARCHAR(50),
    Street       VARCHAR(100),
    City         VARCHAR(50),
    PostalCode   VARCHAR(20)
);

CREATE TABLE CustomerPhone (
    PhoneID     INT IDENTITY(1,1) PRIMARY KEY,
    CustomerID  INT NOT NULL,
    PhoneNumber VARCHAR(20) NOT NULL,
    FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID) ON DELETE CASCADE
);

CREATE TABLE Employee (
    EmployeeID   INT IDENTITY(1,1) PRIMARY KEY,
    Username     VARCHAR(50) UNIQUE,
    Password     VARCHAR(50),
    EmployeeName VARCHAR(100) NOT NULL,
    Pay          DECIMAL(10,2) CHECK (Pay >= 0),
    Gender       VARCHAR(10),
    Email        VARCHAR(50) UNIQUE,
    ManagerID    INT NULL,
    DateOfBirth  DATE,
    RoleID       INT NOT NULL,
    FOREIGN KEY (ManagerID) REFERENCES Employee(EmployeeID),
    FOREIGN KEY (RoleID) REFERENCES EmployeeRole(RoleID)
);

CREATE TABLE EmployeePhone (
    PhoneID     INT IDENTITY(1,1) PRIMARY KEY,
    EmployeeID  INT NOT NULL,
    PhoneNumber VARCHAR(20) NOT NULL,
    FOREIGN KEY (EmployeeID) REFERENCES Employee(EmployeeID) ON DELETE CASCADE
);

CREATE TABLE Supplier (
    SupplierID   INT IDENTITY(1,1) PRIMARY KEY,
    SupplierName VARCHAR(100) NOT NULL,
    Street       VARCHAR(100),
    City         VARCHAR(50),
    PostalCode   VARCHAR(20)
);

CREATE TABLE SupplierPhone (
    PhoneID     INT IDENTITY(1,1) PRIMARY KEY,
    SupplierID  INT NOT NULL,
    PhoneNumber VARCHAR(20) NOT NULL,
    FOREIGN KEY (SupplierID) REFERENCES Supplier(SupplierID) ON DELETE CASCADE
);

CREATE TABLE MenuItem (
    ItemID       INT IDENTITY(1,1) PRIMARY KEY,
    ItemName     VARCHAR(100) NOT NULL,
    Price        DECIMAL(10,2) CHECK (Price >= 0),
    NumberOfItem INT,
    Category     VARCHAR(30)
);

CREATE TABLE Store (
    StoreID       INT IDENTITY(1,1) PRIMARY KEY,
    SupplierID    INT NOT NULL,
    ItemID        INT NOT NULL,
    StoreName     VARCHAR(100),
    Location      VARCHAR(100),
    StockQuantity INT CHECK (StockQuantity >= 0),
    FOREIGN KEY (SupplierID) REFERENCES Supplier(SupplierID),
    FOREIGN KEY (ItemID) REFERENCES MenuItem(ItemID)
);

CREATE TABLE OrderTable (
    OrderID       INT IDENTITY(1,1) PRIMARY KEY,
    CustomerID    INT NOT NULL,
    OrderDate     DATE NOT NULL DEFAULT GETDATE(),
    PaymentStatus VARCHAR(50) NULL,
    TotalAmount   DECIMAL(10,2) CHECK (TotalAmount >= 0),
    MethodID      INT NULL,
    FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID),
    FOREIGN KEY (MethodID) REFERENCES PaymentMethod(MethodID)
);

CREATE TABLE OrderItem (
    OrderItemID INT IDENTITY(1,1) PRIMARY KEY,
    OrderID     INT NOT NULL,
    ItemID      INT NOT NULL,
    Quantity    INT CHECK (Quantity > 0),
    UnitPrice   DECIMAL(10,2) CHECK (UnitPrice >= 0),
    Subtotal    DECIMAL(10,2) CHECK (Subtotal >= 0),
    FOREIGN KEY (OrderID) REFERENCES OrderTable(OrderID) ON DELETE CASCADE,
    FOREIGN KEY (ItemID) REFERENCES MenuItem(ItemID)
);

CREATE TABLE Reservation (
    ReservationID   INT IDENTITY(1,1) PRIMARY KEY,
    CustomerID      INT NOT NULL,
    OrderID         INT NULL,
    ReservationDate DATE NOT NULL,
    NumberOfPeople  INT CHECK (NumberOfPeople > 0),
    ReservationFee  DECIMAL(10,2) CHECK (ReservationFee >= 0),
    FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID),
    FOREIGN KEY (OrderID) REFERENCES OrderTable(OrderID)
);

CREATE TABLE Feedback (
    FeedbackID  INT IDENTITY(1,1) PRIMARY KEY,
    CustomerID  INT NOT NULL,
    EmployeeID  INT NULL,
    ItemID      INT NULL,
    StaffRating INT CHECK (StaffRating BETWEEN 1 AND 5),
    ItemRating  INT CHECK (ItemRating BETWEEN 1 AND 5),
    Comment     VARCHAR(300),
    FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID),
    FOREIGN KEY (EmployeeID) REFERENCES Employee(EmployeeID),
    FOREIGN KEY (ItemID) REFERENCES MenuItem(ItemID)
);
GO

-- ============================================================
-- Sample Data
-- ============================================================

INSERT INTO PaymentMethod (MethodName) VALUES ('Cash'), ('Card'), ('Online'), ('Wallet');

INSERT INTO EmployeeRole (RoleName, RoleDescription) VALUES
('Manager', 'Manages staff and operations'),
('Waiter',  'Serves customers'),
('Chef',    'Prepares food'),
('Cashier', 'Handles payments');

INSERT INTO Employee (Username, Password, EmployeeName, Pay, Gender, Email, ManagerID, DateOfBirth, RoleID) VALUES
('manager', 'owl123', 'Ali Manager',  80000, 'Male',   'ali.manager@rms.com',  NULL, '1985-05-10', 1),
('waiter', 'broom123', 'Sara Waiter',  35000, 'Female', 'sara.waiter@rms.com',  1,    '1998-03-15', 2),
('chef', 'pot123', 'Ahmed Chef',   50000, 'Male',   'ahmed.chef@rms.com',   1,    '1990-02-12', 3),
('cashier', 'coin123', 'Zara Cashier', 40000, 'Female', 'zara.cashier@rms.com', 1,    '1996-08-20', 4);

INSERT INTO Customer (Username, Password, CustomerName, CustomerType, Street, City, PostalCode) VALUES
('ahmad', 'cust123', 'Ahmad Khan',   'Regular', 'House 12, Street 5', 'Lahore',     '54000'),
('usman', 'cust123', 'Usman Ali',    'Regular', 'Street 10',           'Lahore',     '54001'),
('ayesha', 'cust123', 'Ayesha Noor',  'VIP',     'Block B',             'Karachi',    '75500'),
('bilal', 'cust123', 'Bilal Ahmed',  'Regular', 'Street 22',           'Islamabad',  '44000'),
('hina', 'cust123', 'Hina Khan',    'New',     'Sector F',            'Islamabad',  '44010');

INSERT INTO CustomerPhone (CustomerID, PhoneNumber) VALUES
(1, '0300-1111111'), (2, '0311-2222222'),
(3, '0333-3333333'), (4, '0301-4444444'), (5, '0322-5555555');

INSERT INTO Supplier (SupplierName, Street, City, PostalCode) VALUES
('Fresh Foods Pvt Ltd', 'Industrial Area', 'Lahore',    '54010'),
('Meat Masters',        'Warehouse Rd',    'Lahore',    '54020'),
('Bakery Supplies',     'Food St',         'Islamabad', '44100');

INSERT INTO MenuItem (ItemName, Price, NumberOfItem, Category) VALUES
('Zinger Burger',  450,  100, 'Fast Food'),
('French Fries',   200,  200, 'Fast Food'),
('Chicken Pizza',  1200,  50, 'Fast Food'),
('Beef Burger',    550,   80, 'Fast Food'),
('Cold Drink',     120,  300, 'Beverage'),
('Pasta',          900,   40, 'Continental');

INSERT INTO Store (SupplierID, ItemID, StoreName, Location, StockQuantity) VALUES
(1, 1, 'Main Branch', 'DHA Phase 5', 100),
(1, 2, 'Main Branch', 'DHA Phase 5', 200),
(2, 3, 'Main Branch', 'DHA Phase 5', 50),
(2, 4, 'Main Branch', 'DHA Phase 5', 80),
(1, 5, 'Main Branch', 'DHA Phase 5', 300),
(3, 6, 'Main Branch', 'DHA Phase 5', 40);

INSERT INTO OrderTable (CustomerID, MethodID, OrderDate, TotalAmount) VALUES
(1, 1, '2025-01-10', 900),
(2, 2, '2025-01-11', 450),
(3, 1, '2025-01-12', 1200);

INSERT INTO OrderItem (OrderID, ItemID, Quantity, UnitPrice, Subtotal) VALUES
(1, 1, 2, 450, 900),
(2, 1, 1, 450, 450),
(3, 3, 1, 1200, 1200);

INSERT INTO Reservation (CustomerID, ReservationDate, NumberOfPeople) VALUES
(1, '2025-01-10', 4),
(2, '2025-01-11', 2),
(3, '2025-01-12', 5);

INSERT INTO Feedback (CustomerID, EmployeeID, ItemID, StaffRating, ItemRating, Comment) VALUES
(1, 2, 1, 5, 4, 'Great service and food'),
(2, 2, 2, 4, 5, 'Food was excellent'),
(3, 1, 3, 5, 4, 'Very polite staff');

-- Verify
SELECT * FROM Customer;
SELECT * FROM Employee;
SELECT * FROM MenuItem;
SELECT * FROM PaymentMethod;
SELECT * FROM OrderTable;
SELECT * FROM OrderItem;
SELECT * FROM Reservation;
SELECT * FROM Feedback;

Database Helper (App_Code)

App_Code/RestaurantDBHelper.vb

Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration

Public Class RestaurantDBHelper
    Private Shared ConnString As String = ConfigurationManager.ConnectionStrings("HalfBloodConn").ConnectionString

    Public Shared Function GetDataTable(query As String) As DataTable
        Dim dt As New DataTable()
        Using conn As New SqlConnection(ConnString)
            Using cmd As New SqlCommand(query, conn)
                Dim adapter As New SqlDataAdapter(cmd)
                adapter.Fill(dt)
            End Using
        End Using
        Return dt
    End Function

    Public Shared Function ExecuteNonQuery(query As String, Optional sqlParams As SqlParameter() = Nothing) As Integer
        Using conn As New SqlConnection(ConnString)
            Using cmd As New SqlCommand(query, conn)
                If sqlParams IsNot Nothing Then
                    cmd.Parameters.AddRange(sqlParams)
                End If
                conn.Open()
                Return cmd.ExecuteNonQuery()
            End Using
        End Using
    End Function

    Public Shared Function ExecuteScalar(query As String, Optional sqlParams As SqlParameter() = Nothing) As Object
        Using conn As New SqlConnection(ConnString)
            Using cmd As New SqlCommand(query, conn)
                If sqlParams IsNot Nothing Then
                    cmd.Parameters.AddRange(sqlParams)
                End If
                conn.Open()
                Return cmd.ExecuteScalar()
            End Using
        End Using
    End Function

    Public Shared Function ExecuteStoredProcedure(procName As String, Optional sqlParams As SqlParameter() = Nothing) As Integer
        Using conn As New SqlConnection(ConnString)
            Using cmd As New SqlCommand(procName, conn)
                cmd.CommandType = CommandType.StoredProcedure
                If sqlParams IsNot Nothing Then
                    cmd.Parameters.AddRange(sqlParams)
                End If
                conn.Open()
                Return cmd.ExecuteNonQuery()
            End Using
        End Using
    End Function
End Class

Registration Form

Lab_10/registration.aspx

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="registration.aspx.vb" Inherits="registration" %>
<%@ Register Src="Nav.ascx" TagName="Nav" TagPrefix="uc" %>
<!DOCTYPE html>
<html>
<head runat="server">
    <meta charset="utf-8" />
    <title>Customer Registration | Restaurant Portal</title>
    <link rel="stylesheet" href="styles.css" />
</head>
<body>
    <div class="container">
        <h2>Customer Registration</h2>
        <uc:Nav ID="Nav1" runat="server" />
        <asp:Label ID="lblInfo" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>
        <form id="form1" runat="server">
            <asp:Label ID="lblStatus" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>
            <div class="form-group">
                <label>Username (Login ID)</label>
                <asp:TextBox ID="txtUsername" runat="server"></asp:TextBox>
            </div>
            <div class="form-group">
                <label>Password</label>
                <asp:TextBox ID="txtPassword" runat="server" TextMode="Password"></asp:TextBox>
            </div>
            <div class="form-group">
                <label>Full Name</label>
                <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
            </div>
            <div class="form-group">
                <label>Customer Type</label>
                <asp:DropDownList ID="ddlType" runat="server">
                    <asp:ListItem Value="Regular">Regular</asp:ListItem>
                    <asp:ListItem Value="VIP">VIP</asp:ListItem>
                    <asp:ListItem Value="New">New</asp:ListItem>
                </asp:DropDownList>
            </div>
            <div class="form-group">
                <label>Street</label>
                <asp:TextBox ID="txtStreet" runat="server"></asp:TextBox>
            </div>
            <div class="form-group">
                <label>City</label>
                <asp:TextBox ID="txtCity" runat="server"></asp:TextBox>
            </div>
            <div class="form-group">
                <label>Postal Code</label>
                <asp:TextBox ID="txtPostalCode" runat="server"></asp:TextBox>
            </div>
            <asp:Button ID="btnRegister" runat="server" Text="Register" OnClick="btnRegister_Click" CssClass="btn" />
        </form>
    </div>
</body>
</html>

Registration Logic

Lab_10/registration.aspx.vb

Imports System.Data.SqlClient

Partial Class registration
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        Dim role As String = If(Session("Role") IsNot Nothing, Session("Role").ToString(), "")

        If Not IsPostBack Then
            If role = "Manager" Then
                lblInfo.Text = "Manager access: register a customer or update customer records."
                ddlType.Enabled = True
            Else
                lblInfo.Text = "New customer registration: create your account below."
                ddlType.SelectedValue = "New"
                ddlType.Enabled = False
            End If
        End If
    End Sub

    Protected Sub btnRegister_Click(sender As Object, e As EventArgs)
        Try
            Dim regParams As SqlParameter() = {
                New SqlParameter("@User",       txtUsername.Text),
                New SqlParameter("@Pass",       txtPassword.Text),
                New SqlParameter("@Name",       txtName.Text),
                New SqlParameter("@Type",       ddlType.SelectedValue),
                New SqlParameter("@Street",     txtStreet.Text),
                New SqlParameter("@City",       txtCity.Text),
                New SqlParameter("@PostalCode", txtPostalCode.Text)
            }
            RestaurantDBHelper.ExecuteNonQuery("INSERT INTO Customer (Username, Password, CustomerName, CustomerType, Street, City, PostalCode) VALUES (@User, @Pass, @Name, @Type, @Street, @City, @PostalCode)", regParams)

            lblStatus.Text     = "Customer registered successfully! You can now login."
            lblStatus.CssClass = "status-msg success"

            txtUsername.Text   = ""
            txtPassword.Text   = ""
            txtName.Text       = ""
            txtStreet.Text     = ""
            txtCity.Text       = ""
            txtPostalCode.Text = ""
        Catch ex As Exception
            lblStatus.Text     = "Registration failed: " & ex.Message
            lblStatus.CssClass = "status-msg error"
        End Try
    End Sub

End Class

Login Form

Lab_10/login.aspx

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="login.aspx.vb" Inherits="login" %>
<!DOCTYPE html>
<html>
<head runat="server">
    <meta charset="utf-8" />
    <title>Login | Restaurant Portal</title>
    <link rel="stylesheet" href="styles.css" />
</head>
<body>
    <div class="container" style="max-width:420px;">
        <h2>Login</h2>
        <p style="color:#333; margin-bottom:20px;">
            <a href="dashboard.aspx" style="color:#2563eb;">&#8592; Back to Home</a>
        </p>

        <form id="form1" runat="server">
            <asp:Label ID="lblStatus" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>

            <div class="form-group">
                <label>Username</label>
                <asp:TextBox ID="txtUser" runat="server"></asp:TextBox>
            </div>
            <div class="form-group">
                <label>Password</label>
                <asp:TextBox ID="txtPass" runat="server" TextMode="Password"></asp:TextBox>
            </div>
            <asp:Button ID="btnLogin" runat="server" Text="Login" OnClick="btnLogin_Click" CssClass="btn" Width="100%" />
        </form>

        <div style="margin-top:24px; padding:14px; background:#f8fafc; border:1px solid #cbd5e1; border-radius:4px; font-size:0.85rem; color:#111;">
            <strong style="color:#2563eb;">Demo Credentials</strong><br /><br />
            <b>Customer</b><br />
            Username: <code style="color:#2563eb;">ahmad</code> &nbsp; Password: <code style="color:#2563eb;">cust123</code><br /><br />
            <b>Manager</b><br />
            Username: <code style="color:#2563eb;">manager</code> &nbsp; Password: <code style="color:#2563eb;">owl123</code>
        </div>
        <div style="margin-top:18px; padding:14px; background:#ffffff; border:1px solid #cbd5e1; border-radius:4px; font-size:0.85rem; color:#111;">
            <p style="margin:0 0 10px 0;">New here?</p>
            <a href="registration.aspx" class="btn" style="display:inline-block; width:auto; padding:8px 14px;">Register Account</a>
        </div>
    </div>
</body>
</html>

Login Logic

Lab_10/login.aspx.vb

Imports System.Data.SqlClient

Partial Class login
    Inherits System.Web.UI.Page

    Protected Sub btnLogin_Click(sender As Object, e As EventArgs)
        Dim user As String = txtUser.Text.Trim()
        Dim pass As String = txtPass.Text.Trim()

        ' Check Employee Table first
        Dim empQuery As String = "SELECT EmployeeID, EmployeeName, RoleName FROM Employee e JOIN EmployeeRole r ON e.RoleID = r.RoleID WHERE Username = @User AND Password = @Pass"
        Dim empParams As SqlParameter() = {
            New SqlParameter("@User", user),
            New SqlParameter("@Pass", pass)
        }
        Dim dtEmp As System.Data.DataTable = RestaurantDBHelper.ExecuteReader(empQuery, empParams)
        
        If dtEmp.Rows.Count > 0 Then
            Session("Role") = dtEmp.Rows(0)("RoleName").ToString()
            Session("Username") = dtEmp.Rows(0)("EmployeeName").ToString()
            Session("UserID") = dtEmp.Rows(0)("EmployeeID").ToString()
            Response.Redirect("dashboard.aspx")
            Return
        End If

        ' Check Customer Table
        Dim custQuery As String = "SELECT CustomerID, CustomerName FROM Customer WHERE Username = @User AND Password = @Pass"
        Dim custParams As SqlParameter() = {
            New SqlParameter("@User", user),
            New SqlParameter("@Pass", pass)
        }
        Dim dtCust As System.Data.DataTable = RestaurantDBHelper.ExecuteReader(custQuery, custParams)

        If dtCust.Rows.Count > 0 Then
            Session("Role") = "Customer"
            Session("Username") = dtCust.Rows(0)("CustomerName").ToString()
            Session("UserID") = dtCust.Rows(0)("CustomerID").ToString()
            Response.Redirect("dashboard.aspx")
            Return
        End If

        lblStatus.Text     = "Invalid username or password."
        lblStatus.CssClass = "status-msg error"
    End Sub

End Class

Search UI

Lab_10/search.aspx

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="search.aspx.vb" Inherits="search" %>
<%@ Register Src="Nav.ascx" TagName="Nav" TagPrefix="uc" %>
<!DOCTYPE html>
<html>
<head runat="server">
    <meta charset="utf-8" />
    <title>Search | Restaurant Portal</title>
    <link rel="stylesheet" href="styles.css" />
</head>
<body>
<div class="container">
    <h2>Search</h2>
    <uc:Nav ID="Nav1" runat="server" />
    <form id="form1" runat="server">
        <asp:Label ID="lblStatus" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>

        <div class="form-group">
            <label>Search Type</label>
            <asp:DropDownList ID="ddlSearchType" runat="server" onchange="switchView(this.value)">
                <asp:ListItem Value="Menu">Menu Items</asp:ListItem>
                <asp:ListItem Value="Customer">Customers</asp:ListItem>
            </asp:DropDownList>
        </div>

        <div class="form-group">
            <label>Search by Name</label>
            <div style="display:flex;gap:8px;">
                <asp:TextBox ID="txtSearch" runat="server" placeholder="Leave blank to show all"></asp:TextBox>
                <asp:Button ID="btnSearch" runat="server" Text="Search" OnClick="btnSearch_Click" CssClass="btn" />
            </div>
        </div>

        <asp:GridView ID="gvResults" runat="server" CssClass="gridview" AutoGenerateColumns="true"></asp:GridView>

        <!-- Reference Data from DB -->
        <div id="divMenuRef" style="margin-top:20px;">
            <p style="color:#bbb; margin-bottom:6px;">Available menu items in database:</p>
            <asp:Literal ID="litMenuRef" runat="server"></asp:Literal>
        </div>
        <div id="divCustRef" style="margin-top:20px; display:none;">
            <p style="color:#bbb; margin-bottom:6px;">Registered customers in database:</p>
            <asp:Literal ID="litCustRef" runat="server"></asp:Literal>
        </div>
    </form>
</div>
<script>
    function switchView(val) {
        document.getElementById('divMenuRef').style.display = (val === 'Menu') ? 'block' : 'none';
        document.getElementById('divCustRef').style.display = (val === 'Customer') ? 'block' : 'none';
    }
</script>
</body>
</html>

Search Logic

Lab_10/search.aspx.vb

Imports System.Data
Imports System.Data.SqlClient

Partial Class search
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        If Not IsPostBack Then
            LoadReferenceData()
        End If
    End Sub

    Private Sub LoadReferenceData()
        ' Build menu items reference table from DB
        Dim menuDt As DataTable = RestaurantDBHelper.GetDataTable("SELECT ItemName, Price, Category FROM MenuItem ORDER BY Category, ItemName")
        Dim sb As New System.Text.StringBuilder()
        sb.Append("<table class='ref-table'><tr><th>Item Name</th><th>Price (Rs.)</th><th>Category</th></tr>")
        For Each row As DataRow In menuDt.Rows
            sb.AppendFormat("<tr><td>{0}</td><td>{1}</td><td>{2}</td></tr>", row("ItemName"), row("Price"), row("Category"))
        Next
        sb.Append("</table>")
        litMenuRef.Text = sb.ToString()

        ' Build customer reference table from DB
        Dim custDt As DataTable = RestaurantDBHelper.GetDataTable("SELECT CustomerName, CustomerType, City FROM Customer ORDER BY CustomerName")
        Dim sb2 As New System.Text.StringBuilder()
        sb2.Append("<table class='ref-table'><tr><th>Customer Name</th><th>Type</th><th>City</th></tr>")
        For Each row As DataRow In custDt.Rows
            sb2.AppendFormat("<tr><td>{0}</td><td>{1}</td><td>{2}</td></tr>", row("CustomerName"), row("CustomerType"), row("City"))
        Next
        sb2.Append("</table>")
        litCustRef.Text = sb2.ToString()
    End Sub

    Protected Sub btnSearch_Click(sender As Object, e As EventArgs)
        Try
            Dim query As String = ""
            If ddlSearchType.SelectedValue = "Menu" Then
                query = "SELECT ItemName AS Name, Price, Category FROM MenuItem WHERE ItemName LIKE '%' + @Query + '%'"
            Else
                query = "SELECT CustomerName AS Name, CustomerType, City FROM Customer WHERE CustomerName LIKE '%' + @Query + '%'"
            End If

            Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("HalfBloodConn").ConnectionString)
                Using cmd As New SqlCommand(query, conn)
                    cmd.Parameters.AddWithValue("@Query", txtSearch.Text)
                    Dim adapter As New SqlDataAdapter(cmd)
                    Dim dt As New DataTable()
                    adapter.Fill(dt)
                    gvResults.DataSource = dt
                    gvResults.DataBind()
                End Using
            End Using

            If gvResults.Rows.Count = 0 Then
                lblStatus.Text = "No results found."
                lblStatus.CssClass = "status-msg error"
            Else
                lblStatus.Text = gvResults.Rows.Count & " result(s) found."
                lblStatus.CssClass = "status-msg success"
            End If

            LoadReferenceData()
        Catch ex As Exception
            lblStatus.Text = "Search failed: " & ex.Message
            lblStatus.CssClass = "status-msg error"
        End Try
    End Sub

End Class

Order Form

Lab_10/order.aspx

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="order.aspx.vb" Inherits="order" %>
<%@ Register Src="Nav.ascx" TagName="Nav" TagPrefix="uc" %>
<!DOCTYPE html>
<html>
<head runat="server">
    <meta charset="utf-8" />
    <title>Place Order | Restaurant Portal</title>
    <link rel="stylesheet" href="styles.css" />
</head>
<body>
<div class="container">
    <h2>Place an Order</h2>
    <uc:Nav ID="Nav1" runat="server" />
    <form id="form1" runat="server">
        <asp:Label ID="lblStatus" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>

        <div class="form-group" id="divCustomer" runat="server">
            <label>Customer</label>
            <asp:DropDownList ID="ddlCustomer" runat="server"></asp:DropDownList>
        </div>

        <div class="form-group">
            <label>Menu Item</label>
            <asp:DropDownList ID="ddlItem" runat="server" onchange="calcTotal()"></asp:DropDownList>
        </div>

        <div class="form-group">
            <label>Quantity</label>
            <asp:TextBox ID="txtQuantity" runat="server" TextMode="Number" Text="1" onchange="calcTotal()" onkeyup="calcTotal()"></asp:TextBox>
        </div>

        <!-- Live total display -->
        <div class="total-box" id="totalDisplay">
            Total Amount: <strong id="totalAmt">Rs. 0.00</strong>
        </div>

        <div class="form-group">
            <label>Payment Method</label>
            <asp:DropDownList ID="ddlMethod" runat="server"></asp:DropDownList>
        </div>

        <asp:Button ID="btnPlaceOrder" runat="server" Text="Place Order" OnClick="btnPlaceOrder_Click" CssClass="btn" />
    </form>
</div>
<script>
    function calcTotal() {
        var itemSel = document.getElementById('<%= ddlItem.ClientID %>');
        var qtyBox  = document.getElementById('<%= txtQuantity.ClientID %>');
        var qty = parseInt(qtyBox.value) || 1;
        var text = itemSel.options[itemSel.selectedIndex].text;
        // text format: "ItemName - Rs.450"
        var parts = text.split('Rs.');
        if (parts.length > 1) {
            var price = parseFloat(parts[1]) || 0;
            var total = price * qty;
            document.getElementById('totalAmt').innerText = 'Rs. ' + total.toFixed(2);
        }
    }
    window.onload = calcTotal;
</script>
</body>
</html>

Order Logic

Lab_10/order.aspx.vb

Imports System.Data.SqlClient

Partial Class order
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        ' Only Customer and Manager can place orders
        Dim role As String = If(Session("Role") IsNot Nothing, Session("Role").ToString(), "")
        If role = "" Then
            Response.Redirect("login.aspx")
        End If

        If Not IsPostBack Then
            If role = "Customer" Then
                divCustomer.Visible = False
            Else
                ddlCustomer.DataSource = RestaurantDBHelper.GetDataTable("SELECT CustomerID, CustomerName FROM Customer")
                ddlCustomer.DataTextField = "CustomerName"
                ddlCustomer.DataValueField = "CustomerID"
                ddlCustomer.DataBind()
            End If

            ddlItem.DataSource = RestaurantDBHelper.GetDataTable("SELECT ItemID, ItemName + ' - Rs.' + CAST(Price AS VARCHAR) AS Display FROM MenuItem")
            ddlItem.DataTextField = "Display"
            ddlItem.DataValueField = "ItemID"
            ddlItem.DataBind()

            ddlMethod.DataSource = RestaurantDBHelper.GetDataTable("SELECT MethodID, MethodName FROM PaymentMethod")
            ddlMethod.DataTextField = "MethodName"
            ddlMethod.DataValueField = "MethodID"
            ddlMethod.DataBind()
        End If
    End Sub

    Protected Sub btnPlaceOrder_Click(sender As Object, e As EventArgs)
        Try
            Dim customerID As Integer
            If Session("Role") = "Customer" Then
                customerID = CInt(Session("UserID"))
            Else
                customerID = CInt(ddlCustomer.SelectedValue)
            End If
            Dim itemID As Integer = CInt(ddlItem.SelectedValue)
            Dim methodID As Integer = CInt(ddlMethod.SelectedValue)
            Dim quantity As Integer

            If Not Integer.TryParse(txtQuantity.Text, quantity) OrElse quantity <= 0 Then
                Throw New Exception("Enter a valid quantity.")
            End If

            Dim priceObj As Object = RestaurantDBHelper.ExecuteScalar("SELECT Price FROM MenuItem WHERE ItemID = @ItemID", New SqlParameter() {New SqlParameter("@ItemID", itemID)})
            If priceObj Is Nothing OrElse IsDBNull(priceObj) Then
                Throw New Exception("Selected menu item was not found.")
            End If

            Dim price As Decimal = CDec(priceObj)
            Dim subtotal As Decimal = price * quantity

            Dim orderParams As SqlParameter() = {
                New SqlParameter("@CID", customerID),
                New SqlParameter("@MID", methodID),
                New SqlParameter("@Total", subtotal)
            }
            RestaurantDBHelper.ExecuteNonQuery("INSERT INTO OrderTable (CustomerID, MethodID, OrderDate, TotalAmount) VALUES (@CID, @MID, GETDATE(), @Total)", orderParams)

            Dim newOrderID As Integer = CInt(RestaurantDBHelper.ExecuteScalar("SELECT MAX(OrderID) FROM OrderTable WHERE CustomerID = @CID", New SqlParameter() {New SqlParameter("@CID", customerID)}))

            Dim itemParams As SqlParameter() = {
                New SqlParameter("@OID", newOrderID),
                New SqlParameter("@IID", itemID),
                New SqlParameter("@Qty", quantity),
                New SqlParameter("@Price", price),
                New SqlParameter("@Sub", subtotal)
            }
            RestaurantDBHelper.ExecuteNonQuery("INSERT INTO OrderItem (OrderID, ItemID, Quantity, UnitPrice, Subtotal) VALUES (@OID, @IID, @Qty, @Price, @Sub)", itemParams)

            lblStatus.Text     = "Order #" & newOrderID & " placed successfully!"
            lblStatus.CssClass = "status-msg success"
        Catch ex As Exception
            lblStatus.Text     = "Order failed: " & ex.Message
            lblStatus.CssClass = "status-msg error"
        End Try
    End Sub

End Class

Reservation Form

Lab_10/reservation.aspx

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="reservation.aspx.vb" Inherits="reservation" %>
<%@ Register Src="Nav.ascx" TagName="Nav" TagPrefix="uc" %>
<!DOCTYPE html>
<html>
<head runat="server">
    <meta charset="utf-8" />
    <title>Reservations | Restaurant Portal</title>
    <link rel="stylesheet" href="styles.css" />
</head>
<body>
<div class="container">
    <h2>Reserve a Table</h2>
    <uc:Nav ID="Nav1" runat="server" />
    <form id="form1" runat="server">
        <asp:Label ID="lblStatus" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>

        <div class="form-group" id="divCustomer" runat="server">
            <label>Customer</label>
            <asp:DropDownList ID="ddlCustomer" runat="server"></asp:DropDownList>
        </div>

        <div class="form-group">
            <label>Reservation Date</label>
            <asp:TextBox ID="txtDate" runat="server" TextMode="Date"></asp:TextBox>
        </div>

        <div class="form-group">
            <label>Number of People</label>
            <asp:TextBox ID="txtPeople" runat="server" TextMode="Number" Text="1" onchange="calcFee()" onkeyup="calcFee()"></asp:TextBox>
        </div>

        <!-- Fee display -->
        <div class="total-box">
            Fee per person: Rs. 300 &nbsp;|&nbsp;
            Reservation Fee: <strong id="feeDisplay">Rs. 300.00</strong>
        </div>

        <asp:Button ID="btnReserve" runat="server" Text="Reserve Table" OnClick="btnReserve_Click" CssClass="btn" />
    </form>
</div>
<script>
    function calcFee() {
        var people = parseInt(document.getElementById('<%= txtPeople.ClientID %>').value) || 1;
        var fee = people * 300;
        document.getElementById('feeDisplay').innerText = 'Rs. ' + fee.toFixed(2);
    }
    window.onload = calcFee;
</script>
</body>
</html>

Reservation Logic

Lab_10/reservation.aspx.vb

Imports System.Data.SqlClient

Partial Class reservation
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        Dim role As String = If(Session("Role") IsNot Nothing, Session("Role").ToString(), "")
        If role = "" Then Response.Redirect("login.aspx")

        If Not IsPostBack Then
            If role = "Customer" Then
                divCustomer.Visible = False
            Else
                ddlCustomer.DataSource = RestaurantDBHelper.GetDataTable("SELECT CustomerID, CustomerName FROM Customer")
                ddlCustomer.DataTextField = "CustomerName"
                ddlCustomer.DataValueField = "CustomerID"
                ddlCustomer.DataBind()
            End If
        End If
    End Sub

    Protected Sub btnReserve_Click(sender As Object, e As EventArgs)
        Try
            Dim people As Integer
            If Not Integer.TryParse(txtPeople.Text, people) OrElse people <= 0 Then
                Throw New Exception("Enter a valid number of people.")
            End If

            Dim resDate As DateTime
            If Not DateTime.TryParse(txtDate.Text, resDate) Then
                Throw New Exception("Enter a valid reservation date.")
            End If

            Dim fee As Decimal = people * 300

            Dim cid As String
            If Session("Role") = "Customer" Then
                cid = Session("UserID").ToString()
            Else
                cid = ddlCustomer.SelectedValue
            End If

            Dim resParams As SqlParameter() = {
                New SqlParameter("@CID", cid),
                New SqlParameter("@Date", resDate),
                New SqlParameter("@People", people),
                New SqlParameter("@Fee", fee)
            }
            RestaurantDBHelper.ExecuteNonQuery("INSERT INTO Reservation (CustomerID, ReservationDate, NumberOfPeople, ReservationFee) VALUES (@CID, @Date, @People, @Fee)", resParams)

            lblStatus.Text     = "Table reserved! Reservation fee: Rs. " & fee.ToString("0.00")
            lblStatus.CssClass = "status-msg success"
        Catch ex As Exception
            lblStatus.Text     = "Reservation failed: " & ex.Message
            lblStatus.CssClass = "status-msg error"
        End Try
    End Sub

End Class

Feedback Form

Lab_10/feedback.aspx

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="feedback.aspx.vb" Inherits="feedback" %>
<%@ Register Src="Nav.ascx" TagName="Nav" TagPrefix="uc" %>
<!DOCTYPE html>
<html>
<head runat="server">
    <meta charset="utf-8" />
    <title>Feedback | Restaurant Portal</title>
    <link rel="stylesheet" href="styles.css" />
</head>
<body>
    <div class="container">
        <h2>Customer Feedback</h2>
        <uc:Nav ID="Nav1" runat="server" />
        <form id="form1" runat="server">
            <asp:Label ID="lblStatus" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>
            <div class="form-group" id="divCustomer" runat="server" visible="false">
                <label>Customer</label>
                <asp:DropDownList ID="ddlCustomer" runat="server"></asp:DropDownList>
            </div>
            <div class="form-group">
                <label>Staff Member Served</label>
                <asp:DropDownList ID="ddlEmployee" runat="server"></asp:DropDownList>
            </div>
            <div class="form-group">
                <label>Item Ordered</label>
                <asp:DropDownList ID="ddlItem" runat="server"></asp:DropDownList>
            </div>
            <div class="form-group">
                <label>Staff Rating (1-5)</label>
                <asp:DropDownList ID="ddlStaffRating" runat="server">
                    <asp:ListItem Value="5">5 - Excellent</asp:ListItem>
                    <asp:ListItem Value="4">4 - Good</asp:ListItem>
                    <asp:ListItem Value="3">3 - Average</asp:ListItem>
                    <asp:ListItem Value="2">2 - Poor</asp:ListItem>
                    <asp:ListItem Value="1">1 - Terrible</asp:ListItem>
                </asp:DropDownList>
            </div>
            <div class="form-group">
                <label>Item Rating (1-5)</label>
                <asp:DropDownList ID="ddlItemRating" runat="server">
                    <asp:ListItem Value="5">5 - Excellent</asp:ListItem>
                    <asp:ListItem Value="4">4 - Good</asp:ListItem>
                    <asp:ListItem Value="3">3 - Average</asp:ListItem>
                    <asp:ListItem Value="2">2 - Poor</asp:ListItem>
                    <asp:ListItem Value="1">1 - Terrible</asp:ListItem>
                </asp:DropDownList>
            </div>
            <div class="form-group">
                <label>Comments</label>
                <asp:TextBox ID="txtComment" runat="server" TextMode="MultiLine" Rows="4"></asp:TextBox>
            </div>
            <asp:Button ID="btnSubmit" runat="server" Text="Submit Feedback" OnClick="btnSubmit_Click" CssClass="btn" />
        </form>
    </div>
</body>
</html>

Feedback Logic

Lab_10/feedback.aspx.vb

Imports System.Data.SqlClient

Partial Class feedback
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        ' Only Customer can submit feedback
        Dim role As String = If(Session("Role") IsNot Nothing, Session("Role").ToString(), "")
        If role <> "Customer" Then
            Response.Redirect("index.aspx")
        End If

        If Not IsPostBack Then

            ddlEmployee.DataSource = RestaurantDBHelper.GetDataTable("SELECT EmployeeID, EmployeeName FROM Employee")
            ddlEmployee.DataTextField = "EmployeeName"
            ddlEmployee.DataValueField = "EmployeeID"
            ddlEmployee.DataBind()

            ddlItem.DataSource = RestaurantDBHelper.GetDataTable("SELECT ItemID, ItemName FROM MenuItem")
            ddlItem.DataTextField = "ItemName"
            ddlItem.DataValueField = "ItemID"
            ddlItem.DataBind()
        End If
    End Sub

    Protected Sub btnSubmit_Click(sender As Object, e As EventArgs)
        Try
            Dim customerID As Integer = CInt(Session("UserID"))
            Dim feedParams As SqlParameter() = {
                New SqlParameter("@CID", customerID),
                New SqlParameter("@EID", ddlEmployee.SelectedValue),
                New SqlParameter("@IID", ddlItem.SelectedValue),
                New SqlParameter("@SRating", CInt(ddlStaffRating.SelectedValue)),
                New SqlParameter("@IRating", CInt(ddlItemRating.SelectedValue)),
                New SqlParameter("@Comment", txtComment.Text)
            }
            RestaurantDBHelper.ExecuteNonQuery("INSERT INTO Feedback (CustomerID, EmployeeID, ItemID, StaffRating, ItemRating, Comment) VALUES (@CID, @EID, @IID, @SRating, @IRating, @Comment)", feedParams)

            lblStatus.Text     = "Feedback submitted successfully. Thank you!"
            lblStatus.CssClass = "status-msg success"
        Catch ex As Exception
            lblStatus.Text     = "Submission failed: " & ex.Message
            lblStatus.CssClass = "status-msg error"
        End Try
    End Sub

End Class

Add Menu Item UI

Lab_10/add_item.aspx

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="add_item.aspx.vb" Inherits="add_item" %>
<%@ Register Src="Nav.ascx" TagName="Nav" TagPrefix="uc" %>
<!DOCTYPE html>
<html>
<head runat="server">
    <meta charset="utf-8" />
    <title>Add Menu Item | Manager</title>
    <link rel="stylesheet" href="styles.css" />
</head>
<body>
    <div class="container">
        <h2>Add Menu Item</h2>
        <uc:Nav ID="Nav1" runat="server" />
        <form id="form1" runat="server">
            <asp:Label ID="lblStatus" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>
            
            <div class="form-group">
                <label>Item Name</label>
                <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
            </div>
            
            <div class="form-group">
                <label>Price (Rs.)</label>
                <asp:TextBox ID="txtPrice" runat="server" TextMode="Number" step="0.01"></asp:TextBox>
            </div>
            
            <div class="form-group">
                <label>Category</label>
                <asp:DropDownList ID="ddlCategory" runat="server">
                    <asp:ListItem>Main Course</asp:ListItem>
                    <asp:ListItem>Appetizer</asp:ListItem>
                    <asp:ListItem>Beverage</asp:ListItem>
                    <asp:ListItem>Dessert</asp:ListItem>
                    <asp:ListItem>Side</asp:ListItem>
                </asp:DropDownList>
            </div>
            
            <asp:Button ID="btnAdd" runat="server" Text="Add Item" OnClick="btnAdd_Click" CssClass="btn" />
        </form>
    </div>
</body>
</html>

Add Menu Item Logic

Lab_10/add_item.aspx.vb

Imports System.Data.SqlClient

Partial Class add_item
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        Dim role As String = If(Session("Role") IsNot Nothing, Session("Role").ToString(), "")
        If role <> "Manager" Then
            Response.Redirect("index.aspx")
        End If
    End Sub

    Protected Sub btnAdd_Click(sender As Object, e As EventArgs)
        Try
            Dim price As Decimal
            If Not Decimal.TryParse(txtPrice.Text, price) OrElse price < 0 Then
                Throw New Exception("Please enter a valid price.")
            End If

            Dim itemName As String = txtName.Text.Trim()
            If itemName = "" Then
                Throw New Exception("Item name is required.")
            End If

            Dim params As SqlParameter() = {
                New SqlParameter("@Name", itemName),
                New SqlParameter("@Price", price),
                New SqlParameter("@Category", ddlCategory.SelectedValue)
            }
            
            RestaurantDBHelper.ExecuteNonQuery("INSERT INTO MenuItem (ItemName, Price, Category) VALUES (@Name, @Price, @Category)", params)
            
            lblStatus.Text = "Menu item added successfully!"
            lblStatus.CssClass = "status-msg success"
            
            txtName.Text = ""
            txtPrice.Text = ""
            ddlCategory.SelectedIndex = 0
            
        Catch ex As Exception
            lblStatus.Text = "Failed to add item: " & ex.Message
            lblStatus.CssClass = "status-msg error"
        End Try
    End Sub
End Class

Inventory UI

Lab_10/inventory.aspx

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="inventory.aspx.vb" Inherits="inventory" %>
<%@ Register Src="Nav.ascx" TagName="Nav" TagPrefix="uc" %>
<!DOCTYPE html>
<html>
<head runat="server">
    <meta charset="utf-8" />
    <title>Inventory | Manager</title>
    <link rel="stylesheet" href="styles.css" />
</head>
<body>
    <div class="container">
        <h2>Restaurant Inventory</h2>
        <uc:Nav ID="Nav1" runat="server" />
        <form id="form1" runat="server">
            <asp:Label ID="lblStatus" runat="server" CssClass="status-msg" EnableViewState="false"></asp:Label>
            
            <asp:GridView ID="gvInventory" runat="server" CssClass="gridview" AutoGenerateColumns="False" EmptyDataText="No inventory records found.">
                <Columns>
                    <asp:BoundField DataField="ItemName" HeaderText="Item Name" />
                    <asp:BoundField DataField="Category" HeaderText="Category" />
                    <asp:BoundField DataField="StockQuantity" HeaderText="Stock Quantity" />
                    <asp:BoundField DataField="StoreName" HeaderText="Store/Location" />
                    <asp:BoundField DataField="SupplierName" HeaderText="Supplier" />
                </Columns>
            </asp:GridView>
        </form>
    </div>
</body>
</html>

Inventory Logic

Lab_10/inventory.aspx.vb

Imports System.Data

Partial Class inventory
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        Dim role As String = If(Session("Role") IsNot Nothing, Session("Role").ToString(), "")
        If role <> "Manager" Then
            Response.Redirect("index.aspx")
        End If

        If Not IsPostBack Then
            LoadInventory()
        End If
    End Sub

    Private Sub LoadInventory()
        Try
            Dim query As String = "SELECT m.ItemName, m.Category, s.StockQuantity, s.StoreName, sup.SupplierName " &
                                  "FROM Store s " &
                                  "JOIN MenuItem m ON s.ItemID = m.ItemID " &
                                  "JOIN Supplier sup ON s.SupplierID = sup.SupplierID " &
                                  "ORDER BY m.Category, m.ItemName"
            
            Dim dt As DataTable = RestaurantDBHelper.GetDataTable(query)
            gvInventory.DataSource = dt
            gvInventory.DataBind()
            
            If dt.Rows.Count = 0 Then
                lblStatus.Text = "Inventory data is currently empty."
                lblStatus.CssClass = "status-msg"
            End If
        Catch ex As Exception
            lblStatus.Text = "Failed to load inventory: " & ex.Message
            lblStatus.CssClass = "status-msg error"
        End Try
    End Sub
End Class
Web hosting by Somee.com