protected void LoadEntityList <T>(DataGridView dgv, int defColumnIndex, ObjectCollection <T> list, T selected, bool needSort, bool isDefDesc, LoadRowData <T> loadRowData) where T : Objectbase
        {
            int relativeIndex = 0;

            if (dgv.CurrentRow != null)
            {
                relativeIndex = dgv.FirstDisplayedScrollingRowIndex - dgv.CurrentRow.Index;
            }

            dgv.SuspendLayout();

            dgv.Rows.Clear();
            DataGridViewColumn clmSorted = dgv.SortedColumn;
            SortOrder          ordSort   = dgv.SortOrder == SortOrder.None ? (isDefDesc ? SortOrder.Descending : SortOrder.Ascending) : dgv.SortOrder;

            DataGridViewRow selectedRow = null;

            for (int i = 0, j = list.Count; i < j; i++)
            {
                T obj = list[i];
                if (!Objectbase.IsNullOrEmpty(obj) && obj.IsViewable)
                {
                    DataGridViewRow row = dgv.Rows[dgv.Rows.Add()];
                    row.Tag = obj;
                    loadRowData.Invoke(row, obj);
                    if (obj.Equals(selected))
                    {
                        selectedRow = row;
                    }
                }
            }

            //if (ordSort == SortOrder.None)
            //    dgv.Sort(dgv.Columns[(clmSorted == null ? defColumnIndex : clmSorted.Index)], ListSortDirection.Ascending);
            //else
            if (needSort)
            {
                dgv.Sort(dgv.Columns[(clmSorted == null ? defColumnIndex : clmSorted.Index)], (ordSort == SortOrder.Ascending ? ListSortDirection.Ascending : ListSortDirection.Descending));
            }

            bool hasRows = dgv.Rows.Count > 0;

            if (null == selectedRow && hasRows)
            {
                selectedRow = dgv.Rows[0];
            }

            if (selectedRow != null)
            {
                if (selectedRow.Cells[defColumnIndex].Visible == true)
                {
                    selectedRow.Cells[defColumnIndex].Selected = true;
                }

                selectedRow.Selected = true;

                int selectedIndex = selectedRow.Index + relativeIndex;
                if (selectedIndex >= 0 && selectedIndex < dgv.Rows.Count)
                {
                    dgv.FirstDisplayedScrollingRowIndex = selectedIndex;
                }
            }
            else if (hasRows)
            {
                dgv.FirstDisplayedScrollingRowIndex = 0;
            }

            if (hasRows)
            {
                dgv.Select();
            }

            dgv.ResumeLayout(false);
        }
 protected void LoadEntityList <T>(DataGridView dgv, int defColumnIndex, ObjectCollection <T> list, T selected, LoadRowData <T> loadRowData) where T : Objectbase
 {
     this.LoadEntityList <T>(dgv, defColumnIndex, list, selected, true, false, loadRowData);
 }