Как да скриете && Показване на редове на GridView при щракване върху заглавен елемент с Javascript?

Имам GridView, който има структура като тази:

  • група-заглавие

    • дълбочина-заглавие

      • (some person entity)
      • (някое физическо лице)
      • (някое физическо лице)
    • дълбочина-заглавие

      • (some person entity)
      • (някое физическо лице)
      • (някое физическо лице)
  • група-заглавие

    • дълбочина-заглавие

      • (some person entity)
      • (някое физическо лице)
      • (някое физическо лице)
    • дълбочина-заглавие

      • (some person entity)
      • (някое физическо лице)
      • (някое физическо лице)

Въпреки че имам Javascript, който превключва заглавието на раздела и под-елементите, които работят по предназначение, превключването не работи на ниво заглавие на групата, тъй като поделементите на един заглавен елемент могат да бъдат превключвани, но не и на друг заглавен елемент, така че когато превключването е активиран на ниво заглавка на групата, той просто обръща превключването, което не е това, което искам, така че се опитах да напиша някакъв Javascript, че когато се щракне върху заглавката на групата, той просто ще скрие всички едновременни редове, независимо от състоянието на превключване до следващата заглавка на групата ако не са били скрити, в противен случай щракването върху заглавката на групата ще покаже/разшири скритите редове, независимо от състоянието на превключване до следващата заглавка на групата.

Въпреки това не успях да разработя кода, така че когато се щракне върху заглавката на групата, той скрива всички следващи редове до следващата заглавка на групата, ако не са скрити, иначе ги показва. В момента се сблъсквам с "JavaScript runtime error: Unable to get property 'display' of undefined or null reference" на реда if (el.style.display != 'none'), което предполага, че не манипулирам правилно обекти, но не съм сигурен какви obj или attr трябва да манипулирам, за да постигна желания ефект, тъй като съм нов в Javascript.

Javascript:

<script type="text/javascript">
    $(function () {
        $('.group-header').click(function () {
            $(this).nextUntil('.group-header').each(function () {
                var el = this;
                if (el.style.display != 'none') {
                    el.style.display = 'none';
                }
                else {
                    el.style.display = '';
                }
            }())
        });
    });

    $(function () {
        $('.dept-header').click(function () {
            $(this).nextUntil('.dept-header, .group-header').toggle();
        });
    });
</script>

За справка моят код на Razor:

<table id="companyGrid" class="table table-bordered table-striped grid">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Designation)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Department)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Company)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Year)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Salary)
        </th>
    </tr>
    @foreach (var group in Model.GroupBy(x => x.Company))
    {
        <tr class="group-header">
            <td colspan="7">
                <span class="h2">@group.Key</span>
            </td>
        </tr>
        foreach (var dept in group.GroupBy(x => x.Department))
        {
            <tr class="dept-header">
                <td colspan="6">
                    <span class="h4">@dept.Key</span>
                </td>
            </tr>
            foreach (var item in dept)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Name)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Designation)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Department)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Company)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Year)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Salary)
                    </td>
                </tr>
            }
        }
        <tr class="group-footer">
            <td colspan="6" class="text-center">
                <span class="label label-info">Company: @group.Key</span>
                <span class="label label-success">Total Employee: @group.Count()</span>
                <span class="label label-primary">Avg Salary: @group.Average(x => x.Salary).ToString("C")</span>
            </td>
        </tr>
    }
</table> 

person Kurt Wagner    schedule 16.09.2015    source източник


Отговори (1)


$(function () {
        $('.group-header').click(function () {
            $(this).children('.dept-header').each(function () {
               $(this).slideToggle();
            })
        });
    });


 $(function () {
        $('.group-header').click(function () {
            $(this).children('.dept-header').each(function () {
                var el = this;
                if (el.style.display != 'none') {
                    el.style.display = 'none';
                }
                else {
                    el.style.display = '';
                }
            })
        });
    });
**UPDATE :** 
 $(function () {
    $('.group-header').click(function () {
        $(this).nextUntil('.group-header').each(function () {
            var el = this;
            if (el.style.display != 'none') {
                el.style.display = 'none';
            }
            else {
                el.style.display = '';
            }
        })
    });
});

РЕДАКТИРАНЕ

$(function () {
                      $('.group-header').click(function () {
                          var parentgrpHeader = $(this);

                          $(this).nextUntil('.group-header').each(function () {
                             !parentgrpHeader.hasClass("toggle") ?  $(this).hide() : $(this).show();
                          });

                          parentgrpHeader.toggleClass('toggle');
                      });


                       $('.dept-header').click(function () {
                          $(this).toggleClass('collapsed').nextUntil('.dept-header, .group-header').toggle();
                      });


              });
person Vishal Anand    schedule 17.09.2015
comment
Страхувам се, че не работи съвсем за случая, който се опитвам да направя, не съм сигурен дали това, че е в td tr, изобщо ще забърка javascript вместо divs. Поставям необработения HTML, който кодът на Razor генерира в тази цигулка. Всички редове между ABC Infotech и TPS Software трябва да изчезнат при щракване върху ABC Infotech. jsfiddle.net/qLhhk3oq/1 - person Kurt Wagner; 17.09.2015
comment
Всъщност току-що разбрах, че този отговор страда от същия проблем като това, което се опитвах да разреша, ако заглавките на отделите са свити, тогава щракването върху заглавката на групата ги свива, така че данните под заглавките на отделите да се обърнат и да станат видими jsfiddle.net/qLhhk3oq/3 - person Kurt Wagner; 26.09.2015
comment
Щракването върху заглавката на групата винаги разширява заглавките на разделите, никога не се свива. - person Kurt Wagner; 28.09.2015
comment
@KurtWagner : Да, знам, но сега трябва да предприемете някои стъпки и да го поправите сами. Ако не сте в състояние да го направите. Можете да попитате отново. -Благодаря. - person Vishal Anand; 28.09.2015