stephenbayer
stephenbayer

Reputation: 12431

Adding data-* attributes to a DevExpress MVC gridview cell

I have a standard DevExpress MVCxGridView bound to a DataTable, which is just a bunch of boolean values with the first column "SS" being a string code which is the datakey. I loop through all the columns and dynamically create the gridview columns. The grid that is displayed is a bunch of checkboxes which are options that can be configured.

I have a jquery js file that requires the data-* attributes to be set for these cells in order to inject the necessary functionality. I want to know how to add "data-*" attributes to each of the TD cells. "data-ss" being the datakey in the first column, and "data-wm" being the workmode in the column.

My Razor view code is as follows:

@model System.Data.DataTable
@{
    var gv = Html.DevExpress().GridView(
        settings =>
        {
            settings.Name = "gv";
            settings.Enabled = true;
            settings.KeyFieldName = "SS";
            settings.CallbackRouteValues = new { Controller = "Test", Action = "DataBindingPartial" };
            settings.Settings.HorizontalScrollBarMode = ScrollBarMode.Auto;
            settings.Settings.VerticalScrollBarMode = ScrollBarMode.Auto;
            settings.Settings.VerticalScrollableHeight = 200;
            settings.SettingsPager.Mode = DevExpress.Web.ASPxGridView.GridViewPagerMode.ShowAllRecords;

            MVCxGridViewBandColumn currentBand = null;

            foreach (System.Data.DataColumn c in Model.Columns)
            {
                if (c.ColumnName == "SS")
                {
                    DevExpress.Web.ASPxGridView.GridViewColumn column = settings.Columns.Add(c.ColumnName);
                    column.Caption = "SS";
                    column.CellStyle.CssClass = "ss_head";
                    column.HeaderStyle.CssClass = "ss_head_caption";
                    column.HeaderStyle.Cursor = "pointer";
                }
                else
                {
                    // Get Column Definition retreives information based on the column name
                    //   definition.ActivityType = "act" if activity or "dg" if DataGathering
                    //   definition.WorkMode = abbreviated name of activity
                    //   definition.Description = long description of activity
                    var definition = 
                        TestModel.DefinitionColumn.GetColumnDefinition(c.ColumnName);

                    if (currentBand == null || currentBand.Name != definition.ActivityType)
                    {
                        currentBand = settings.Columns.AddBand();

                        currentBand.Name = definition.ActivityType;
                        currentBand.Caption = definition.ActivityType == "act" ? "Activity" : "Data Gathering";
                        currentBand.HeaderStyle.CssClass = String.Format("workmode_col workmode_{0}", definition.ActivityType);
                    }
                    DevExpress.Web.ASPxGridView.GridViewColumn column =                     
                            currentBand.Columns.Add(c.ColumnName, MVCxGridViewColumnType.CheckBox);
                    column.Caption = definition.WorkMode;
                    column.ToolTip = definition.Description;
                    column.Visible = true;
                    column.HeaderStyle.Cursor = "pointer";
                    column.CellStyle.CssClass = String.Format("workmode_{0} workmode_selectable workmode_col", definition.ActivityType);
                    column.HeaderStyle.CssClass = String.Format("workmode_{0} workmode_col", definition.ActivityType);
                    column.Width = 35;
                }
            }
        });
    var gvBound = gv.Bind(Model);
    gvBound.Render();
}

Thank you Mikhail.

Using this I was able to add a settings configuration to set the data-* attributes:

        settings.HtmlDataCellPrepared = (sender, e) =>
        {
            e.Cell.Attributes.Add(
                "data-wm", 
                e.DataColumn.Caption
            );
            e.Cell.Attributes.Add(
                "data-ssco",
                e.KeyValue.ToString()
            );
        };

Upvotes: 0

Views: 3382

Answers (1)

Mikhail
Mikhail

Reputation: 9285

It is possible to use GridViewSettings.HtmlDataCellPrepared event to assign the required attributes. Check this SO thread.

Upvotes: 2

Related Questions