← All courses
UI · Free course

Mastering the Control Library

Wisej.NET ships with over a hundred controls — grids, charts, trees, editors, layout containers and more — and knowing them well is the difference between fighting the UI and flying through it. This course is a deep tour of the control library and how to get the most from each family. You'll learn the grids and data controls inside out, build rich charts and tree structures, compose responsive layouts, and extend the set with your own custom widgets.

Get the most from 100+ controls — grids, charts, trees and custom widgets.

Start this free course

Also available in: DeutschFrançaisItalianoEspañol

Curriculum

Module 1: Control Library Mental Model

Module 1 of Mastering the Control Library — get the most from 100+ controls: grids, charts, trees and custom widgets. Read the lesson guide and the lab / exam guide, watch the Control families and the Operations Console shell walkthrough, pass the knowledge check, then complete the hands-on lab in Operations Console.

  1. ReadingLesson Guide · 14 min

    The server control tree and browser widget model, the control families, common properties and naming conventions, and the Operations Console shell that grows across the course. What this means for a Wisej.NET developer — and how to read this module.

    Read the lesson guide (PDF)

  2. ReadingLab / Exam Guide · 10 min

    What you'll build in the hands-on lab, the suggested approach, and the required deliverables.

    Read the lesson guide (PDF)

  3. Video lessonControl families and the Operations Console shell · 14 min

    Control families and the Operations Console shell — a guided Module 1 walkthrough, built step by step in Operations Console. Runs right here in the player.

    Narration transcript

    Build the Operations Console around the Wisej.NET control model. Your C sharp code changes server-side objects, and the framework synchronizes their browser widgets. Understanding that relationship helps you choose controls by behavior rather than treating the screen as a collection of markup fragments.

    Consider a button as an object with properties, events, lifecycle, and theme support. Changing a status label’s text updates its state; Wisej.NET transfers the relevant change to the widget. You work with the control contract instead of manually rebuilding the displayed element.

    Start the selection with the control family. Editors collect values, containers organize regions, data controls present collections, and feedback controls explain outcomes. Extenders and integrations add capabilities. Identifying the family narrows the search before you compare individual control properties.

    Ask what the user needs to do with the data. A hierarchy suggests TreeView, records suggest DataGridView, and reusable interface regions suggest UserControl. Reach for a custom widget only after checking whether an existing control already fits the required interaction.

    Write the conventions down before adding more screens. Business-role names, deliberate docking and anchoring, keyboard order, feedback, and appearance keys should be consistent across modules. A selection guide makes those choices explainable when another developer extends the console.

    Rename controls and handlers for their roles so a reader can connect code to the screen. Replace absolute positions with navigation, command, status, and content regions. Docking expresses how these areas share space when the window changes size.

    Centralize navigation so every page follows the same transition. Clear the content region, insert the new page to fill it, and update the status. If opening fails, explain the problem instead of leaving the user looking at an unexplained blank region.

    Use the six placeholder pages to test the shell before building their full features. Each navigation button should change both content and status. This establishes one reliable page-switching path that the later editors, data screens, dashboard, and widget screen can reuse.

    Deliver the four-region shell and six navigable placeholders with meaningful control names. In the selection guide, explain the family used for each region and its role. The goal is a foundation another developer can extend without guessing how navigation or layout works.

  4. ReadingAI Coding Exercise · 20 min

    Build this module's OperationsConsole sample with ChatGPT or Claude from a ready-made prompt that points the model at this module's specification, then review, run and extend what it gives you — including against our own reference build on GitHub.

    Read the lesson guide (PDF)

  5. Knowledge checkModule 1 Knowledge Check · 10 min · Pass mark 80%
  6. Hands-on labLab — Control Catalog Shell · 45 min

    Objective: Create the Operations Console control catalog shell: a main Page with a navigation area, a content area, a command area and a status area; placeholder pages for Editors, Layouts, Lists and Trees, DataGridView, Dashboard and Widgets; a ControlSelection.md note inside the project listing which control family you will use for each area; clear control names throughout; and a status area that updates whenever navigation changes. Deliverables: Main shell with navigation, content, command and status areas; Placeholder pages for Editors, Layouts, Lists and Trees, DataGridView, Dashboard and Widgets; ControlSelection.md listing the control family chosen for each area; Clear control names and a status area that updates on navigation; Screenshot and a short note explaining the control decisions.

Module 2: Editors, Buttons, Validation, and Feedback

Module 2 of Mastering the Control Library — get the most from 100+ controls: grids, charts, trees and custom widgets. Read the lesson guide and the lab / exam guide, watch the CustomerEditor validation walkthrough, pass the knowledge check, then complete the hands-on lab in the Operations Console.

  1. ReadingLesson Guide · 14 min

    Choosing the editor that matches the value, a command model for buttons, ErrorProvider validation that helps rather than blocks, and non-blocking feedback with Toast and AlertBox. What this means for a Wisej.NET developer — and how to read this module.

    Read the lesson guide (PDF)

  2. ReadingLab / Exam Guide · 10 min

    What you'll build in the hands-on lab, the suggested approach, and the required deliverables.

    Read the lesson guide (PDF)

  3. Video lessonFrom plain TextBoxes to a validated CustomerEditor · 14 min

    From plain TextBoxes to a validated CustomerEditor — a guided Module 2 walkthrough, built step by step in the Operations Console. Runs right here in the player.

    Narration transcript

    Build CustomerEditor to help users enter unambiguous values and recover from mistakes. Choosing suitable editors is only the first step. Validation, command state, and clear feedback together determine whether the form is dependable during an actual save.

    A plain text field accepts representations whose meaning may be unclear, especially dates, amounts, and status values. Use the interface to prevent obvious mistakes and explain the remaining ones, while keeping service and data rules behind it as additional protection.

    Match the input control to the value’s meaning. Use text for names and email, a date picker for the start date, and a numeric editor for credit. In the status and type lists, display friendly text while storing the stable key.

    Choose feedback according to what the user must do next. ErrorProvider points to corrections, tips offer guidance, and a message box asks for a blocking decision. A toast or alert reports workflow progress without demanding an unnecessary acknowledgment.

    Build validation outward from the editor: configure its properties, parse typed values, check fields, then check the form and service when saving. On failure, keep the correction visible and focused. On success, confirm completion without interrupting the user’s next task.

    Let each named validator own its field’s message. ValidateContent calls them all, focuses the first invalid input, and returns a result the shell understands. This separates the validation decision from the caller’s choice about whether to continue the workflow.

    Keep Save readable as validation, persistence, state refresh, and notification. Use finally to release the busy state even when persistence fails. A clear failure sentence and a nonblocking success toast let the user understand the outcome without interpreting exceptions.

    Validate the malformed email and then correct it to check that feedback clears promptly. During Save, all three commands become unavailable, preventing conflicting actions. The final toast confirms completion while leaving the user free to continue without pressing another button.

    Deliver CustomerEditor as a reusable control with value-appropriate inputs and named validators. Save, Reset, and Validate should respect its busy state, and completion should produce a toast or alert. Test corrections and failure recovery as carefully as the successful save.

  4. ReadingAI Coding Exercise · 20 min

    Build this module's OperationsConsole sample with ChatGPT or Claude from a ready-made prompt that points the model at this module's specification, then review, run and extend what it gives you — including against our own reference build on GitHub.

    Read the lesson guide (PDF)

  5. Knowledge checkModule 2 Knowledge Check · 10 min · Pass mark 80%
  6. Hands-on labLab — Customer Editor with Validation · 45 min

    Objective: Build a CustomerEditor UserControl for the Operations Console with labelled fields for name, email, status, start date, credit limit and customer type, using the editor that matches each value instead of a TextBox for everything. Add ErrorProvider messages for required fields, email shape, credit-limit range and invalid dates; Save, Reset and Validate commands with disabled and busy behaviour while saving; and a Toast or AlertBox when validation or save completes. Deliverables: CustomerEditor UserControl with labelled fields for name, email, status, start date, credit limit and customer type; Matching editors: TextBox, DateTimePicker, NumericUpDown and ComboBox instead of free text everywhere; ErrorProvider messages for required fields, email shape, credit-limit range and invalid dates; Save, Reset and Validate commands with disabled and busy behaviour while saving; Toast or AlertBox feedback when validation or save completes.

Module 3: Containers, Layouts, Navigation, and Reuse

Module 3 of Mastering the Control Library — get the most from 100+ controls: grids, charts, trees and custom widgets. Read the lesson guide and the lab / exam guide, watch the docking and UserControl walkthrough, pass the knowledge check, then complete the hands-on lab in Operations Console.

  1. ReadingLesson Guide · 14 min

    Docking order, anchoring, flow and table layouts, responsive properties per client profile, navigation and command surfaces, and UserControls as the reuse boundary. What this means for a Wisej.NET developer — and how to read this module.

    Read the lesson guide (PDF)

  2. ReadingLab / Exam Guide · 10 min

    What you'll build in the hands-on lab, the suggested approach, and the required deliverables.

    Read the lesson guide (PDF)

  3. Video lessonDocking, tabs and the reusable UserControl · 14 min

    Docking, tabs and the reusable UserControl — a guided Module 3 walkthrough, built step by step in Operations Console. Runs right here in the player.

    Narration transcript

    Replace the console’s placeholders with containers that express how the interface is organized. SplitContainer, TabControl, ToolBar, and StatusBar have distinct jobs. Combining them gives navigation, commands, and content a layout that can respond to changing window sizes.

    Fixed coordinates describe only one window size. Docked regions instead claim edges and leave the remaining space to the content. When resizing exposes overlap, review those layout relationships rather than adding another set of pixel corrections to a resize handler.

    Check child order when docking the bars and main split region. The top and bottom bars must reserve their space before the fill region uses the remainder. Anchor controls within those regions according to how their own edges should respond.

    Use SplitContainer when the user should control the division, tabs for peer sections, and bars for commands and status. Route menus, toolbars, ribbons, and context menus through one command model so different entry points perform the same action consistently.

    Start with the desktop layout, then assign profile-specific values only to properties that need to change. Phone and tablet layouts can reuse the same controls. Create a separate screen only when the actual workflow differs, not merely because the window is narrower.

    The shell’s docking establishes its structure; ApplyNarrowProfile changes the navigation presentation and status. Refresh delegates to the shared command instead of duplicating behavior in the toolbar handler. This keeps layout decisions separate from the operation the command performs.

    Extract the repeated record header into a UserControl with title, record count, and a refresh event. Keep its child controls private. Callers then depend on what the header does, so a later internal layout change does not require editing every screen that uses it.

    Narrow the browser and watch the same page change presentation. The navigation collapses, the menu button appears, and the status reports the narrow profile. This demonstrates reuse of one control tree rather than switching to a separately maintained mobile screen.

    Rebuild the shell with the chosen containers, extract repeated regions, and add the narrow profile. Document why the docking order works and capture both widths. The hand-in should explain the layout relationships as well as show that the two presentations remain usable.

  4. ReadingAI Coding Exercise · 20 min

    Build this module's OperationsConsole sample with ChatGPT or Claude from a ready-made prompt that points the model at this module's specification, then review, run and extend what it gives you — including against our own reference build on GitHub.

    Read the lesson guide (PDF)

  5. Knowledge checkModule 3 Knowledge Check · 10 min · Pass mark 80%
  6. Hands-on labLab — Operations Console Shell · 45 min

    Objective: Replace the Module 1 placeholders with the real Operations Console shell: a SplitContainer with navigation on the left, a TabControl detail surface on the right, a ToolBar for frequent commands and a StatusBar that shows real status. Move repeated UI into UserControls that expose only meaningful public properties and events, implement a narrow-profile layout with responsive properties or profile-aware logic, and document your docking and anchoring choices in LayoutNotes.md. Deliverables: Navigation shell built from SplitContainer, TabControl, ToolBar and StatusBar; Repeated UI moved into UserControls with a small public surface; Narrow-profile layout using responsive properties or profile-aware logic; LayoutNotes.md documenting the docking and anchoring choices; Screenshots at desktop and narrow widths.

Module 4: Lists, Trees, Repeaters, and Hierarchical Data

Module 4 of Mastering the Control Library — get the most from 100+ controls: grids, charts, trees and custom widgets. Read the lesson guide and the lab / exam guide, watch the Virtual lists, lazy trees and detail loading walkthrough, pass the knowledge check, then complete the hands-on lab in the Operations Console.

  1. ReadingLesson Guide · 14 min

    ComboBox, ListBox, ListView, TreeView, DataRepeater and PropertyGrid; ListView virtual mode, TreeView lazy loading, stable node identity and selection-driven detail loading. What this means for a Wisej.NET developer — and how to read this module.

    Read the lesson guide (PDF)

  2. ReadingLab / Exam Guide · 10 min

    What you'll build in the hands-on lab, the suggested approach, and the required deliverables.

    Read the lesson guide (PDF)

  3. Video lessonVirtual lists, lazy trees and detail loading · 14 min

    Virtual lists, lazy trees and detail loading — a guided Module 4 walkthrough, built step by step in the Operations Console. Runs right here in the player.

    Narration transcript

    Build the document explorer with a hierarchy, a document list, and a reusable detail region. The Operations Console should load only the information the current interaction needs. Lazy tree loading and virtual list items make that division visible in the control design.

    Choose the control from the shape of the information and how users navigate it. A flat choice, a hierarchy, a card collection, and a property inspection are different tasks. Treating them all as generic selection lists makes the user’s map harder to understand.

    Use ComboBox for compact choices, TreeView for hierarchy, and ListView when item presentation matters. DataRepeater and PropertyGrid serve cards and inspection. Plan stable identifiers and deferred loading early, so growth does not force a redesign of how selection reaches the data.

    Virtual mode declares the list’s total size without constructing every visible-control item upfront. RetrieveVirtualItem creates the requested item from server-side data when needed, assigning its identifier and image together. This separates how many records exist from how many items must be created now.

    Load only the tree’s first level, using a placeholder child to indicate that a node can expand. AfterExpand replaces that placeholder with children fetched by the stable key in Tag. Display text can then change without changing the identity used by the service.

    Trace the selected identifier from the tree or list into the service call. BuildTree and expansion preserve stable keys; selection loads the model with error handling and passes it to the detail control. No service lookup should depend on the wording of a displayed label.

    Let selection raise an event, let the page retrieve the data, and let the detail control display the returned model. This keeps the detail region independent of both the tree and database access. The same detail control can therefore be used by another navigation surface.

    Expand the customer node and observe that only its children load. The selected category reports hundreds of documents while creating only the requested list items. Selecting a document loads its detail through the service; use those boundaries to reason about ten times more data.

    Deliver the explorer with stable node identifiers, appropriate image keys, and a list that uses virtual or deferred loading. Retrieve detail through a service and pass the model into its UserControl. Explain how each control’s loading strategy supports the shape of its data.

  4. ReadingAI Coding Exercise · 20 min

    Build this module's OperationsConsole sample with ChatGPT or Claude from a ready-made prompt that points the model at this module's specification, then review, run and extend what it gives you — including against our own reference build on GitHub.

    Read the lesson guide (PDF)

  5. Knowledge checkModule 4 Knowledge Check · 10 min · Pass mark 80%
  6. Hands-on labLab — Document Explorer · 45 min

    Objective: Build the Operations Console document explorer: a TreeView of categories or folders with a stable ID attached to every node, a ListView of documents tied to the selected node, lazy loading or virtual mode on at least one list or tree path, icons or image keys for the different item types, and a detail UserControl that loads through a service or view-model layer whenever the selection changes. Deliverables: TreeView of categories with a stable ID stored on every node; ListView of documents tied to the selected tree node; Lazy loading or virtual mode on at least one list or tree path; Detail UserControl loaded through a service or view-model layer on selection; Icons or image keys for the different item types.

Module 5: DataGridView Mastery

Module 5 of Mastering the Control Library — get the most from 100+ controls: grids, charts, trees and custom widgets. Read the lesson guide and the lab / exam guide, watch the Orders grid walkthrough, pass the knowledge check, then complete the hands-on lab in Operations Console.

  1. ReadingLesson Guide · 14 min

    BindingSource and explicit columns, custom editors and command cells, virtual mode with CellValueNeeded and a server-side cache, and cell HTML, cell controls and cell painting used responsibly. What this means for a Wisej.NET developer — and how to read this module.

    Read the lesson guide (PDF)

  2. ReadingLab / Exam Guide · 10 min

    What you'll build in the hands-on lab, the suggested approach, and the required deliverables.

    Read the lesson guide (PDF)

  3. Video lessonThe Orders grid, from bound to virtual · 14 min

    The Orders grid, from bound to virtual — a guided Module 5 walkthrough, built step by step in Operations Console. Runs right here in the player.

    Narration transcript

    Build the Orders grid in stages so each technique solves a particular need. Binding establishes where values come from, formatting explains them, and virtual mode controls large-data loading. The right combination lets the Operations Console stay usable as its order volume grows.

    Evaluate a grid through the user’s actual work: loading, scrolling, editing, and interpreting status. The same technique may not fit a small editable list and a huge order history. Data size and task should determine the design before visual polish is added.

    Separate data population from column generation. A grid can receive rows directly or use a binding source, independently of whether columns are generated automatically. For the production screen, bind the view model through BindingSource and define columns explicitly to control their behavior.

    Define the status column rather than relying on automatic generation. CellFormatting converts its value to an encoded status badge, making the display easier to read. Keep validation out of this presentation step: a badge changes appearance, not whether the underlying value is acceptable.

    Choose the lightest cell presentation that supports the task. Styles and formatted markup cost less than embedding controls or custom painting. A button for every row multiplies the control count, so reserve embedded interaction for the row that actually needs it.

    For large datasets, declare the row count and serve requested values through virtual mode. OrderCache fetches a page when data is missing, rather than querying one cell at a time. Apply the filter first so the virtual rows represent the requested result set.

    Compare the full order count with the small number of rows transferred for the visible area. Jumping far down the grid requests another page, while badges and filter and status regions remain available. The user can navigate a large result without constructing every row’s interface upfront.

    Assign the calendar editor to the due-date column and check both directions of value transfer. If the editor does not exchange the value automatically, coordinate it in the begin-edit and end-edit events. A custom editor is complete only when the chosen value returns correctly.

    Deliver explicit bound columns, a formatted status cell, and one meaningful editor or command column. Add the virtual cache and composed filter and status regions. Verify both ordinary editing and distant-row navigation so the grid’s interaction and loading strategies work together.

  4. ReadingAI Coding Exercise · 20 min

    Build this module's OperationsConsole sample with ChatGPT or Claude from a ready-made prompt that points the model at this module's specification, then review, run and extend what it gives you — including against our own reference build on GitHub.

    Read the lesson guide (PDF)

  5. Knowledge checkModule 5 Knowledge Check · 10 min · Pass mark 80%
  6. Hands-on labLab — Orders Grid · 45 min

    Objective: Build the Operations Console Orders grid: a DataGridView bound to a BindingSource with explicit columns and AutoGenerateColumns under control, a status cell rendered with AllowHtml and CellFormatting, one custom editor or command column, a virtual-mode or cache-backed version for the large-data path, and a composed filter and status strip docked inside or around the grid. Deliverables: Orders DataGridView with explicit columns bound to a BindingSource; Status cell rendered with AllowHtml and CellFormatting; One custom editor or command column; Virtual-mode or cache-backed large-data version of the grid; Composed filter and status strip docked inside or around the grid.

Module 6: Charts, Dashboards, Content, Media, and Documents

Module 6 of Mastering the Control Library — get the most from 100+ controls: grids, charts, trees and custom widgets. Read the lesson guide and the lab / exam guide, watch the ChartJS, PdfViewer and one dashboard refresh walkthrough, pass the knowledge check, then complete the hands-on lab in the Operations Console.

  1. ReadingLesson Guide · 14 min

    ChartJS datasets, labels and options; gauges and ProgressBar; PdfViewer, HtmlPanel, Upload and GoogleMaps with the browser/server boundary in mind; dashboards refreshed as one model. What this means for a Wisej.NET developer — and how to read this module.

    Read the lesson guide (PDF)

  2. ReadingLab / Exam Guide · 10 min

    What you'll build in the hands-on lab, the suggested approach, and the required deliverables.

    Read the lesson guide (PDF)

  3. Video lessonChartJS, PdfViewer and one dashboard refresh · 14 min

    ChartJS, PdfViewer and one dashboard refresh — a guided Module 6 walkthrough, built step by step in the Operations Console. Runs right here in the player.

    Narration transcript

    Build the dashboard around the decisions its data should support. Charts, a completion gauge, a document preview, and upload can share one screen, but they need a coordinated refresh. The Operations Console should show a coherent snapshot instead of unrelated visual updates.

    Start by stating the question each region answers. A visual can be attractive and still provide no useful decision support. Removing that ambiguity before selecting a chart prevents the dashboard from becoming a collection of graphics whose purpose the user must guess.

    Match the display to the information: patterns need charts, individual records need a grid, one completion value needs a gauge, and location needs a map. These choices make the data easier to interpret because the control serves the question rather than decorating the screen.

    Add ChartJS through its package and keep its options, labels, and datasets under server ownership. The browser performs the rendering. Convert the dashboard view model into chart data in one place so chart configuration does not spread across unrelated event handlers.

    DashboardModel supplies aggregated months, counts, and completion data. RefreshDashboard assigns labels and datasets together, then updates the gauge, document preview, and time. Using one model keeps the displayed values related to the same refresh instead of mixing separate results.

    Respect the browser boundary when adding previews, uploads, and maps. Upload sends bytes explicitly chosen by the user; it does not give the server access to browse the device’s disk. Sanitize embedded markup before display so content handling remains an intentional part of the design.

    Refresh the dashboard as one operation: request aggregated data once and update the controls together. Show loading while it runs and a visible timestamp afterward. The timestamp helps users judge freshness, while aggregation avoids transferring raw records that the charts do not need.

    Watch Refresh become unavailable while the chart, gauge, preview, and timestamp change together. The completion gauge reaches seventy-eight percent. Then upload the selected document and observe the preview follow it, confirming that the server received the file chosen through the browser.

    Deliver a dashboard whose chart and progress display come from the same view model. Add the document or markup preview and Upload, with one RefreshDashboard method updating the complete screen. Explain which question each region answers and verify that the refresh remains coordinated.

  4. ReadingAI Coding Exercise · 20 min

    Build this module's OperationsConsole sample with ChatGPT or Claude from a ready-made prompt that points the model at this module's specification, then review, run and extend what it gives you — including against our own reference build on GitHub.

    Read the lesson guide (PDF)

  5. Knowledge checkModule 6 Knowledge Check · 10 min · Pass mark 80%
  6. Hands-on labLab — Dashboard and Content Tab · 45 min

    Objective: Build the Operations Console dashboard tab: a ChartJS line or bar chart whose labels and DataSets come from a dashboard view model, a ProgressBar or gauge-like indicator for one status value, a PdfViewer or HtmlPanel content preview, an Upload workflow, a map or content placeholder, and one refresh method that updates every dashboard control from a single model. Deliverables: Dashboard tab with a ChartJS line or bar chart; Chart labels and DataSets built from a dashboard view model; ProgressBar or gauge-like indicator for one status value; PdfViewer or HtmlPanel content preview plus an Upload workflow; One refresh method that updates every dashboard control.

Module 7: Custom Widgets, Extensions, Theming, and Capstone

Module 7 of Mastering the Control Library — get the most from 100+ controls: grids, charts, trees and custom widgets. Read the lesson guide and the lab / exam guide, watch the Widget wrapper walkthrough, pass the knowledge check, then complete the hands-on lab in the Operations Console.

  1. ReadingLesson Guide · 14 min

    Native controls versus widgets, components, extender providers and icon packs; the Widget control's packages, InitScript, WidgetEvent and CallAsync bridge; theming and documentation; the Operations Console capstone. What this means for a Wisej.NET developer — and how to read this module.

    Read the lesson guide (PDF)

  2. ReadingLab / Exam Guide · 10 min

    What you'll build in the hands-on lab, the suggested approach, and the required deliverables.

    Read the lesson guide (PDF)

  3. Video lessonBuild a Widget wrapper and trace the messages · 14 min

    Build a Widget wrapper and trace the messages — a guided Module 7 walkthrough, built step by step in the Operations Console. Runs right here in the player.

    Narration transcript

    Add the star-rating capability only after confirming the native library does not supply the needed control. The capstone wraps a browser widget while preserving Wisej.NET ownership, events, and theming. This makes the integration part of the application’s control model rather than an isolated script.

    Prefer an existing control when it already provides the designer, server state, events, and theme behavior you need. Custom integration is justified by a missing browser capability or library feature. Stop at the simplest level that satisfies the requirement instead of rebuilding support already available.

    Name the extension according to its responsibility before choosing its implementation. A widget, component, extender, icon pack, and reusable interface region are not interchangeable. This distinction keeps you from creating a full custom control when a smaller integration boundary would do.

    Load the script and stylesheet through Packages, then initialize the browser object with InitScript. The widget sends meaningful changes through fireWidgetEvent, and the server receives WidgetEvent. Calls in the reverse direction let the server confirm state back to the browser implementation.

    The wrapper validates both the event type and its payload before invoking RatingService. In the browser callback, retain the correct widget reference so the event returns through the intended instance. These checks protect the boundary between a browser interaction and trusted server-side work.

    Document the package, property, event, payload, and server-call contract next to the code. When the widget fails, inspect resource order, paths, initialization timing, and recreation after refresh in the browser tools. A written contract gives each diagnostic question a clear expected answer.

    Click a rating and follow the full exchange. The server checks the one-to-five range, saves, and acknowledges completion; the browser then shows the saved state. The diagnostic strip identifies the current control, record, profile, and refresh, making that exchange easier to trace.

    Polish the integration through theme appearances or packaged styles, then verify responsive behavior and accessible labels. Avoid embedding visual decisions in JavaScript that should belong to the theme. The final console and its guidance should explain why each control choice serves its screen’s purpose.

    Submit the working widget with its packages, two-way event path, and documented contract as part of the complete Operations Console. Include the demonstration script and capstone notes. The review should show both the user-facing result and the reasoning behind the chosen integration boundary.

  4. ReadingAI Coding Exercise · 20 min

    Build this module's OperationsConsole sample with ChatGPT or Claude from a ready-made prompt that points the model at this module's specification, then review, run and extend what it gives you — including against our own reference build on GitHub.

    Read the lesson guide (PDF)

  5. Knowledge checkModule 7 Knowledge Check · 10 min · Pass mark 80%
  6. Hands-on labLab — Custom Widget and Capstone · 45 min

    Objective: Wrap a small JavaScript rating or indicator widget with the Widget control, or configure a Wisej.NET extension package: load its JavaScript and CSS packages, raise a server-side event from the client with the widget event pattern, call a client-side function from the server with CallAsync or Eval, theme it to match the console, then polish the complete Operations Console capstone and prepare a 5-minute demo. Deliverables: Widget or extension-based screen with its JavaScript and CSS packages loaded; Client-to-server event raised with the widget event pattern or a native extension event; Server-to-client call through CallAsync, Eval or the extension API; Documented client/server contract: packages, properties, events and payload format; Polished Operations Console capstone with a 5-minute demo script.