Как скрыть и показать строки 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 вместо div. Я помещаю необработанный 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