Search code examples
javascriptjqueryasp.net-mvcasp.net-corebootstrap-multiselect

How to add/remove element in list on the basis of selection of 2 dropdown list in multi select bootstrap dropdown jquery?


Hope all of you fine and doing well.

I am using multi select bootstrap drop down jquery. I am using asp.net core to populdate Listbox, its working fine for selection,select all etc.

But i want that when i select element from Dropdown A then this element must be removed from dropdown B and if i unselect element from dropdown A then it must added/show in dropdownB. And vice virsa as well, if element selected in dropdown B then this element removed from dropdownA, also if select all from dropdownA then all elements removed from dropdownB and vice virsa as well. Hope you understand guys.

For example: If A,B,C,D values in dropdownlistA and if i select A then it must be disable or hide from dropdownB,if i select all then must remove all from dropdownB, and also vice virsa for dropdownB as well, Note: DropdownA and DropdownB both have same number of values/elements,same text ,same value,

View

@section AddToHead{
<link rel="stylesheet" href="~/css1/bootstrap-3.1.1.min.css" type="text/css" />
<link rel="stylesheet" href="~/css1/bootstrap-multiselect.css" type="text/css" />
<script type="text/javascript" src="https://code.jquery.com/jquery-1.8.2.js"></script>
<script type="text/javascript" src="~/js1/bootstrap-2.3.2.min.js"></script>
<script type="text/javascript" src="~/js1/bootstrap-multiselect.js"></script>
}
<form class="column" asp-controller="group"  asp-action="createresult" style="height:100%;" method="post">
  <span class="column" style="height:50px;">
        @Html.ListBoxFor(x => x.AvailablePlayers, Model.AvailablePlayers, new { id = "PlayersTeamA", onChange = "getSelectedOptions(this)", multiple = "multiple" })
        @Html.ValidationMessageFor(model => model.TeamOnePlayers)

    </span>
     <span class="column">
        @Html.ListBoxFor(x => x.AvailablePlayers, Model.AvailablePlayers, new { id = "PlayersTeamB", onChange = "getSelectedOptions(this)", multiple = "multiple" })
        @Html.ValidationMessageFor(model => model.TeamTwoPlayers)

    </span>

   </form>

    </div>
        @section Scripts {



<script type="text/javascript">
    $(function () {
        $('#PlayersTeamA').multiselect({
            includeSelectAllOption: true
        });
        $('#PlayersTeamB').multiselect({
            includeSelectAllOption: true
        });

      
    });

    function getSelectedOptions(sel) {
        var idddl = sel.id;
       
        var opts = [],
            opt;
        var len = sel.options.length;
        for (var i = 0; i < len; i++) {
            opt = sel.options[i];

            if (opt.selected) {
                opts.push(opt);
                var idul = sel.id;
                alert(idul);
                var ul = document.getElementById(idul);
                ul.removeChild(ul.childNodes[1]);



               
              

            }
        }

        return opts;
    }

Solution

  • Here is a working demo like below:

    @model Players
    <form class="column" asp-controller="group" asp-action="createresult" style="height:100%;" method="post">
    <div id="A">
        <span class="column" style="height:50px;">
            @Html.ListBoxFor(x => x.AvailablePlayers, Model.AvailablePlayers, new { id = "PlayersTeamA", multiple = "multiple" })
        </span>
    </div>  
    <div id="B">
        <span class="column">
            @Html.ListBoxFor(x => x.AvailablePlayers, Model.AvailablePlayers, new { id = "PlayersTeamB", multiple = "multiple" })
        </span>
    </div>
    </form>
    
    @section Scripts {
        <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-multiselect/0.9.15/js/bootstrap-multiselect.min.js"></script>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-multiselect/0.9.15/css/bootstrap-multiselect.css"/>
        <script>
            $(function () {
                $('#PlayersTeamA').multiselect({
                    includeSelectAllOption: true   
                });
                $('#PlayersTeamB').multiselect({
                    includeSelectAllOption: true
                });
            });
    
            var data = [];
            $('#B option').each(function (index, item) {
                data.push({ label: this.label, value: this.value });
            });
    
            $("#PlayersTeamA").change(function () {
                var selectedText = $('#PlayersTeamA').val();
                var newData = data;
    
                selectedText.forEach(function (element, index, array) {
                    newData = newData.filter(function (el) { return el.value != element; });
                });           
                $("#PlayersTeamB").multiselect('dataprovider', newData);
            });
        </script>
    }
    

    My testing model:

    public class Players
    {
        public SelectList AvailablePlayers { get; set; }
    }
    public class AvailablePlayer
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    

    My testing controller:

    [HttpGet]
    public async Task<IActionResult> Index()
    {
        var player = new List<AvailablePlayer>()
        {
            new AvailablePlayer(){ Id=1,Name="aa"},
            new AvailablePlayer(){ Id=2,Name="bb"},
            new AvailablePlayer(){ Id=3,Name="cc"}
        };
        var model = new Players()
        {
            AvailablePlayers = new SelectList(player, "Id", "Name")
        };
        return View(model);
    }
    

    Result: enter image description here