Steps for getting started with the FlexGrid control in MVC applications are as follows:
Create a new MVC project using the C1 ASP.NET MVC application template, in Visual Studio IDE.
Add a controller and the corresponding view to the project.
Initialize the FlexGrid control in view using razor syntax.
(Optional) Add an appropriate CSS to customize the appearance of FlexGrid control.
This will create a FlexGrid with default behavior, which includes
automatic column generation, column sorting and reordering, editing,
and clipboard support.
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using FlexGrid101.Models;
using C1.Web.Mvc.Grid;
namespace FlexGrid101.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
FlexGridModel model = new FlexGridModel();
model.CountryData = Sale.GetData(500);
return View(model);
}
}
}
Result(live):
ID
Start
End
Country
Product
Color
Amount
Amount2
Discount
Active
Rank
1
1/25/2025
1/25/2025
France
Widget
Red
-1,227.26
3,217.05
0.03
3
2
2/25/2025
2/25/2025
Japan
Gadget
White
395.57
-284.69
0.13
5
3
3/25/2025
3/25/2025
German
Widget
White
4,440.99
-2,125.89
0.06
4
4
4/25/2025
4/25/2025
US
Gadget
Black
-2,743.68
-3,500.54
0.07
4
5
5/25/2025
5/25/2025
UK
Widget
White
3,288.66
4,016.10
0.23
5
ID
Start
End
Country
Product
Color
Amount
Amount2
Discount
Active
Rank
0
Column Definitions
The Getting Started example did not define any columns, so FlexGrid generated them
automatically.
This example shows how you can define the columns using the FlexGrid's Columns property.
Specifying the columns allows you to choose which columns to show, and in what order.
This also gives you control over each column's Width, Heading, Formatting, Alignment,
and other properties.
In this case, we use star sizing to set the width of the "Country" column. This tells the
column to stretch to fill the available width of the grid so there is no empty space. On
the "Amount" column, we set the format property to "n0", which results in numbers with thousand separators and no decimal digits. On
the "Discount" column, we set the format property to "p0", which results in numbers with
percentage and no decimal digits.
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using FlexGrid101.Models;
using C1.Web.Mvc.Grid;
namespace FlexGrid101.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
FlexGridModel model = new FlexGridModel();
model.CountryData = Sale.GetData(500);
return View(model);
}
}
}
Result(live):
ID
Start
End
Country
Amount
Amount2
Discount
Active
1
Jan 25 25
00:00
Canada
1,723
3,354.07
3%
2
Feb 25 25
01:01
Canada
4,521
-1,837.39
10%
ID
Start
End
Country
Amount
Amount2
Discount
Active
0
Selection Modes
By default, FlexGrid allows you to select a range of cells with the mouse or keyboard,
just like Excel. The SelectionMode property allows you to change that so that you
can select a Row, a Range of Rows, Non-Contiguous Rows (like in a List-Box), a Single Cell, a Range of Cells
or disable selection altogether.
This example allows you to pick the SelectionMode from a C1 ASP.NET MVC's ComboBox control.
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using FlexGrid101.Models;
using C1.Web.Mvc.Grid;
namespace FlexGrid101.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
FlexGridModel model = new FlexGridModel();
model.Settings = CreateSettings();
model.CountryData = Sale.GetData(500);
return View(model);
}
private IDictionary CreateSettings()
{
var settings = new Dictionary
{
{"SelectionMode",new object[]{SelectionMode.None.ToString(),SelectionMode.Cell.ToString(),SelectionMode.CellRange.ToString(),SelectionMode.Row.ToString(),SelectionMode.RowRange.ToString(),SelectionMode.ListBox.ToString(),SelectionMode.MultiRange.ToString()}}
};
return settings;
}
}
}
Result(live):
ID
Country
Amount
Discount
Active
1
UK
1,301
10%
2
France
2,465
2%
ID
Country
Amount
Discount
Active
0
Selection Modes
Editing
FlexGrid has built-in support for fast, in-cell editing like you find in Excel. There is no
need to add extra columns with Edit buttons that switch between display and edit modes.
Users can start editing by typing into any cell. This puts the cell in quick-edit mode.
In this mode, pressing a cursor key finishes the editing and moves the selection to a different cell.
Another way to start editing is by pressing F2 or by clicking a cell twice. This puts the cell in
full-edit mode. In this mode, pressing a cursor key moves the caret within the cell text.
To finish editing and move to another cell, the user must press the Enter, Tab, or Escape key.
Data is automatically coerced to the proper type when editing finishes. If the user enters invalid
data, the edit is cancelled and the original data remains in place.
There are two modes for updating the data to the server.
By default, the update operation will be commit to the server once finishing editing.
Notices:
If the user wants to commit the update operation to the datasource server, the Update, Delete or Create action url should be provided.
And the corresponding codes used to update the datasource should be written in the corresponding action.
The other mode is called BatchEdit. The user can update, create or remove multiple items.
Once these modifications are confirmed, They could be commit to the data source only once.
Now these modifications can be commit by the commit method of CollectionView in client side.
The user can also commit them by sorting, paging or filtering behavior.
Notices:
In this mode, the BatchEdit action url should be provided and the corresponding codes used to update the datasource should be written.
You can disable editing at the Grid, Column, or Row levels using the IsReadOnly property of the
Grid, Column, or Row objects. In this example, we make the ID column read-only.
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using FlexGrid101.Models;
using C1.Web.Mvc.Grid;
using C1.Web.Mvc;
using C1.Web.Mvc.Serialization;
namespace FlexGrid101.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult GridRead([C1JsonRequest] CollectionViewRequest<Sale> requestData)
{
return this.C1Json(CollectionViewHelper.Read(requestData, FlexGridModel.Source));
}
public ActionResult EGridUpdate([C1JsonRequest]CollectionViewEditRequest<Sale> requestData)
{
return this.C1Json(CollectionViewHelper.Edit(requestData, sale =>
{
string error = string.Empty;
bool success = true;
var fSale = FlexGridModel.Source.Find(item => item.ID == sale.ID);
fSale.Amount = sale.Amount;
fSale.Discount = sale.Discount;
fSale.Active = sale.Active;
return new CollectionViewItemResult<Sale>
{
Error = error,
Success = success,
Data = fSale
};
}, () => FlexGridModel.Source));
}
}
}
Result(live):
ID
Country
Amount
Discount
Active
ID
Country
Amount
Discount
Active
0
loading...
Grouping
FlexGrid supports grouping of client side data, set the GroupBy property to a column name for grouping the data according to a column.
Internally, FlexGrid supports grouping through the client side IItemsSource interface. To enable grouping at client side, add one or more GroupDescription objects to the
itemsSource.groupDescriptions property. It is easy to let the grid grouped by some field by calling the method GroupBy of FlexGridBuilder with the corresponding field name. And ensure that the grid's ShowGroups property
is set to true (the default value).
GroupDescription objects are flexible, allowing you to group data based on value or on grouping
functions. The example below groups dates by year; amounts by range returning three ranges: over 5,000,
1,000 to 5,000, 500 to 1,000, and under 500; and anything else by value. Use the menu to see the effects of each grouping.
Notice that the "Amount" column displays the totals in the group rows. We do this by
setting the column's Aggregate property to "Sum." The aggregate is automatically
updated when you edit the values in the column.
//Group by Modules
function gMenu_SelectedIndexChanged(sender) {
var grid = wijmo.Control.getControl("#gFlexGrid");
if (sender.selectedValue && grid) {
var name = sender.selectedValue;
var groupDescriptions = grid.collectionView.groupDescriptions;
grid.beginUpdate();
groupDescriptions.clear();
if (name.indexOf("Country") > -1) {
groupDescriptions.push(new wijmo.collections.PropertyGroupDescription("Country"));
}
if (name.indexOf("Product") > -1) {
groupDescriptions.push(new wijmo.collections.PropertyGroupDescription("Product"));
}
if (name.indexOf("Color") > -1) {
groupDescriptions.push(new wijmo.collections.PropertyGroupDescription("Color"));
}
if (name.indexOf("Start") > -1) {
groupDescriptions.push(new wijmo.collections.PropertyGroupDescription("Start", function (item, prop) {
var value = item[prop];
return value.getFullYear() + "/" + value.getMonth();
}));
}
if (name.indexOf("Amount") > -1) {
groupDescriptions.push(new wijmo.collections.PropertyGroupDescription("Amount", function (item, prop) {
var value = item[prop];
if (value <= 500) {
return "<500";
}
if (value > 500 && value <= 1000) {
return "500 to 1000";
}
if (value > 1000 && value <= 5000) {
return "1000 to 5000";
}
return "More than 5000";
}));
}
grid.endUpdate();
}
}
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using FlexGrid101.Models;
using C1.Web.Mvc.Grid;
namespace FlexGrid101.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
FlexGridModel model = new FlexGridModel();
model.Settings = CreateSettings();
model.CountryData = Sale.GetData(500);
return View(model);
}
private IDictionary CreateSettings()
{
var settings = new Dictionary
{
{"GroupBy", new object[]{"Country", "Product", "Color","Start","Amount","Country and Product","Product and Color", "None"}}
};
return settings;
}
}
}
Result(live):
Country
Product
Color
Start
Amount
Country: US (50 items)
-35,813
US
Gadget
Black
1/25/2025
2,052
Country
Product
Color
Start
Amount
0
Group by
Filtering
The FlexGrid supports filtering through the Filterable property. To enable filtering, set the Filterable(fl => fl.ColumnFilters() property.
In this example, we create a filter for the ID, Country, Product, Color, Start and get the filter value from the input control.
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using FlexGrid101.Models;
using C1.Web.Mvc.Grid;
namespace FlexGrid101.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
FlexGridModel model = new FlexGridModel();
model.CountryData = Sale.GetData(500);
return View(model);
}
}
}
Result(live):
ID
Country
Product
Color
Start
Discount
1
Italy
Widget
Red
Jan 25 25
24%
2
France
Gadget
Red
Feb 25 25
3%
ID
Country
Product
Color
Start
Discount
0
Paging
The FlexGrid supports paging through the Pager control. To enable paging, set the PageSize property to the number
of items you want on each page, and use Pager control to bind this FlexGrid.
In this example, we set PageSize to show 10 items per page. We add Pager control and set Owner Property to the FlexGrid id,
then we can switch pages.
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using FlexGrid101.Models;
using C1.Web.Mvc.Grid;
namespace FlexGrid101.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
FlexGridModel model = new FlexGridModel();
model.CountryData = Sale.GetData(500);
return View(model);
}
}
}
Result(live):
ID
Country
Product
Color
Start
Discount
1
Japan
Gadget
Black
Jan 25 25
6%
2
Korea
Widget
White
Feb 25 25
16%
3
Canada
Widget
White
Mar 25 25
13%
4
US
Widget
White
Apr 25 25
20%
5
Korea
Widget
White
May 25 25
2%
6
Korea
Gadget
White
Jun 25 25
24%
7
China
Gadget
Green
Jul 25 25
13%
8
Korea
Gadget
Red
Aug 25 25
24%
9
Japan
Widget
Black
Sep 25 25
25%
10
France
Gadget
Red
Oct 25 25
25%
ID
Country
Product
Color
Start
Discount
0
Conditional Styling
FlexGrid has an ItemFormatter property that gives you complete control over
the contents of the cells.
This example uses a JavaScript function to create value ranges that return named
colors. We then call this function in the FlexGrid's ItemFormatter and pass the cell's data
in order to conditionally set the cell's foreground color.
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using FlexGrid101.Models;
using C1.Web.Mvc.Grid;
namespace FlexGrid101.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
FlexGridModel model = new FlexGridModel();
model.CountryData = Sale.GetData(500);
return View(model);
}
}
}
Result(live):
Country
Product
Discount
Amount
US
Widget
7%
-2,346
France
Gadget
22%
-4,894
Country
Product
Discount
Amount
0
Themes
The appearance of the FlexGrid is defined in CSS. In addition to the default theme, we
include about a dozen professionally designed themes that customize the appearance of
all C1 ASP.NET MVC controls to achieve a consistent, attractive look.
The appearance of the FlexGrid is defined in CSS. In addition to the default theme, we
include about a dozen professionally designed themes that customize the appearance of
all C1 ASP.NET MVC controls to achieve a consistent, attractive look.
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using FlexGrid101.Models;
using C1.Web.Mvc.Grid;
using C1.Web.Mvc;
using C1.Web.Mvc.Serialization;
namespace ASPNetMVCFlexGrid101.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
FlexGridModel model = new FlexGridModel();
model.CountryData = Sale.GetData(500);
return View(model);
}
}
}
Result(live):
Country
Product
Discount
Amount
Italy
Widget
22%
-864
Italy
Gadget
16%
3,010
Country
Product
Discount
Amount
0
Trees and Hierarchical Data
In addition to grouping, FlexGrid supports hierarchical data, that is, data with items
that have lists of subitems. This type of hierarchical structure is very common, and is
usually displayed in a tree-view control.
To use FlexGrid with hierarchical data sources, set the ChildItemsPath property
to the name of the data element that contains the child elements. The grid automatically
scans the data and builds the tree for you.
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using FlexGrid101.Models;
using C1.Web.Mvc.Grid;
namespace FlexGrid101.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
}
Result(live):
Folder/File Name
Size
ja
FlexGrid101.resources.dll
16,896
Folder/File Name
Size
0
Handling null values
By default, FlexGrid allows you to enter empty values in columns of type string,
and will not allow empty/null values in columns of any other type.
You can change this behavior using the IsRequired property on grid columns.
If you set the IsRequired property to false, the grid will allow you to
enter empty values in that column, regardless of type. Conversely, if you set
the IsRequired property to true, the grid will not allow empty values
even in string columns.
Setting IsRequired to null reverts to the default behavior (nulls allowed
only in string columns).
The grid below reverts the default behavior. It sets IsRequired to false
for the first column, and to true for all others. You can delete content that
is not required by entering an empty string or simply by pressing the delete
key.