/// <summary>
        /// Refreshes (databinds) the list of endorsements
        /// </summary>
        /// <returns># of endorsements bound</returns>
        public int RefreshEndorsements()
        {
            IEnumerable <Endorsement> rg = Endorsement.RemoveEndorsementsByInstructor(Endorsement.EndorsementsForUser(Student, Instructor, CurSortDirection, CurSortKey), ExcludeInstructor);

            gvExistingEndorsements.DataSource = rg;
            gvExistingEndorsements.DataBind();

            int cItems = rg.Count();

            gvExistingEndorsements.ShowHeader = cItems > 0;
            if (cItems > 0)
            {
                LinkButton lbSortDate  = (LinkButton)gvExistingEndorsements.HeaderRow.FindControl("lnkSortDate");
                LinkButton lbSortTitle = (LinkButton)gvExistingEndorsements.HeaderRow.FindControl("lnkSortTitle");
                lbSortDate.CssClass  = String.Format(CultureInfo.InvariantCulture, "headerBase{0}", CurSortKey == EndorsementSortKey.Date ? (CurSortDirection == SortDirection.Ascending ? " headerSortAsc" : " headerSortDesc") : string.Empty);
                lbSortTitle.CssClass = String.Format(CultureInfo.InvariantCulture, "headerBase{0}", CurSortKey == EndorsementSortKey.Title ? (CurSortDirection == SortDirection.Ascending ? " headerSortAsc" : " headerSortDesc") : string.Empty);
            }

            lnkDownload.Visible = !String.IsNullOrEmpty(Instructor) && cItems > 0;

            return(cItems);
        }
        protected void gvExistingEndorsements_RowCommand(object sender, CommandEventArgs e)
        {
            if (e == null || String.IsNullOrEmpty(e.CommandArgument.ToString()))
            {
                return;
            }

            int id = Convert.ToInt32(e.CommandArgument, CultureInfo.InvariantCulture);

            try
            {
                if (id <= 0)
                {
                    throw new MyFlightbookException("Invalid endorsement ID to delete");
                }

                if (e.CommandName.CompareOrdinalIgnoreCase("_DeleteExternal") == 0 && !String.IsNullOrEmpty(e.CommandArgument.ToString()))
                {
                    List <Endorsement> rgEndorsements = new List <Endorsement>(Endorsement.EndorsementsForUser(null, Page.User.Identity.Name));

                    Endorsement en = rgEndorsements.FirstOrDefault(en2 => en2.ID == id);
                    if (en == null)
                    {
                        throw new MyFlightbookException("ID of endorsement to delete is not found in owners endorsements");
                    }

                    if (en.StudentType == Endorsement.StudentTypes.Member)
                    {
                        throw new MyFlightbookException(Resources.SignOff.errCantDeleteMemberEndorsement);
                    }

                    en.FDelete();
                    RefreshEndorsements();
                }
                else if (e.CommandName.CompareOrdinalIgnoreCase("_DeleteOwned") == 0 && !String.IsNullOrEmpty(e.CommandArgument.ToString()))
                {
                    List <Endorsement> rgEndorsements = new List <Endorsement>(Endorsement.EndorsementsForUser(Page.User.Identity.Name, null));
                    Endorsement        en             = rgEndorsements.FirstOrDefault(en2 => en2.ID == id);

                    if (en == null)
                    {
                        throw new MyFlightbookException("Can't find endorsement with ID=" + id.ToString(CultureInfo.InvariantCulture));
                    }

                    if (en.StudentType == Endorsement.StudentTypes.External)
                    {
                        throw new MyFlightbookException("Can't delete external endorsement with ID=" + id.ToString(CultureInfo.InvariantCulture));
                    }

                    en.FDelete();
                    RefreshEndorsements();
                }
                else if (e.CommandName.CompareOrdinalIgnoreCase("_Copy") == 0 && !String.IsNullOrEmpty(e.CommandArgument.ToString()))
                {
                    Endorsement en = Endorsement.EndorsementWithID(Convert.ToInt32(e.CommandArgument, CultureInfo.InvariantCulture));

                    if (en == null)
                    {
                        throw new MyFlightbookException("Can't find endorsement with ID=" + id.ToString(CultureInfo.InvariantCulture));
                    }

                    if (en.StudentType == Endorsement.StudentTypes.External)
                    {
                        throw new MyFlightbookException("Can't copy external endorsement with ID=" + id.ToString(CultureInfo.InvariantCulture));
                    }

                    CopyEndorsement?.Invoke(this, new EndorsementEventArgs(en));
                }
            }
            catch (MyFlightbookException ex)
            {
                lblErr.Text = ex.Message;
            }
        }