protected void filterbtn_Click(object sender, EventArgs e)
    {
        var avtalstyp    = avtalstyprbl.SelectedValue;
        var ansvarig_avd = avdelningdd.SelectedValue;
        var ansvarig_sbk = medarbetaredd.SelectedValue;
        var status       = statusrbl.SelectedValue;

        var dt = (DataTable)Session["OriginalDataSource"];

        DataTable filteredDt;

        try
        {
            filteredDt = dt.AsEnumerable()
                         .Where(row => avtalstyp == "Alla typer" ? true : row.Field <string>("avtalstyp") == avtalstyp)
                         .Where(row => ansvarig_avd == "Alla avdelningar" ? true : row.Field <string>("ansvarig_avd") == ansvarig_avd)
                         .Where(row => ansvarig_sbk == "Alla" ? true : row.Field <string>("ansvarig_sbk") == ansvarig_sbk)
                         .Where(row => status == "Alla" ? true : row.Field <string>("status") == status)
                         .CopyToDataTable();
        }
        catch (Exception)
        {
            // TODO spara table headers
            filteredDt = dt.Copy();
            //while (filteredDt.Rows.Count > 1) filteredDt.Rows.RemoveAt(1);
            filteredDt.Clear();
        }

        AvtalTable.DataSource = filteredDt;
        AvtalTable.DataBind();
        Session.Add("AvtalTableDataSource", filteredDt);
    }
    protected void AvtalTable_Sorting(object sender, GridViewSortEventArgs e)
    {
        DataTable dt = Session["AvtalTableDataSource"] as DataTable;

        if (dt != null)
        {
            var dv = dt.DefaultView;
            dv.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
            // dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
            // AvtalTable.DataSource = Session["AvtalTableDataSource"];
            var newTable = dv.ToTable();
            AvtalTable.DataSource = newTable;
            Session.Add("AvtalTableDataSource", newTable);

            AvtalTable.DataBind();
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.IsPostBack)
        {
            return;
        }

        filterdiv.Visible = false;

        var ds = new DataSet();
        var dt = new DataTable();

        // för filtrering
        var medarbetare = new List <Person>();
        var avdelningar = new List <string>();

        string connstr = ConfigurationManager.ConnectionStrings["postgres connection"].ConnectionString;

        using (var conn = new NpgsqlConnection(connstr))
        {
            conn.Open();
            var sqlquery = "select avtal.id, avtalstyp, enligt_avtal, diarienummer, startdate, enddate, status, motpartstyp, sbk_avtal.ansvarig_avd.namn as ansvarig_avd, avtalstecknare.first_name || ' ' || avtalstecknare.last_name as \"Avtalstecknare\", ansvarig_sbk.first_name || ' ' || ansvarig_sbk.last_name as \"ansvarig_sbk\", avtalskontakt.first_name || ' ' || avtalskontakt.last_name as \"Avtalskontakt\", ansvarigsbk.first_name as \"Ansvarig SBK - Förnamn\", ansvarigsbk.last_name as \"Ansvarig SBK - efternamn\", ansvarigsbk.epost as \"Ansvarig SBK - epost\", data.first_name as \"datakontakt förnamn\", data.last_name as \"datakontakt efternamn\", data.epost as \"datakontakt epost\", kontakt.last_name as \"Avtalskontakt efternamn\", orgnummer, (select string_agg(beskrivning, ', ') from sbk_avtal.avtalsinnehall left join sbk_avtal.map_avtal_innehall on map_avtal_innehall.avtalsinnehall_id = avtalsinnehall.id where avtal.id = map_avtal_innehall.avtal_id) as avtalsinnehall from sbk_avtal.avtal left join sbk_avtal.person data on data.id=sbk_avtal.avtal.datakontakt left join sbk_avtal.person kontakt on kontakt.id=sbk_avtal.avtal.avtalskontakt left join sbk_avtal.person ansvarigsbk on ansvarigsbk.id=sbk_avtal.avtal.ansvarig_sbk left join sbk_avtal.person avtalstecknare on avtalstecknare.id=sbk_avtal.avtal.avtalstecknare left join sbk_avtal.person avtalskontakt on avtalskontakt.id=sbk_avtal.avtal.avtalskontakt left join sbk_avtal.person ansvarig_sbk on ansvarig_sbk.id=sbk_avtal.avtal.ansvarig_sbk left join sbk_avtal.ansvarig_avd on sbk_avtal.ansvarig_avd.id = sbk_avtal.avtal.ansvarig_avd;";
            using (var da = new NpgsqlDataAdapter(sqlquery, conn))
            {
                da.Fill(ds);
            }

            var avdelningsquery = "select namn from sbk_avtal.ansvarig_avd;";
            using (var cmd = new NpgsqlCommand(avdelningsquery, conn))
            {
                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        avdelningar.Add(reader.GetString(0));
                    }
                }
            }

            var medarbetarequery = "select person.id, person.first_name, person.last_name from sbk_avtal.medarbetare_sbk left join sbk_avtal.person on sbk_avtal.medarbetare_sbk.person_id = sbk_avtal.person.id;";
            using (var cmd = new NpgsqlCommand(medarbetarequery, conn))
            {
                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        medarbetare.Add(new Person
                        {
                            id        = reader.GetInt32(0),
                            FirstName = reader.GetString(1),
                            LastName  = reader.GetString(2),
                        });
                    }
                }
            }
        }
        dt = ds.Tables[0];

        // filtrerar bort inaktiva avtal från AvtalTableDataSource, men behåller dem i "OriginalDataSource
        Session.Add("OriginalDataSource", dt);
        dt = dt.AsEnumerable()
             .Where(row => row.Field <string>("status") == "Aktivt")
             .CopyToDataTable();

        Session.Add("AvtalTableDataSource", dt);

        AvtalTable.DataSource = dt;

        AvtalTable.DataBind();

        // filtrerings-rullistor
        avdelningdd.Items.Add("Alla avdelningar");
        medarbetaredd.Items.Add("Alla");

        foreach (var avd in avdelningar)
        {
            avdelningdd.Items.Add(avd);
        }

        for (int i = 0; i < medarbetare.Count; i++)
        {
            var person = medarbetare[i];
            person.dropdownindex = i + 1;
            medarbetaredd.Items.Add(string.Format("{0} {1}", person.FirstName, person.LastName));
        }

        //Session.Add("AvtalTableDataSource", dt);


        Session.Add("medarbetare", medarbetare);
        Session.Add("avdelningar", avdelningar);
    }