private void toggleExpanded(int rowindex)
    {
        List <PollutantTransfers.AreaTreeListRow> data = ViewState[RESULT] as List <PollutantTransfers.AreaTreeListRow>;

        PollutantTransfers.AreaTreeListRow row = data[rowindex];

        //toggle expansion
        row.IsExpanded = !row.IsExpanded;

        //get data from database, if not already loaded
        if (row.HasChildren && row.IsExpanded && !data.Any(r => r.Level == row.Level + 1 && r.ParentCode == row.Code))
        {
            if (row.Level == 0)
            {
                var subareas = PollutantTransfers.GetSubAreas(SearchFilter, new List <string> {
                    row.CountryCode
                });
                addToResult(subareas);
            }
        }

        this.lvPollutantTransfersAreas.DataSource = data;
        this.lvPollutantTransfersAreas.DataBind();


        // notify that content has changed (print)
        if (ContentChanged != null)
        {
            ContentChanged.Invoke(null, EventArgs.Empty);
        }
    }
    //Rows will only be shown if parent is expanded (grand-parents must be expanded too)
    protected void rows_OnItemDataBound(object sender, ListViewItemEventArgs e)
    {
        ListViewDataItem dataItem = e.Item as ListViewDataItem;

        if (dataItem == null)
        {
            return;                   //safe check
        }
        int rowindex = dataItem.DataItemIndex;

        PollutantTransfers.AreaTreeListRow        row  = dataItem.DataItem as PollutantTransfers.AreaTreeListRow;
        List <PollutantTransfers.AreaTreeListRow> data = ViewState[RESULT] as List <PollutantTransfers.AreaTreeListRow>;

        //Countries need not to be considered. Will always be visible
        bool collapsed = false;

        if (row.Level > 0)
        {
            //is country collapsed?
            collapsed = !data.Single(d => d.CountryCode == row.CountryCode && d.Level == 0).IsExpanded;
        }

        dataItem.Visible = !collapsed;
    }