We use cookies to give you the best experience on our website. If you continue to browse, then you agree to our privacy policy and cookie policy. (Last updated on: June 24, 2019).
Unfortunately, activation email could not send to your email. Please try again.
Syncfusion Feedback

Cascading Dropdownlist

Thread ID:

Created:

Updated:

Platform:

Replies:

141745 Jan 2,2019 10:27 AM UTC Mar 3,2020 05:29 PM UTC ASP.NET Core - EJ 2 7
loading
Tags: DataGrid
Stefan
Asked On January 2, 2019 10:27 AM UTC

Hi

EJ2.Grid in ASP.Net Core with  Razor Pages. 

Do you have sample code for a cascading dropdownlist in a grid for Razor Pages?

Regards,

/S


Madhu Sudhanan P [Syncfusion]
Replied On January 3, 2019 09:29 AM UTC

Hi Stefan, 

Thanks for contacting Syncfusion support. 

Query : Do you have sample code for a cascading dropdownlist in a grid for Razor Pages? 
 
As per your requirement we have created a sample for your reference. In the below sample we have achieved cascading dropdown list(we have bind the city based on the country field) in Grid using cell edit template. You can also use the below way to achieve your requirement. 

Kindly refer to the below code example and sample for more information. 

<ejs-grid id="Grid" dataSource="ViewBag.dataSource" toolbar="@(new List<string>() { "Add", "Edit", "Delete", "Update", "Cancel" })" allowPaging="true" height="300"> 
    <e-grid-editSettings allowAdding="true" allowDeleting="true" allowEditing="true"></e-grid-editSettings> 
    <e-grid-columns> 
        <e-grid-column field="OrderID" width="110" isPrimaryKey=true></e-grid-column> 
        <e-grid-column field="ShipCountry" headerText="ShipCountry" edit="@(new {create = "create", read = "read", destroy = "destroy", write = "write"})" width="110"></e-grid-column> 
        <e-grid-column field="ShipCity" width="110" edit="@(new {create = "createcity", read = "readcity", destroy = "destroycity", write = "writecity"})"> </e-grid-column> 
    </e-grid-columns> 
</ejs-grid> 
 
<script> 
 
    function create() { 
        countryElem = document.createElement('input'); 
        return countryElem; 
    }; 
    function read() { 
        return countryObj.text; 
    }; 
    function destroy() { 
        countryObj.destroy(); 
    }; 
    function write() { 
        countryObj = new ej.dropdowns.DropDownList({ 
            dataSource: country, 
            fields: { value: 'countryId', text: 'countryName' }, 
            change: function () { 
                stateObj.enabled = true; 
                based on the country(filter for state column) we have bind data for city column  
 
                var tempQuery = new ej.data.Query().where('countryId', 'equal', countryObj.value); 
                stateObj.query = tempQuery; 
                stateObj.text = null; 
                stateObj.dataBind(); 
            }, 
            placeholder: 'Select a country', 
            floatLabelType: 'Never' 
        }); 
        countryObj.appendTo(countryElem); 
    }; 
    function createcity() { 
        stateElem = document.createElement('input'); 
        return stateElem; 
    }; 
    function readcity() { 
        return stateObj.text; 
    }; 
    function destroycity() { 
        stateObj.destroy(); 
    }; 
    function writecity() { 
        stateObj = new ej.dropdowns.DropDownList({ 
            dataSource: state, 
            fields: { value: 'stateId', text: 'stateName' }, 
            enabled: false, 
            placeholder: 'Select a state', 
            floatLabelType: 'Never' 
        }); 
        stateObj.appendTo(stateElem); 
    } 
 
</script> 


Help documentation :  



Regards, 
Madhu Sudhanan P 


Stefan
Replied On January 3, 2019 07:06 PM UTC

Hi

When I save the grid the name of country and state in dropdowns are posted correctly but countryId and stateId are always original values. The changed ids in  dropdown are never sent to server on postback. Do you have a sample with insert and update?


Madhu Sudhanan P [Syncfusion]
Replied On January 4, 2019 06:38 AM UTC

Hi Stefan, 

Thanks for your update. 

In our previously provided sample we have return dropdown text as a value to grid so that it does not return the ids to server we suggest you to return the value instead of text to achieve your requirement. In the below sample we have stored the country and state id in server side and display the country(United states) based on id(countryid) in Grid using valueAccessor property. 

Please refer the below code example and sample for more information. 

<ejs-grid id="Grid" dataSource="ViewBag.dataSource" toolbar="@(new List<string>() { "Add", "Edit", "Delete", "Update", "Cancel" })" allowPaging="true" height="300"> 
    <e-datamanager url="/Home/UrlDatasource" insertUrl="/Home/Insert" updateUrl="/Home/Update"  adaptor="UrlAdaptor"></e-datamanager> 
    <e-grid-editSettings allowAdding="true" allowEditing="true"></e-grid-editSettings> 
    <e-grid-columns> 
        <e-grid-column field="OrderID" width="110" isPrimaryKey=true></e-grid-column> 
        <e-grid-column field="ShipCountry" valueAccessor="@("shipCountry")" headerText="ShipCountry" edit="@(new {create = "create", read = "read", destroy = "destroy", write = "write"})" width="110"></e-grid-column> 
        <e-grid-column field="ShipCity" valueAccessor="@("shipCity")" width="110" edit="@(new {create = "createcity", read = "readcity", destroy = "destroycity", write = "writecity"})"> </e-grid-column> 
    </e-grid-columns> 
</ejs-grid> 
 
<script> 
 
    function shipCountry(field, data, column) { 
            return (data[field] === '1') ? 'United States' : 'Australia'; 
    } 
 
    function shipCity(field, data) { 
        var city; 
        switch (data[field]) { 
            case '101': 
                city = "New York"; 
                break; 
            . . . . 
       } 
        return city; 
    } 
 
    function create() { 
        countryElem = document.createElement('input'); 
        return countryElem; 
    }; 
    function read() { 
        return countryObj.value; 
    }; 
    function destroy() { 
        countryObj.destroy(); 
    }; 
    function write(args) { 
        countryObj = new ej.dropdowns.DropDownList({ 
            dataSource: country, 
            fields: { value: 'countryId', text: 'countryName' }, 
            value: args.rowData['ShipCountry'], 
            change: function () { 
                stateObj.enabled = true; 
                var tempQuery = new ej.data.Query().where('countryId', 'equal', countryObj.value); 
                stateObj.query = tempQuery; 
                stateObj.text = null; 
                stateObj.dataBind(); 
            }, 
            placeholder: 'Select a country', 
            floatLabelType: 'Never' 
        }); 
        countryObj.appendTo(countryElem); 
    }; 
    function createcity() { 
        stateElem = document.createElement('input'); 
        return stateElem; 
    }; 
    function readcity() { 
        return stateObj.value; 
    }; 
    function destroycity() { 
        stateObj.destroy(); 
    }; 
    function writecity(args) { 
        stateObj = new ej.dropdowns.DropDownList({ 
            dataSource: state, 
            fields: { value: 'stateId', text: 'stateName' }, 
            enabled: false, 
            value: args.rowData['ShipCity'], 
            placeholder: 'Select a state', 
            floatLabelType: 'Never' 
        }); 
        stateObj.appendTo(stateElem); 
    } 
 
</script> 
  

If we misunderstood your query then share more information regarding your requirement it will helpful for us to provide a better solution as soon as possible.  

Regards, 
Madhu Sudhanan P 


Yoab Youssoufou
Replied On February 25, 2020 04:59 PM UTC

Hello Madhu,
I have been able to reproduce this example only if the text and id are both in text format. In practice the Id will be an integer for example in which case this does not work. How will this query: var tempQuery = new ej.data.Query().where('countryId''equal', countryObj.value); 
work if CountryId is an integer and not a string?
Please help as it is not practical to add string columns when working with a relational database with foreign keys of integer type

Balaji Sekar [Syncfusion]
Replied On February 26, 2020 12:10 PM UTC

Hi Yoab, 
 
Query: Need to set cascading dropdown for integer columns. 
 
We have validated your query and prepared sample based on your requirement. In the sample we have changed the string column to integer column and also changed the dataSource of the dropdown into  integer column to achieve your requirement. The query which is written for countryId column will remain same because the integer values also have equal operator support for filtering the data in the dropdown. We have shared the sample for your reference. 
 
Code Snippet: 
Index.cshtml 
 
function shipCity(field, data) { 
        var city; 
        var swithData = data[field].toString(); 
        switch (swithData) { 
            case '101': 
                city = "New York"; 
                break; 
            case '102': 
                city = "Virginia"; 
                break; 
            case '103': 
                city = "Washington"; 
                break; 
            case '104': 
                city = "Queensland"; 
                break; 
            case '105': 
                city = "Tasmania"; 
                break; 
            case '106': 
                city = "Victoria"; 
        } 
        return city; 
    } 
    var country = [ 
        { countryName: 'United States', countryId: 1 }, 
        { countryName: 'Australia', countryId: 2
    ]; 
    var state = [ 
        { stateName: 'New York', countryId: 1, stateId: 101 }, 
        { stateName: 'Virginia ', countryId: 1, stateId: 102 }, 
        { stateName: 'Washington', countryId: 1, stateId: 103 }, 
        { stateName: 'Queensland', countryId: 2, stateId: 104 }, 
        { stateName: 'Tasmania ', countryId: 2, stateId: 105 }, 
        { stateName: 'Victoria', countryId: 2, stateId: 106
    ]; 

    function write(args) { 
        countryObj = new ej.dropdowns.DropDownList({ 
            dataSource: country, 
            fields: { value: 'countryId', text: 'countryName' }, 
            value: args.rowData['ShipCountry'], 
            change: function () { 
                stateObj.enabled = true; 
                var tempQuery = new ej.data.Query().where('countryId', 'equal', countryObj.value); 
                stateObj.query = tempQuery; 
                stateObj.text = null; 
                stateObj.dataBind(); 
            }, 
            placeholder: 'Select a country', 
            floatLabelType: 'Never' 
        }); 
        countryObj.appendTo(countryElem); 
    }; 
 
 
Please get back to us if you need further assistance. 
 
Regards, 
Balaji Sekar. 


Yoab Youssoufou
Replied On February 28, 2020 10:32 AM UTC

Thanks Balaji but I still couldnt get it to work with integers. I am populating everything from the database no hard coding. Pls see my code:

<script>
    var depElem;
    var depObj;
    var specElem;
    var specObj;
    var subspecElem;
    var subspecObj;
    var df;

      var dep = @Json.Serialize(gen.GetLkDepartments());
    var spec = @Json.Serialize(gen.GetLkSpecialties());
    function dataBound(args) {
        this.getColumns()[1].edit = {
            create: function () {
                depElem = document.createElement('input');
                return depElem;
            },
            read: function () {
                return depObj.text;
            },
            destroy: function () {
                depObj.destroy();
            },
            write: function () {
                depObj = new ej.dropdowns.DropDownList({
                    dataSource: @Html.Raw(Json.Serialize(gen.GetLkDepartments2())),
                    fields: { text: 'DisplayField', value: 'Id' },
                    change: function () {
                        specObj.enabled = true;
                        var tempQuery = new ej.data.Query().where('DepartmentsId', 'equal', depObj.value);
                        specObj.query = tempQuery;
                        specObj.text = null;
                        specObj.dataBind();
                    },
                    placeholder: 'Select a Department',
                    floatLabelType: 'Never'
                });
                depObj.appendTo(depElem);
            }
        };
        this.getColumns()[2].edit = {
            create: function () {
                specElem = document.createElement('input');
                return specElem;
            },
            read: function () {
                return specObj.text;
            },
            destroy: function () {
                specObj.destroy();
            },
            write: function () {
                specObj = new ej.dropdowns.DropDownList({
                    dataSource: @Html.Raw(Json.Serialize(gen.GetLkSpecialties2())),
                    fields: { text: 'DisplayField', value: 'Id' },
                    enabled: false,
                    placeholder: 'Select a specialty',
                    floatLabelType: 'Never'
                });
                specObj.appendTo(specElem);
            }
        };
         
        
    }

</script>


functions to retrieve the lookup data:

    public IEnumerable<DisplayDetails> GetLkDepartments2()
        {
            var datasource = from x in _context.Departments.OrderBy(x => x.Name)
                             select new DisplayDetails
                             {
                                 Id = x.Id,
                                 DisplayField = String.Format("{0}", x.Name)
                             };
            return datasource;


        }
        public IEnumerable<DisplayDetails> GetLkSpecialties2()
        {
            var datasource = from x in _context.MedicalSpecialties.OrderBy(x => x.Name)
                             select new DisplayDetails
                             {
                                 Id = x.Id,
                                 DisplayField = String.Format("{0}", x.Name)
                             };
            return datasource;


        }

and finally the view model srtructure:
 public class DisplayDetails
    {
        public int Id { get; set; }
        public string DisplayField { get; set; }
    }

If you can guide me with this example I would really appreciate it.


Prasanna Kumar Viswanathan [Syncfusion]
Replied On March 3, 2020 05:29 PM UTC

Hi Yoab, 
 
Thanks for the update. 
 
Based on your request we have modified the sample and in that sample we populated data from the server-side for the dropdowns. But in our sample the cascading dropdown was working fine with the integers. For your convenience we have attached the sample and video demonstration. So, please check the sample and video & compare with your sample to find out the changes. 
 
Please share the below details to validate further on your requirement. 
 
1. Share the video demonstration of the issue. 
 
2. Share the data source structure details of the dropdowns. 
 
 
 
Please get back to us if you need further assistance. 
 
Regards, 
Prasanna Kumar N.S.V 


CONFIRMATION

This post will be permanently deleted. Are you sure you want to continue?

Sorry, An error occured while processing your request. Please try again later.

Please sign in to access our forum

This page will automatically be redirected to the sign-in page in 10 seconds.

Warning Icon You are using an outdated version of Internet Explorer that may not display all features of this and other websites. Upgrade to Internet Explorer 8 or newer for a better experience.Close Icon

Live Chat Icon For mobile
Live Chat Icon